Alex 的 Hadoop 菜鸟教程: 第15课 Impala 安装使用教程

声明:

  • 本文基于Centos 6.x + CDH 5.x

硬件要求

Impala的使用是有硬件要求的!我第一次见到有硬件要求的,那就是你的CPU必须支持SSSE3,如果你的CPU较老,不支持SSSE3 (3个S),那么你只能找别的机器来学习Impala,因为虚拟机也没有办法给你虚拟出不同的CPU。

为什么用 Impala

因为Hive 太慢了!Impala 也可以执行SQL,但是比Hive的速度快很多。为什么Impala可以比Hive快呢?因为Hive采用的是把你的sql转化成hadoop 的 MapReduce任务的代码,然后编译,打包成jar包,并分发到各个server上执行,这是一个相当慢的过程。而Impala根本就不用Hadoop的MapReduce机制,直接调用HDFS的API获取文件,在自己的内存中进行计算。

但是Impala也并不是完全比Hive好。Impala的容错机制没有Hive好,而且没有Hive那么成熟。所以一般使用以下方法来决定使用哪个

  • 如果是ETL任务使用Hive
  • 如果是实时的热查询则用Impala

安装Impala

安装

安装Impala的前提是安装了Hive,因为Impala直接使用Hive的metastore服务内存储的映射表来查询。这边不会重复的讲如何安装Hive的metastore,因为之前的课程中已经讲过,见Alex
的 Hadoop 菜鸟教程: 第10课 Hive 安装和使用教程

官方建议为了获得最佳的性能,请在所有的datanode上安装Impalad,也就是下面的 impala + impala-server 。在某台机器上同时装上 impala-state-store + impala-catalog

因为我只有两台机器 host1 和 host2,所以我在host1上执行

$ sudo yum install impala             # Binaries for daemons
$ sudo yum install impala-server      # Service start/stop script
$ sudo yum install impala-state-store # Service start/stop script
$ sudo yum install impala-catalog     # Service start/stop script

在host2上执行

$ sudo yum install impala             # Binaries for daemons
$ sudo yum install impala-server      # Service start/stop script

安装impala的时候会检查很多包依赖,请根据提示安装包,比如

--> Finished Dependency Resolution
Error: Package: hadoop-libhdfs-2.5.0+cdh5.2.1+578-1.cdh5.2.1.p0.14.el6.x86_64 (cloudera-cdh5)
           Requires: hadoop-hdfs = 2.5.0+cdh5.2.1+578-1.cdh5.2.1.p0.14.el6
           Installed: hadoop-hdfs-2.5.0+cdh5.3.0+781-1.cdh5.3.0.p0.54.el6.x86_64 (@cloudera-cdh5)
               hadoop-hdfs = 2.5.0+cdh5.3.0+781-1.cdh5.3.0.p0.54.el6
           Available: hadoop-hdfs-2.5.0+cdh5.2.1+578-1.cdh5.2.1.p0.14.el6.x86_64 (cloudera-cdh5)
               hadoop-hdfs = 2.5.0+cdh5.2.1+578-1.cdh5.2.1.p0.14.el6
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

这种情况下,先检查你的CDH repository ,很多情况下,并不是你没安装这个包,而是版本不对,所以建议使用 本地repo库,这样这可以保证其他组件跟hadoop之间的依赖统一,排查的步骤

  1. 检查 /etc/yum.repo.d/cloudera-cdh5.repo 是否存在
  2. 如果存在是否 enabled =1
  3. 如果enabled=1,检查url是否可以访问
  4. 如果以上都ok,那就是版本不对了,比如上面的错误是说我的 hadoop-hdfs 装的是CDH5.3 的库,而现在我本地的CDH repo是5.2 ,这一定是我以前安装hadoop-hdfs的时候没有用本地库造成的问题,现在只能重做本地库为 cdh5.3,或者暂时使用远程库,我使用了远程库

配置

把hive-site.xml, core-site.xml, hdfs-site.xml, hbase-site.xml (如果有的话) 这三个文件都拷贝到 /etc/impala/conf 下

打开 "短路读取"

