与Hive类似,Impala也可以直接与HDFS和HBase库直接交互。只不过Hive和其它建立在MapReduce上的框架适合需要长时间运行的批处理任务。例如:那些批量提取,转化,加载(ETL)类型的Job,而Impala主要用于实时查询。

1. 环境

基于 使用yum安装CDH Hadoop集群 这篇文章中的集群环境,进行impala的安装。

2. 安装

在管理节点 cdh1 上安装:

  1. $ sudo yum install impala-server impala-state-store impala-catalog impala-shell -y

在 hive metastore 所在节点安装impala-state-store和impala-catalog
在datanode节点上安装:

  1. $ sudo yum install impala-server impala-shell -y

3. 配置

3.1 修改配置文件

查看安装路径:

  1. $ find / -name impala
  2. /var/run/impala
  3. /var/lib/alternatives/impala
  4. /var/log/impala
  5. /usr/lib/impala
  6. /etc/alternatives/impala
  7. /etc/default/impala
  8. /etc/impala
  9. /etc/default/impala

impalad的配置文件路径由环境变量IMPALA_CONF_DIR指定,默认为/usr/lib/impala/conf,impala 的默认配置在/etc/default/impala,修改该文件中的 IMPALA_CATALOG_SERVICE_HOSTIMPALA_STATE_STORE_HOST

  1. IMPALA_CATALOG_SERVICE_HOST=cdh1
  2. IMPALA_STATE_STORE_HOST=cdh1
  3. IMPALA_STATE_STORE_PORT=24000
  4. IMPALA_BACKEND_PORT=22000
  5. IMPALA_LOG_DIR=/var/log/impala
  6. IMPALA_CATALOG_ARGS=" -log_dir=${IMPALA_LOG_DIR} "
  7. IMPALA_STATE_STORE_ARGS=" -log_dir=${IMPALA_LOG_DIR} -state_store_port=${IMPALA_STATE_STORE_PORT}"
  8. IMPALA_SERVER_ARGS=" \
  9. -log_dir=${IMPALA_LOG_DIR} \
  10. -catalog_service_host=${IMPALA_CATALOG_SERVICE_HOST} \
  11. -state_store_port=${IMPALA_STATE_STORE_PORT} \
  12. -use_statestore \
  13. -state_store_host=${IMPALA_STATE_STORE_HOST} \
  14. -be_port=${IMPALA_BACKEND_PORT}"
  15. ENABLE_CORE_DUMPS=false
  16. # LIBHDFS_OPTS=-Djava.library.path=/usr/lib/impala/lib
  17. # MYSQL_CONNECTOR_JAR=/usr/share/java/mysql-connector-java.jar
  18. # IMPALA_BIN=/usr/lib/impala/sbin
  19. # IMPALA_HOME=/usr/lib/impala
  20. # HIVE_HOME=/usr/lib/hive
  21. # HBASE_HOME=/usr/lib/hbase
  22. # IMPALA_CONF_DIR=/etc/impala/conf
  23. # HADOOP_CONF_DIR=/etc/impala/conf
  24. # HIVE_CONF_DIR=/etc/impala/conf
  25. # HBASE_CONF_DIR=/etc/impala/conf

设置 impala 可以使用的最大内存:在上面的 IMPALA_SERVER_ARGS 参数值后面添加 -mem_limit=70% 即可。
如果需要设置 impala 中每一个队列的最大请求数,需要在上面的 IMPALA_SERVER_ARGS 参数值后面添加 -default_pool_max_requests=-1 ,该参数设置每一个队列的最大请求数,如果为-1,则表示不做限制。
在节点cdh1上拷贝hive-site.xmlcore-site.xmlhdfs-site.xml/usr/lib/impala/conf目录并作下面修改在hdfs-site.xml文件中添加如下内容:

  1. <property>
  2. <name>dfs.client.read.shortcircuit</name>
  3. <value>true</value>
  4. </property>
  5. <property>
  6. <name>dfs.domain.socket.path</name>
  7. <value>/var/run/hadoop-hdfs/dn._PORT</value>
  8. </property>
  9. <property>
  10. <name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
  11. <value>true</value>
  12. </property>

同步以上文件到其他节点。

3.2 创建socket path

在每个节点上创建/var/run/hadoop-hdfs:

  1. $ mkdir -p /var/run/hadoop-hdfs

拷贝postgres jdbc jar:

  1. $ ln -s /usr/share/java/postgresql-jdbc.jar /usr/lib/impala/lib/

3.3 用户要求

