`
joerong666
  • 浏览: 409826 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

impala v0.3使用和配置

 
阅读更多

一、Impala介绍

Cloudera Impala提供了快速,交互式的针对存储在hadoop(hdfs和hbase)上的数据的查询方案。impala采用了和hive相同的元数据、SQL语法(Hive SQL)、ODBC驱动程序和用户接口(HUE Beeswax),这样在使用CDH产品时,批处理和实时查询的平台是统一的。

Cloudera Impala是另外一个支持大数据查询的工具,但它并不是取代Hive

这种构建在mapreduce上的批量处理框架。hive和其他类似构建在mapreduce上的批处理框架还是非常适用于那种长时间运行的,比如ETL类型的作业。

1、Impala优势

l  支持大家都非常熟悉的类SQL语法结构

l  提供对存储在hadoop中(hdfs和hbase)数据交互式的查询

l  Single system for big data processing and analytics so customers can avoid costly modeling and ETL just for analytics

2、Impala工作原理图

Impala主要是对存储在hdfs和hbase中数据进行实时查询,由于impala采用和Hive一致的元数据结构,所以impala的元数据管理沿用了Hive元数据管理机制,安装impala的时候就必须要安装Hive。

3、Impala组件构成:

l  Impala State Store:运行statestored进程,用于存储集群中的impalad进程的状态信息,这些信息用于在分布式环境中快速的查询数据响应查询请求。

l  Impalad:运行在DataNode节点上,主要用于协调和执行查询,每一个impalad实例都能接受、并有效的协调来自ODBC或者impala shell的查询请求。另外,impalad进程还可以以一个worker的角色来执行由其他impalad进程发起的分布式并行查询。

l  Impala-shell:使用Impala-shell可以进行impala查询或任务管理,例如connect impalad等。

4、Impala执行查询的处理步骤如下:

a)       用户的Applications通过ODBC驱动程序执行查询时,首先要连接到集群中的某一个impalad进程上,然后由这个impalad进程来协调和发起分布式查询请求。

b)       Impala接收到这个查询请求后会对其进行解析,并分析以确定需要由集群中的一个或者多个imapald进程实例来执行查询请求。查询的时候会根据执行计划选择最优的查询方式。

c)       由选中的每一个impalad进程提供本地化的访问查询hdfs和hbase数据服务

d)       每一个选中的impalad进程将查询到的数据返回给发起分布式查询的impalad进程,该impalad进程汇总这些数据后,最后返回个客户端。

5、Impala主要特性:

l  支持大部分基于SQL-92标准的Hive QL语法功能,包括select, joins, 和aggregate 函数等。

l  支持查询以以下存格式储和压缩的hdfs和hbase文件:

  • hdfs存储格式:TextFile, SequenceFile
  • 压缩格式:Snappy, GZIP, BZIP

l  统一的Hive查询接口:

  • ODBC驱动程序
  • Hue Beeswax

l  Impala命令行接口

l  Kerberos授权方式

二、Impala软件要求

l  Red Hat Enterprise Linux (RHEL)/CentOS 6.2 (64-bit)

l  CDH 4.1.0 or later

l  Hive

l  MySQL

注意:Impala不支持在Debian/Ubuntu, SuSE, RHEL/CentOS 5.7系统中安装。

三、Impala硬件要求

在Join查询过程中需要将数据集加载内存中进行计算,因此对安装Impalad的内存要求较高。

四、Impala运行账号说明??

Impala不推荐运行在root账号下,因为impala最优的性能是通过使用直接读,而root账号是没有权限使用直接读的。因此用root账号运行impala会限制impala的性能。

五、Impala安装说明

两种安装方式:

1、  伪分布式安装:只安装一个impala节点。

2、  分布式安装:在集群中安装多个impala节点形成一个分布式的impala环境。为了获得最佳的性能,推荐在所有的DataNode节点上都安装impala。

 

Hive安装说明:

由于impala的metastore依赖于hive的metastore,所以必须安装hive。

 

注意:建议不要将impala安装在NameNode节点,因为执行查询的时候可能会和NameNode争抢内存资源,从而导致对NameNode造成负面影响。

六、Impala配置说明

目前impala的配置文件包括hive-site.xml、core-site.xml、hdfs-site.xml,为了获得impala

最优的性能,需要配置以下几个参数:

1、  block location tracking(数据块位置跟踪):启用了data block位置跟踪,那么impala就能快速定位data block在磁盘中位置,从而更好地利用底层磁盘。

要启用数据块位置跟踪,需要在hdfs-site.xml增加以下配置:

2、  short-circuit reads(短路读):针对本地数据,如果启用了short-circuit reads,impala就能直接读取文件系统的数据,这样就避免需要与DataNode的通信。此设置也最大限度地减少了额外的数据副本。

要启用short-circuit reads,需要在core-site.xml文件中新增以下配置:

在hdfs-site.xml配置文件中增加:

3、  native check-summing(本地校验和):如果启用native check-summing,那么impala会使用一个优化的native check-summing库来提升impala的性能。这个库文件在impala安装路径的lib目录下:libhadoop.so。

 

查看impalad进程的配置项信息:

1、  通过http://<hostname>:<port>/varz来查看impalad的配置项信息,其中hostname和port是安装impalad服务的主机名和端口号,端口号默认是25000。

七、Impala启动参数

Statestored进程启动参数:

Impalad进程的启动参数:

>GLOG_v=1 nohup impalad -state_store_host=mr5 -nn=mr5 -nn_port=9000 -hostname=mr6 -ipaddress=10.28.169.113 &

 

参数

描述

说明

是否必须

-ipaddress 安装Impalad进程的主机ip

 

默认值:127.0.0.1
-state_store_host 安装statestored进程的主机名称 默认值:127.0.0.1.
-state_store_port statestored进程服务端口号 默认值:2400
-nn HDFS的NN的主机名或者IP地址  
-nn_port HDFS的NN的服务端口号  
-be_port Impala的内部服务端口号 默认值:22000
-fe_port Impala的前端端口,用于外部连接 默认值:21000
-log_filename 指定impala的运行日志路径和文件名  
-webserver_interface 用于监控调试的web server接口 默认值:0.0.0.0
-webserver_port Impala监控调试的web server端口号 默认值:25000
-web_log_bytes 监控页面显示的最大日志信息数据量 默认值:1048576

 

Impala各种端口号说明:

进程

服务说明

端口号

访问请求

说明

Impala

守护进程

Impalad进程后台服务端口 22000 内部访问 提供后台处理服务
Impalad进程外部服务端口 21000 外部访问 提供查询等命令行操作等服务
Impalad进程HTTP服务端口 25000 外部访问 提供impalad调试跟踪服务
Impala

StateStore

守护进程

StateStore订阅服务端口号 23000 内部访问 提供StateStore的订阅服务
StateStore HTTP 服务端口号 25010 外部访问 提供StateStore调试跟踪服务
StateStore服务端口 24000 内部访问 提供对impalad进程的服务

 

八、Impala提供的功能

1、命令行功能

命令

描述

备注

connect 连接Impala节点 connect mr8:21000
describe 查看表结构 describe tab1
explain 解析SQL语句 explain select * from tab..
help 帮助命令,查看命令的说明 help connect
insert 插入数据命令 insert overwrite

insert into

quit 退出命令  
refresh 刷新源数据库  
select 查询语句命令  
set 设置impala查询选项  
shell 执行本地linux命令  
show 查看表和数据库命令  
use 选择使用数据库  
version 查看Impala版本  

 

set命令参数说明:

参数

默认值

PARTITION_AGG false
NUM_SCANNER_THREADS 0
MAX_IO_BUFFERS 0
MAX_SCAN_RANGE_LENGTH 0
NUM_NODES 0
DISABLE_CODEGEN false
MAX_ERRORS 0
ABORT_ON_ERROR false
BATCH_SIZE 0
ALLOW_UNSUPPORTED_FORMATS false

 

2、当前支持的语言元素

Impala的查询语言是基于Hive的HiveQL,目前impala不支持针对表和分区的DDL,但是支持DML。其实大部分的HiveQL不需要修改就可以在impala上面执行的,包括JOIN, AGGREGATE, DISTINCT, UNION ALL, ORDER BY, LIMIT 和subquery等等。

(1)、select

l  数据类型: boolean, tinyint, smallint, int, bigint, float, double, timestamp, string

l  DISTINCT

l  FROM 子句支持子查询.

l  WHERE, GROUP BY, HAVING

l  ORDER BY,但是需要和limit一起使用

l  JOINS: Left、 right、 semi、 full and outer

l  UNION ALL

l  LIMIT

l  External tables

l  关系运算符:>、<、=等

l  算术运算符:加法、减法等

l  逻辑boolean操作符:and、or、not,但是impala不支持对应的&&、||、!

l  COUNT, SUM, CAST, LIKE, IN, BETWEEN, 和COALESCE

 

说明:

l  Join的时候大表一定要放在左边

l  Join subsequent tables according to which table has the most selective filter. Joining the

table with the most selective filter results in the fewest number of rows are being returned.

 

(2)、insert

当前版本的impala,insert只支持已经创建好的表和分区。所有表和分区结构的创建和修改只能通过HIVE来完成。

现在支持的insert包括:

l  INSERT INTO

l  INSERT OVERWRITE

说明:

Insert命令可能会导致Hive的元数据发送改变,所以在使用impala执行查询时最好先执行一下refresh命令刷新一下hive元数据。

 

(3)、refresh

为了准确地响应查询,impala必须要知道当前Hive中数据库的所有元数据,这样impala的客户端才能够直接进行正确查询。因此,如果使用impala客户端进行的一些操作修改hive的元数据后,最好impala的每一个节点都重新refresh,保证元数据是最新的。但是并不是所以的impala操作都需要refresh元数据。

在以下几种情况下impalad实例需要refresh元数据:

l  当前impalad实例修改了元数据

l  其他比如hive或者其他的impalad实例修改了元数据

l  通过impala-shell命令行或者ODBC驱动程序连接impala进行的操作导致数据库发生改变

Impalad实例不需要refresh的情况:

l  当集群中只有一个impalad实例的时候,即使这个实例修改了元数据,该impalad实例会自动更新自己的数据库元数据信息。这种情况下是不需要refresh的。

l  如果被修改元数据的数据库是一个后台数据库,也即impalad实例不需要连接该数据库以获得元数据的数据库,这种情况下也是不需要refresh的。

Hive元数据被修改的典型情况包括:

l  通过Hive进行了ALTER, CREATE, DROP 或 INSERT操作

l  通过impalad进行了INSERT操作

l

(4)、DESCRIBE

l  DESCRIBE tableName:列出表的结构信息

 

(5)、SHOW

l  SHOW TABLES :列出所有的表

l  SHOW DATABASES :列出所有的数据库

l  SHOW SCHEMAS :列出所有的schema

 

(6)、USE

l  USE DATABASE

3、不支持的语言元素

当前发布版的impala不支持的HiveQL包括:

l  DDL:CREATE、ALTER、 DROP

l  数据类型:maps,、arrays、structs

l  以LOAD的方式加载数据

l  用户自定义函数(UDFs),不支持定制文件格式和SerDes(复合类型??)

l  XML和JSON函数

l  用户自定义Aggregate函数(UDAFs)

l  用户自定义Table Generating函数(UDTFs)

l  Sampling

l  Lateral Views

l  SHOW PARTITIONS

l  SHOW TABLE EXTENDED

l  SHOW TBLPROPERTIES

l  SHOW FUNCTIONS

l  SHOW INDEXES

l  SHOW COLUMNS

l  SHOW CREATE TABLE

l  DESCRIBE DATABASE

l  DESCRIBE COLUMN

l  IMPORT TABLE 和EXPORT TABLE

l  根据角色进行授权

九、Impala监控

1、statestored进程监控:

通过http://<hostname>:<port>来查看statestored的启动信息,其中hostname和port

是安装statestored进程服务的主机名和端口号,端口号默认是25010。

监控页面目录如下:

 

(1)、http://<hostname>:<port>/jsonmetrics json格式集群监控信息的,如下所示:

 

(2)、http://<hostname>:<port>/logs statestored进程运行的日志信息,如下图所示:

 

(3)、http://<hostname>:<port>/metrics中列出了已经启动的impalad进程的主机ip和端口号

 

(4)、http://<hostname>:<port>/subscriptions中列出了已经启动的需要从statestore节点获取状态信息impalad进程的主机ip和服务端口号,如下图所示:

 

(5)、http://<hostname>:<port>/varz可以查看statestored进程的配置项信息

2、Impalad进程监控:

通过http://<hostname>:<port>来查看impala的启动信息,其中hostname和port

是安装impalad进程服务的主机名和端口号,端口号默认是25000。

监控页面目录如下:

(1)、http://<hostname>:<port>/backends中列出了已经启动的impalad进程的主机ip和端口号,如下所示:

 

(2)、http://<hostname>:<port>/catalog中能列出了当前集群中所有已经建的表,如下所示:

 

(3)、http://<hostname>:<port>/logs中能查看当前主机impalad进程执行查询的INFO日志信息

(4)、http://<hostname>:<port>/metrics中能查看集群执行查询的调度情况,如下所示:

 

(5)、http://<hostname>:<port>/queries中能查看到集群当前所有正在执行的查询的状态信息,如下所示:

 

(6)、http://<hostname>:<port>/sessions中能查看到集群当前所有的数据库信息,如下所示:

 

(7)、http://<hostname>:<port>/varz中能查看当前主机启动的impalad进程的配置项信息

十、impala v0.3 beta release版本中存在的问题

1、如果hive的临时配置文件被删除了,impala在刷新metastore的时候会失败

受Hive的bug HIVE_3596的影响,如果hive的临时配置文件被删除掉, impala在刷新metastore的时候会失败。但是,impala-shell却会错误的提示本该失败的数据已经刷新成功。

严重性:中

预计解决:未来版本中解决

规避方法:重启impalad服务。查看impalad日志来检查元数据是否刷新错误。

 

2、outer join查询会返回错误结果,一个outer join查询后面带order by limit可能会导致impala挂掉。

严重性:中

预计解决:未来版本中解决

规避方法:无

 

3、如果并行查询太多的话,可能会导致那种需要很长时间的查询失败

每个impala查询都会从磁盘上打开很多文件,如果同时有大量的查询,那么就可能导致查询时要求打开的文件数超过impala用户被限制的最大打开的文件数量。特别那种需要长时间运行的查询中表现的非常明显。

严重性:中

预计解决:未来版本中解决

规避方法: 手动增加impala用户能打开的文件数量:ulimit -n <new value>

 

4、目前还不支持的DDL包括CREATE/ALTER/DROP 表

严重性:中

预计解决:在下一版本中支持

规避方法:可以通过HIVE去执行这些DDL

 

5、目前的版本还不支持 RC File, Trevni and Avro

严重性:中

预计解决:未来版本中解决

规避方法:无

 

6、还不支持针对单个查询的内存消耗的限制配置

目前版本还不支持针对单个查询的内存消耗的限制配置。查询的时候,所有在JOIN子句右边的table的数据必须都要放到内存里面。如果内存不够,将会报内存溢出错误。

严重性:高

预计解决:未来版本中解决

规避方法:修改JOIN子句中大表的顺序,将大表放到JOIN子句的左边,避免占用大量内存。

 

7、还不能针对FROM子句后面join表的顺序进行优化

Impala还不能针对FROM子句后面JOIN表的顺序进行优化,如果查询的JOIN子句右边存在数据量比较大的表,会导致查询变的非常慢,甚至会导致impala挂掉。

类似:SELECT … FROM small_table JOIN large_table

严重性:中

预计解决:未来版本中解决

规避方法:修改成:SELECT … FROM large_table JOIN small_table

 

8、INSERT INTO TABLE SELECT <constant> 操作不能正常插入数据

INSERT INTO TABLE SELECT <constant>不能插入任何数据而且可能会返回一个错误

严重性:中

预计解决:未来版本中解决

规避方法:修改成:

INSERT INTO TABLE <table-name> SELECT (<list of constants>) FROM some_table LIMIT 1 ,其中some_tabl至少有一条记录

 

9、INSERT INTO … SELECT 的select查询中如果没有指定目标表的列或者没有指定全部的列,impala不会提示语法错误。

INSERT INTO … SELECT 的select查询中如果没有指定目标表的列或者没有指定全部的列,impala不会提示语法错误。只会给出一个查询失败的错误信息:Invalid query handle

严重性:低

预计解决:未来版本中解决

规避方法:这是一个无效的无法错误,只要在SELECT子句后面将目标表所有的列列出来就可以解决这个问题。

 

10、在分布式环境中执行INSERT INTO TABLE SELECT <constant> FROM <table> LIMIT 1语句时不能正确执行

在分布式环境(查询选项 num_nodes > 1)中执行INSERT INTO TABLE SELECT <constant> FROM

<table> LIMIT 1语句时,将产生错误的结果,插入的数据可能会大于1条。

严重性:低

预计解决:未来版本中解决

规避方法:要执行类似的SQL,可以先在客服端命令行中先set num_nodes=1,构造一个伪分布式环境来执行,执行完成后,最好重新set num_nodes=0,这样后续的查询才能进行优化查询。

 

11、在分布式环境中还不支持 UNION ALL

在分布式环境下impala还不支持 UNION ALL。

严重性:中

预计解决:未来版本中解决

规避方法:可以先在客服端命令行中先set num_nodes=1,构造一个伪分布式环境来执行 UNION ALL,或者先将每一个 UNION ALL操作的结果插入到临时表中去。

 

12、查询选项PARTITION_AGG还不能用。

如果设置PARTITION_AGG为TRUE,会导致impala解析查询语句的时候产生一个错误的执行计划。

严重性:低

预计解决:未来版本中解决

规避方法:不要设置PARTITION_AGG为TRUE。

 

13、Impala does not handle view fs:// mounts properly

Impala does not properly handle viewfs:// mounts, causing it to fail on a federated environment.

严重性:中

规避方法: Impala core-site.xml and hdfs-site.xml files can be modified to specify the

target NameNode rather than the viewfs:// mount.

 

14、impala是通过命令行来读取 NameNode主机 ip 和 端口的

Impala 获取 NameNode ip 和 端口不是从配置文件core-site.xml获取到的,而是impalad进程在启动的时候在命令行指定的 ,这样的话,修改了 NameNode 的ip 或者 端口,就必须要重启impalad进程。

严重性:低

规避方法:命令行重启impalad进程的时候通过-nn 和-nn_port重新指定NameNode 的ip 和 端口。如果是 Cloudera Manager 安装的impala,其实是不存在这个问题的。

 

15、对NULL有限支持。

impala对NULL支持受限,不能用于比较操作,比如NULL=’A’,但是IS NULL / IS NOT NULL是没问题的。

严重性:低

规避方法:请使用IS NULL 或 IS NOT NULL吧

 

16、 Impala INSERT OVERWRITE … SELECT behavior differs from Hive in that partitions are only deleted/re‐written if the SELECT statement returns data

Impala INSERT OVERWRITE … SELECT behavior differs from Hive in that the partitions are only deleted or rewritten if the SELECT statement returns data. Hive always deletes the data.

严重性:低

规避方法:无

 

17、和hive不一样的地方: 使用 float/double 越界的时候将返回这些类型的最大值,而Hive返回的是NULL。

严重性:低

规避方法:无
18、和hive不一样的地方:Impala没有做string 、 numeric 和 boolean 类型之间的隐式转换。

严重性:低

预计解决:无

规避方法:请使用显式的转换。
19、查询的时候按某个string类型的列进行order by,如果该列中的值存在空的情况,那边该查询不会返回正确的结果

严重性:低

预计解决:下一版本中解决

规避方法:无

 

20、如果Hue和Impala安装在同一台服务器上,并且如果在CDH4.1里面配置Hue Beeswax用于执行impala查询的时候,         Beeswax  不能正确的识别到Hive的表,同时会报一个

Beeswax  启动错误。

严重性:高

预计解决:下一个即将发布的CDH4版中解决

规避方法:以下解决方案任选其一

(1)、安装Hue和Impala到不同的服务器上

(2)、升级到CDH4.1.2,并且在HUE的配置文件/etc/hue/hue.ini增加配置项

beeswax_meta_server_only=9004

(3)、或者CDH4.1.1版本又不想升级到CDH4.1.2,又想在一台机器上安装Hue和Impala,可以将/usr/share/hue/apps/beeswax/src/beeswax/management/commands/bee

swax_server.py 文件66行的代码“str(beeswax.conf.BEESWAX_SERVER_PORT.get()),” 替换成“’8004′, ”这样Beeswax就可以使用8004端口号了。

 

十一、Impala v0.3已解决的问题

1、表元数据加载失败,查询的时候会提示unknown table的错误

由于某些原因,impala在不能正确加载某些表的metadata时,在后面impala查询的时候又用到了这些表,则会返回一个unknown table的错误,虽然这个表是存在的。

2、A table that cannot be loaded will disappear from SHOW TABLES

3、如果hbase表在hive的metastore中记录为不是以一个外部表的方式创建的,那么impala就无法读取该hbase表

4、如果查询中包括outer join,那么该查询不能正确结果

 

十二、Impala v0.2已解决问题

1、如果子查询中包含了聚合查询,那么最好就别再join其他表了,否则可能会导致impala挂掉。例如:

2、一个带limit的insert,如果在多个impalad上面执行insert的时候,insert的记录数可能会比limit设置的限制数要大。比如:INSERT OVERWRITE TABLE test SELECT * FROM test2 LIMIT 1,插入到test表的记录数可能会大于1。

3、带limit的查询可能会失败

4、impala不支持从压缩的纯文本文件中读取数据。

5、查询hbase表的时候可能会报空指针异常

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics