Impala性能调优最佳实践
Impala性能调优最佳实践概览
1选择合适的文件格式
通常对于大数据集而言(每个分区或者表的大小为几个G或者更大),推荐使用Parquet文件格式。因为它按列存储,单词IO可以请求更多的数据,另外它支持更好的压缩算法对二进制文件进行压缩。
对于小表而言(每个分区或者表的大小小于几个G或者更小),不同的存储格式之间没有明显的性能差别。在小数据量时,可以通过减少并行执行的机会(使用压缩文件格式),来减少的I / O。在规划生产部署或执行基准测试时,始终使用实际数据量来获得性能和扩展性的真实情况。
2避免数据处理过程中产生过多小文件
对于外部的存储数据,通常的格式为文本格式或者Avro格式,这样可以按照行来构建数据文件。一旦数据要加载到Impala的表中,可以将其转换为更高效的Parquet格式,并使用单个INSERT ... SELECT
语句拆分为多个数据文件。
使用insert…select在表与表之间拷贝数据。避免对海量数据或者影响性能的关键表使用insert…values插入数据,因为每条这样的insert语句都会产生单个的小文件。
如果在数据处理过程中产生了上千个小文件,需要使用insert…select来讲数据复制到另外一张表,在复制的过程中也解决了小文件过多的问题。
3选择合适的分区粒度
分区是一种基于一个或多个列的值物理划分数据的技术,例如按年,月,日,地区,城市等。当查询指定了具体的分区列或者分区列范围时,Impala可以避免读取不相关的数据,从而可能大大节省磁盘I / O。
在确定分区列时,要选择合适的分区粒度。例如,是按照年、月、日进行分区,还是仅按照年、月进行分区。选择分区的策略是,要保证每个分区的数据至少为256 MB,这样可以更好地利用HDFS的IO批处理性能和Impala的分布式查询。
过度分区还可能导致查询计划花费的时间超过必要的时间,因为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
设置为非零值可以提高整体性能。