所谓的短路读取,就是允许impala把一些信息存储在本地磁盘上,可以加快计算的速度。

修改 拷贝来的 /etc/impala/conf/hdfs-site.xml 增加或者修改以下项

<property>
    <name>dfs.client.read.shortcircuit</name>
    <value>true</value>
</property>

<property>
    <name>dfs.domain.socket.path</name>
    <value>/var/run/hdfs-sockets/dn._PORT</value>
</property>

<property>
    <name>dfs.client.file-block-storage-locations.timeout.millis</name>
    <value>10000</value>
</property>

注意:那个 _PORT 就是那样写的,不需要指定具体的数字。

两台机器上都建立需要的文件夹

[[email protected] run]# mkdir /var/run/hdfs-sockets/
[[email protected] run]# chown -R hdfs.hdfs /var/run/hdfs-sockets/

把 impala 加到 hadoop 和 hdfs 组里面

usermod -a -G hadoop impala
usermod -a -G hdfs impala

打开"块位置跟踪" (必须打开否则不能启动)

块位置跟踪让impala知道块文件的具体位置在哪,这个配置不打开impala就启动不起来

继续修改 hdfs-site.xml 文件但是跟前面不同的是,这回 不仅要修改 impala拷贝来的那份 hdfs-site.xml 还要修改 datanode 用的 hdfs-site.xml。

所以修改 /etc/hadoop/conf/hdfs-site.xml 和 /etc/impala/conf/hdfs-site.xml 修改或者增加以下配置

<property>
  <name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
  <value>true</value>
</property>

修改后重启datanode

打开JDBC支持

Impalad启动后会打开 21050 端口的监听,java程序可以用这个端口操作JDBC。

启动impala服务

分别启动impala的各个服务

$ sudo service impala-state-store start
$ sudo service impala-catalog start
$ sudo service impala-server start
  • Impala如果启动不起来可以去 /var/log/impala/ 目录下看启动日志
  • Impala的日志可以在 http://<hostname>:25000/logs 上查看到
  • Cloudera官方还很友善的提供了Impala的各种问题的解决方案,比如查询太慢,Join失败等

启动不起来的常见错误:

如果无法启动,并查看了/var/log/impala 下的日志并看到这样一句话

E0202 08:01:24.944171 29251 cpu-info.cc:135] CPU does not support the Supplemental SSE3 (SSSE3) instruction set, which is required. Exiting if Supplemental SSE3 is not functional...

那么你跟我一样,运行虚拟机的机器的CPU较老,还不支持SSSE3,但是运行Impala有一个硬指标,就是必须要SSSE3以上的CPU才行,这个真是没撤,虚拟机也模拟不出一个不一样的CPU,只能找别的机器来学习了

都启动好后,可以打开浏览器输入 http://host1:25000 会看到以下界面

说明安装成功了

shell安装

在客户机上安装 client shell

 sudo yum install impala-shell

配置Impala

编辑 /etc/default/impala 把 IMPALA_STATE_STORE_HOST 配置项换成 state-store服务启动的那台机器,把IMPALA_CATALOG_SERVICE_HOST配置成 catalog-service 服务启动的那台机器,在我这个例子中都是host1

IMPALA_CATALOG_SERVICE_HOST=<span style="font-family: Arial, Helvetica, sans-serif;">host1
</span>IMPALA_STATE_STORE_HOST=host1
IMPALA_STATE_STORE_PORT=24000
IMPALA_BACKEND_PORT=22000
IMPALA_LOG_DIR=/var/log/impala
IMPALA_CATALOG_SERVICE_HOST=host1

export IMPALA_STATE_STORE_ARGS=${IMPALA_STATE_STORE_ARGS:-     -log_dir=${IMPALA_LOG_DIR} -state_store_port=${IMPALA_STATE_STORE_PORT}}
IMPALA_SERVER_ARGS=" -log_dir=${IMPALA_LOG_DIR} -catalog_service_host=${IMPALA_CATALOG_SERVICE_HOST} -state_store_port=${IMPALA_STATE_STORE_PORT} -use_statestore -state_store_host=${IMPALA_STATE_STORE_HOST} -be_port=${IMPALA_BACKEND_PORT}"
export ENABLE_CORE_DUMPS=${ENABLE_COREDUMPS:-false}

