Impala性能调优最佳实践

Impala性能调优最佳实践概览

1选择合适的文件格式

一般对于大数据集而言(每一个分区或者表的大小为几个G或者更大),推荐使用Parquet文件格式。由于它按列存储,单词IO能够请求更多的数据,另外它支持更好的压缩算法对二进制文件进行压缩。算法

对于小表而言(每一个分区或者表的大小小于几个G或者更小),不一样的存储格式之间没有明显的性能差异。在小数据量时,能够经过减小并行执行的机会(使用压缩文件格式),来减小的I / O。在规划生产部署或执行基准测试时,始终使用实际数据量来得到性能和扩展性的真实状况。shell

2避免数据处理过程当中产生过多小文件

对于外部的存储数据,一般的格式为文本格式或者Avro格式,这样能够按照行来构建数据文件。一旦数据要加载到Impala的表中,能够将其转换为更高效的Parquet格式,并使用单个INSERT ... SELECT语句拆分为多个数据文件。网络

使用insert…select在表与表之间拷贝数据。避免对海量数据或者影响性能的关键表使用insert…values插入数据,由于每条这样的insert语句都会产生单个的小文件。app

若是在数据处理过程当中产生了上千个小文件,须要使用insert…select来说数据复制到另一张表,在复制的过程当中也解决了小文件过多的问题。分布式

3选择合适的分区粒度

分区是一种基于一个或多个列的值物理划分数据的技术,例如按年,月,日,地区,城市等。当查询指定了具体的分区列或者分区列范围时,Impala能够避免读取不相关的数据,从而可能大大节省磁盘I / O。函数

在肯定分区列时,要选择合适的分区粒度。例如,是按照年、月、日进行分区,仍是仅按照年、月进行分区。选择分区的策略是,要保证每一个分区的数据至少为256 MB,这样能够更好地利用HDFS的IO批处理性能和Impala的分布式查询。oop

过分分区还可能致使查询计划花费的时间超过必要的时间,由于Impala会修剪没必要要的分区。理想状况下,将表中的分区数保持在3万如下。性能

在准备每一个分区目录的数据文件时,应当使用几个大文件而不是许多小文件。若是存在的数据原本就是以许多小文件的形式存在的,而且没法控制文件的格式,那么,建议使用INSERT ... SELECT语法将数据从一个表或分区复制到另外一个表或分区,这样操做会合并文件从而减小文件的数量。测试

          若是一个包含上千个分区的parquet表,每一个分区的数据都小于1G,就须要采用更大的分区粒度,只有分区的粒度使文件的大小合适,才能充分利用HDFS的IO批处理性能和Impala的分布式查询。大数据

4对分区键列使用最小的适当整数类型

一般,人们更喜欢使用字符串做为分区键列,由于这些值都变成了HDFS目录名。可是,建议使用数值类型的值做为分区键,好比年、月、日,由于这样能够减小内存的使用。一般状况下,月和日的数据类型为TINYINT,年的类型为SMALLINT。使用该EXTRACT()函数从TIMESTAMP值中提取单个日期和时间字段,并使用CAST()函数将返回值转换成适当的整数类型。

5选择合适的Parquet块大小

默认状况下,经过INSERT ... SELECT语句建立的Parquet文件的块大小为256 MB。(此默认值在Impala 2.0中已更改。之前限制为1 GB,但Impala对压缩作出了保守估计,致使文件小于1 GB。)

6收集统计信息

使用compute stats收集链接查询中海量数据表或者影响性能的关键表的统计信息。

7最大限度地减小将结果传回客户端的开销

能够考虑使用以下技术:

(1)聚合。若是须要计算知足条件的记录行数,求匹配到的行中某列的和、最大值、最小值等,不要将整个结果集发送到客户端由客户端应用来处理这些数据,而是能够调用像 COUNT()、SUM()、MAX()等汇集函数来处理,若是将整个未汇集过的数据集发送到客户端,单单将数据传送到客户端这一个动做就须要消耗很大的网络开销。

(2)过滤。使用不一样的谓词条件尽量的缩小结果集的大小,而不是把整个结果集发送到应用端,由应用来处理过滤逻辑。使用WHERE查询子句中的全部适用测试来消除不相关的行,而不是生成大的结果集并使用应用程序逻辑对其进行过滤。

(3)LIMIT子句。若是您只须要查看结果集中的不多的样本数据,或查询使用ORDER BY以后产生的最大值或者最小值,可使用LIMIT子句来最大限度的减小结果集的大小。

(4)避免对结果集进行美化输出:当经过impala-shell查询数据时,能够指定-B--output_delimiter选项输出原始的结果集,而不须要impala对输出的格式进行美化,或者直接将结果集重定向到文件中。上述的状况也能够考虑使用 INSERT ... SELECT将结果直接写入HDFS上。

8检查查询计划

在实际运行一个查询以前,使用explain查看执行计划是否以高效合理的方式运行

9查看查询的性能特征

在运行一个查询以后,使用profile命令查看IO,内存消耗,网络带宽占用,CPU使用率等信息是否在指望的范围以内。

10使用适当的操做系统设置

有关影响Impala性能的操做系统设置,请参阅Apache Hadoop发行版的文档。好比,将vm.swappiness设置为非零值能够提升总体性能。