impala 安装过程中会创建名为 impala 的用户和组,不要删除该用户和组。
如果想要 impala 和 YARN 和 Llama 合作,需要把 impala 用户加入 hdfs 组。
impala 在执行 DROP TABLE 操作时,需要把文件移到到 hdfs 的回收站,所以你需要创建一个 hdfs 的目录 /user/impala,并将其设置为impala 用户可写。同样的,impala 需要读取 hive 数据仓库下的数据,故需要把 impala 用户加入 hive 组。
impala 不能以 root 用户运行,因为 root 用户不允许直接读。
创建 impala 用户家目录并设置权限:

  1. sudo -u hdfs hadoop fs -mkdir /user/impala
  2. sudo -u hdfs hadoop fs -chown impala /user/impala

查看 impala 用户所属的组:

  1. $ groups impala
  2. impala : impala hadoop hdfs hive

由上可知,impala 用户是属于 imapal、hadoop、hdfs、hive 用户组的

4. 启动服务

在 cdh1节点启动:

  1. $ service impala-state-store start
  2. $ service impala-catalog start

如果impalad正常启动,可以在/tmp/ impalad.INFO查看。如果出现异常,可以查看/tmp/impalad.ERROR定位错误信息。

5. 使用shell

使用impala-shell启动Impala Shell,连接 cdh1,并刷新元数据

  1. >impala-shell
  2. [Not connected] >connect cdh1
  3. [cdh1:21000] >invalidate metadata
  4. [cdh2:21000] >connect cdh2
  5. [cdh2:21000] >select * from t

当在 Hive 中创建表之后,第一次启动 impala-shell 时,请先执行 INVALIDATE METADATA 语句以便 Impala 识别出新创建的表(在 Impala 1.2 及以上版本,你只需要在一个节点上运行 INVALIDATE METADATA ,而不是在所有的 Impala 节点上运行)。
你也可以添加一些其他参数,查看有哪些参数:

  1. # impala-shell -h
  2. Usage: impala_shell.py [options]
  3. Options:
  4. -h, --help show this help message and exit
  5. -i IMPALAD, --impalad=IMPALAD
  6. <host:port> of impalad to connect to
  7. -q QUERY, --query=QUERY
  8. Execute a query without the shell
  9. -f QUERY_FILE, --query_file=QUERY_FILE
  10. Execute the queries in the query file, delimited by ;
  11. -k, --kerberos Connect to a kerberized impalad
  12. -o OUTPUT_FILE, --output_file=OUTPUT_FILE
  13. If set, query results will written to the given file.
  14. Results from multiple semicolon-terminated queries
  15. will be appended to the same file
  16. -B, --delimited Output rows in delimited mode
  17. --print_header Print column names in delimited mode, true by default
  18. when pretty-printed.
  19. --output_delimiter=OUTPUT_DELIMITER
  20. Field delimiter to use for output in delimited mode
  21. -s KERBEROS_SERVICE_NAME, --kerberos_service_name=KERBEROS_SERVICE_NAME
  22. Service name of a kerberized impalad, default is
  23. 'impala'
  24. -V, --verbose Enable verbose output
  25. -p, --show_profiles Always display query profiles after execution
  26. --quiet Disable verbose output
  27. -v, --version Print version information
  28. -c, --ignore_query_failure
  29. Continue on query failure
  30. -r, --refresh_after_connect
  31. Refresh Impala catalog after connecting
  32. -d DEFAULT_DB, --database=DEFAULT_DB
  33. Issue a use database command on startup.

例如,你可以在连接时候字段刷新:

  1. $ impala-shell -r
  2. Starting Impala Shell in unsecure mode
  3. Connected to 192.168.56.11:21000
  4. Server version: impalad version 1.1.1 RELEASE (build 83d5868f005966883a918a819a449f636a5b3d5f)
  5. Invalidating Metadata
  6. Welcome to the Impala shell. Press TAB twice to see a list of available commands.
  7. Copyright (c) 2012 Cloudera, Inc. All rights reserved.
  8. (Shell build version: Impala Shell v1.1.1 (83d5868) built on Fri Aug 23 17:28:05 PDT 2013)
  9. Query: invalidate metadata
  10. Query finished, fetching results ...
  11. Returned 0 row(s) in 5.13s
  12. [192.168.56.11:21000] >

使用 impala 导出数据:

  1. $ impala-shell -i '192.168.56.11:21000' -r -q "select * from test" -B --output_delimiter="\t" -o result.txt

6. 参考文章