如果打开DUMPS

export ENABLE_CORE_DUMPS=${ENABLE_COREDUMPS:-true}

可以生成DUMPS文件

Impala还可以利用YARN来控制对机器资源(CPU,内存,I/O等)的占用。但是需要用到 Llama。Llama这个项目被设计出来的目的就是连接YARN和Impala的,我们会在后面的课程讲解Llama

改完之后重启所有Impala打头的服务

Impala-shell的使用

使用impala-shell可以进入impall的shell命令行。下面通过一个例子来说明Impala怎么使用

建表例子

Step1

建立测试文件夹

hdfs dfs -mkdir -p /user/cloudera/sample_data/tab1 /user/cloudera/sample_data/tab2

在本地建立文本tab1.csv

1,true,123.123,2012-10-24 08:55:00
2,false,1243.5,2012-10-25 13:40:00
3,false,24453.325,2008-08-22 09:33:21.123
4,false,243423.325,2007-05-12 22:32:21.33454
5,true,243.325,1953-04-22 09:11:33

tab2.csv

1,true,12789.123
2,false,1243.5
3,false,24453.325
4,false,2423.3254
5,true,243.325
60,false,243565423.325
70,true,243.325
80,false,243423.325
90,true,243.325

把csv文件上传到hdfs

$ hdfs dfs -put tab1.csv /user/cloudera/sample_data/tab1
$ hdfs dfs -ls /user/cloudera/sample_data/tab1
Found 1 items
-rw-r--r--   1 cloudera cloudera        192 2013-04-02 20:08 /user/cloudera/sample_data/tab1/tab1.csv

$ hdfs dfs -put tab2.csv /user/cloudera/sample_data/tab2
$ hdfs dfs -ls /user/cloudera/sample_data/tab2
Found 1 items
-rw-r--r--   1 cloudera cloudera        158 2013-04-02 20:09 /user/cloudera/sample_data/tab2/tab2.csv

Step2

进入impala-shell,并建立3个表

DROP TABLE IF EXISTS tab1;
-- The EXTERNAL clause means the data is located outside the central location
-- for Impala data files and is preserved when the associated Impala table is dropped.
-- We expect the data to already exist in the directory specified by the LOCATION clause.
CREATE EXTERNAL TABLE tab1
(
   id INT,
   col_1 BOOLEAN,
   col_2 DOUBLE,
   col_3 TIMESTAMP
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/cloudera/sample_data/tab1';

DROP TABLE IF EXISTS tab2;
-- TAB2 is an external table, similar to TAB1.
CREATE EXTERNAL TABLE tab2
(
   id INT,
   col_1 BOOLEAN,
   col_2 DOUBLE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/cloudera/sample_data/tab2';

DROP TABLE IF EXISTS student;
CREATE TABLE student
(
   id INT,
   name STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
  • 前两个表是基于之前上传的文件的外部表
  • 第三个表建立了一个空表,存储位置就是 hive 的 hive.metastore.warehouse.dir,依旧是用LOAD DATA方法加载数据
  • 因为Impala是对hive的优化,所以impala的数据是直接存在hive上的,确保impala有对 hive.metastore.warehouse.dir 的写权限,如果没有就把impala加到hive这个组里面

然后你就可以用 select语句测试下查询结果了

[xmseapp03:21000] > select * from tab1;
Query: select * from tab1
+----+-------+------------+-------------------------------+
| id | col_1 | col_2      | col_3                         |
+----+-------+------------+-------------------------------+
| 1  | true  | 123.123    | 2012-10-24 08:55:00           |
| 2  | false | 1243.5     | 2012-10-25 13:40:00           |
| 3  | false | 24453.325  | 2008-08-22 09:33:21.123000000 |
| 4  | false | 243423.325 | 2007-05-12 22:32:21.334540000 |
| 5  | true  | 243.325    | 1953-04-22 09:11:33           |
+----+-------+------------+-------------------------------+
Fetched 5 row(s) in 6.91s

Impala还可以调用写好的.sql文件

Step1

建立一个文本 customer.dat

1|AAAAAAAABAAAAAAA|980124|7135|32946|2452238|2452208|Mr.|Javier|Lewis|Y|9|12|1936|CHILE||Javie
[email protected]|2452508|
2|AAAAAAAACAAAAAAA|819667|1461|31655|2452318|2452288|Dr.|Amy|Moses|Y|9|4|1966|TOGO||[email protected]
Ovk9KjHH.com|2452318|
3|AAAAAAAADAAAAAAA|1473522|6247|48572|2449130|2449100|Miss|Latisha|Hamilton|N|18|9|1979|NIUE||
[email protected]|2452313|
4|AAAAAAAAEAAAAAAA|1703214|3986|39558|2450030|2450000|Dr.|Michael|White|N|7|6|1983|MEXICO||Mic
[email protected]|2452361|
5|AAAAAAAAFAAAAAAA|953372|4470|36368|2449438|2449408|Sir|Robert|Moran|N|8|5|1956|FIJI||Robert.
[email protected]|2452469|

然后上传到hdfs上

hdfs dfs -put costomer.dat /user/hive/tpcds/customer/

然后我们写一段sql 名叫 customer_setup.sql

--
-- store_sales fact table and surrounding dimension tables only
--
create database tpcds;
use tpcds;

drop table if exists customer;
create external table customer
(
    c_customer_sk             int,
    c_customer_id             string,
    c_current_cdemo_sk        int,
    c_current_hdemo_sk        int,
    c_current_addr_sk         int,
    c_first_shipto_date_sk    int,
    c_first_sales_date_sk     int,
    c_salutation              string,
    c_first_name              string,
    c_last_name               string,
    c_preferred_cust_flag     string,
    c_birth_day               int,
    c_birth_month             int,
    c_birth_year              int,
    c_birth_country           string,
    c_login                   string,
    c_email_address           string,
    c_last_review_date        string
)
row format delimited fields terminated by '|'
location '/user/hive/tpcds/customer.dat';

Step2

然后这样子去执行

impala-shell -i localhost -f customer_setup.sql

hive能做的事情impala都可以做,我就说说hive做不到但是Impala可以做到的事情

单条插入外部分区表的数据

hive不支持 insert into ...values...这样的单条插入,具体原因未可知,但是Impala支持! Impala甚至可以向外部分区表插入数据!

Step1

建立hdfs的测试数据

$ hdfs dfs -mkdir -p /user/impala/data/logs/year=2015/month=01/day=01/host=host1
$ hdfs dfs -mkdir -p /user/impala/data/logs/year=2015/month=02/day=22/host=host2

并上传文本文件a.txt

1,jack
2,michael

和b.txt

3,sara
4,john
hdfs dfs -put /root/a.txt /user/impala/data/logs/year=2015/month=01/day=01/host=host1
hdfs dfs -put /root/b.txt /user/impala/data/logs/year=2015/month=02/day=22/host=host2

Step2

创建外部分区表

create external table logs (id int, name string)
  partitioned by (year string, month string, day string, host string)
  row format delimited fields terminated by ','
  location '/user/impala/data/logs';

Step3

手动添加这两个分区

alter table logs add partition (year="2015",month="01",day="01",host="host1");
alter table logs add partition (year="2015",month="02",day="22",host="host2");

Step4

查询一下表

select * from logs

插入一条数据

insert into logs partition (year="2015", month="01", day="01", host="host1") values (6,"ted");

再查一下

select * from logs;

Impala的Java调用

选择JDBC驱动

接下来你需要选择JDBC驱动,这部分因为情况复杂,我就直接翻译官方文档的原文了:

  • 对于Impala 2.0 以及以后的版本, 你需要在 Hive0.13 JDBC驱动 和 Cloudera JDBC 驱动之间选择。
  • 如果你在项目中已经用了早期版本的Impala的JDBC, 你需要升级你的JDBC到上面提到的两个驱动中的一个, 因为之前你只能用Hive 0.12 驱动,但是这个驱动是不兼容 Imala2.0 及以上版本的。
  • 你可以用linux的包管理器(在Centos上就是yum)来安装 Hive JDBC 驱动(包名叫  hive-jdbc)。
  • 你也可以从Cloudera的官网上下载Cloudera JDBC 2.5驱动
  • 两种驱动都可以提供稳定的速度提升(也就是说想用哪种看心情!说了跟没说一样

从我自己的角度,我一般选择能从Maven上直接依赖的那种,所以我选择 Hive0.14的JDBC驱动包

<dependency>
	<groupId>org.apache.hive</groupId>
	<artifactId>hive-jdbc</artifactId>
	<version>0.14.0</version>
</dependency>
<dependency>
	<groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-common</artifactId>
	<version>2.2.0</version>
</dependency>

另外,github上还有一个Impala的Maven模板项目,大家可以借鉴一下 Cloudera-Impala-JDBC-Example

例子

上次讲Hive的教程   Alex 的 Hadoop 菜鸟教程: 第11课 Hive的Java调用 建立的项目可以直接继续用

只需要把 HiveJdbcClient 这个类复制一份叫 ImpalaJdbcClient,然后修改里面的jdbc地址从

Connection con = DriverManager.getConnection("jdbc:hive2://host1:10000/default", "hive", "");

改成

Connection con = DriverManager.getConnection("jdbc:hive2://host1:21050/;auth=noSasl, "", "");

为了简化例子,我把ImpalaJdbcClient简化成只有查询部分了

package org.crazycake.play_hive;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ImpalaJdbcClient {
    /**
     * 注意:hive-server2 引用的driver是 org.apache.hive.* 而 hive-server 是
     * org.apache.hadoop.hive.*
     */
    private static String driverName = "org.apache.hive.jdbc.HiveDriver";

    /**
     * @param args
     * @throws SQLException
     */
    public static void main(String[] args) throws SQLException {
        try {
            Class.forName(driverName);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.exit(1);
        }
        // Impala的默认端口是 21050
        Connection con = DriverManager.getConnection("jdbc:hive2://xmseapp03:21050/;auth=noSasl", "", "");

        Statement stmt = con.createStatement();

        // select * query
        String sql = "select * from logs";
        System.out.println("Running: " + sql);
        ResultSet res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(String.valueOf(res.getInt(1)) + "\t" + res.getString(2));
        }

    }
}

运行一下,效果是

Running: select * from logs
3	sara
4	john
6	ted
1	jack
2	michael

参考资料

时间: 2024-07-30 10:11:07

Alex 的 Hadoop 菜鸟教程: 第15课 Impala 安装使用教程的相关文章

Alex 的 Hadoop 菜鸟教程: 第16课 Pig 安装使用教程

声明 本文基于Centos 6.x + CDH 5.x Pig 有什么用 hdfs虽说是一个文件空间,但是我们每次要查看hdfs上的文件的时候都要输入一大串命令,比如一个简单的ls都需要输入 : hdfs dfs -ls / ,而且还不能cd到某个目录,这样就造成了每次ls都要带上全路径的麻烦,能不能有一个工具可以模拟linux下的shell呢?Pig就实现了这样的需求,可以直接ls,可以cd到某个目录,比如这样 grunt> ls hdfs://mycluster/user/root/.sta

Alex 的 Hadoop 菜鸟教程: 第19课 华丽的控制台 HUE 安装以及使用教程

声明 本文基于Centos 6.x + CDH 5.x HUE Hadoop也有web管理控制台,而且还很华丽,它的名字叫HUE.通过HUE可以管理Hadoop常见的组件.下面用一幅图说明HUE能管理哪些组件 除了Oozie,LDAP SAML和Solr以外,前面的课程都说过了,Oozie是一个工作流组件,在下一课讲解,LDAP是一个用户密码的管理中心,负责用户的登陆.Solr是一个全文检索的引擎,不过其实Solr也不算Hadoop系专有的,Solr在很早以前就出现了,要算的话应该算Lucene

Alex 的 Hadoop 菜鸟教程: 第4课 Hadoop 安装教程 - HA方式 (2台服务器)

声明 本文基于Centos 6.x + CDH 5.x 官方英文安装教程 http://www.cloudera.com/content/cloudera/en/documentation/cdh5/v5-0-0/CDH5-Installation-Guide/cdh5ig_cdh5_install.html 本文并不是简单翻译,而是再整理 如果没有yum源请参考http://blog.csdn.net/nsrainbow/article/details/36629339#t2 准备工作 用vm

Alex 的 Hadoop 菜鸟教程: 第18课 用Http的方式访问HDFS - HttpFs 教程

声明 本文基于Centos 6.x + CDH 5.x HttpFs 有啥用 HttpFs可以干这两件事情 通过HttpFs你可以在浏览器里面管理HDFS上的文件 HttpFs还提供了一套REST 风格的API可以用来管理HDFS 其实很简单的一个东西嘛,但是很实用 安装HttpFs 在集群里面找一台可以访问hdfs的机器安装HttpFs $ sudo yum install hadoop-httpfs 配置 编辑/etc/hadoop/conf/core-site.xml <property>

Alex 的 Hadoop 菜鸟教程: 第7课 Sqoop2 导出教程

承接上节课,现在说说导出教程 检查连接 先看看有没有可用的connection 连接,如果没有就要根据上节课的方法创建一个 sqoop:000> show connector --all 1 connector(s) to show: Connector with id 1: Name: generic-jdbc-connector Class: org.apache.sqoop.connector.jdbc.GenericJdbcConnector Version: 1.99.3-cdh5.0

Alex 的 Hadoop 菜鸟教程: 第10课 Hive 入门教程

Hive 安装 相比起很多教程先介绍概念,我喜欢先动手装上,然后用例子来介绍概念.我们先来安装一下Hive 先确认是否已经安装了对应的yum源,如果没有照这个教程里面写的安装cdh的yum源http://blog.csdn.net/nsrainbow/article/details/36629339 Hive是什么 Hive 提供了一个让大家可以使用sql去查询数据的途径.但是最好不要拿Hive进行实时的查询.因为Hive的实现原理是把sql语句转化为多个Map Reduce任务所以Hive非常

Alex 的 Hadoop 菜鸟教程: 第8课 Sqoop1 安装/导入/导出教程

靠!sqoop2的文档太少了,而且居然不支持Hbase,十分简陋,所以我愤而放弃Sqoop2转为使用Sqoop1,之前跟着我教程看到朋友不要拿砖砸我,我是也是不知情的群众 卸载sqoop2 这步可选,如果你们是照着我之前的教程你们已经装了sqoop2就得先卸载掉,没装的可以跳过这步 $ sudo su - $ service sqoop2-server stop $ yum -y remove sqoop2-server $ yum -y remove sqoop2-client 安装Sqoop

Alex 的 Hadoop 菜鸟教程: 第8课 Sqoop1 导入 Hbase 以及 Hive

继续写,其实mysql 导入导出 hdfs 对于实际项目开发没啥用的,但是那个可以拿来入门.今天写跟Hbase和Hive的协作.我突然发现我的教程写的顺序很凌乱啊,没有先介绍Hive 的安装,这点向大家道歉,我后面补上. 数据准备 mysql 在mysql 里面建立表 employee 并插入数据 CREATE TABLE `employee` ( `id` int(11) NOT NULL, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) E

Alex 的 Hadoop 菜鸟教程: 第21课 不只是在HBase中用SQL:Phoenix

声明 本文基于 Centos6.x + CDH5.x 什么是Phoenix Phoenix的团队用了一句话概括Phoenix:"We put the SQL back in NoSQL" 意思是:我们把SQL又放回NoSQL去了!这边说的NoSQL专指HBase,意思是可以用SQL语句来查询Hbase,你可能会说:"Hive和Impala也可以啊!".但是Hive和Impala还可以查询文本文件,Phoenix的特点就是,它只能查Hbase,别的类型都不支持!但是也