vlambda博客
学习文章列表

Impala优化十大指导原则和最佳实践

1.1  Hadoop-Impala优化十大指导原则和最佳实践

以下是性能准则和最佳做法。您可以使用在规划过程中实验,和hadoop集群一起进行impala的性能调整。所有这些信息也可在文档的其他地方更详细的impala文档;以下是优化的方法措施,强调优化调优技术提供最高的投资回报


1)       选择适当的数据文件格式


2)       避免数据摄入过程,产生许多小的文件


3)       基于实际数据量选择分区粒度


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


5)       选择一个合适的block大小


6)       收集性能关键或高容量连接查询中使用的所有表的统计数据


7)       尽量减少将结果发送给客户端的开销


8)       请确认您的查询以一种有效的逻辑方式进行计划


9)       验证查询的性能特征


10)     使用适当的操作系统设置


1.1.1  选择适当的数据文件格式

       通常,对于大量的数据(每个表或分区有很多G字节),Parquet文件格式表现最好,因其柱状存储布局相结合,大量的I/O请求的大小,和压缩编码。


看到Impala与所有支持的文件格式的Impala对比Hadoop文件格式,并采用Parquet文文件格式的详细说明,Parquet表


对于小容量的数据,几个字节或更少的每个表或分区,你可能看不到的文件格式之间的业绩差异明显。在小数据量,减少I/O的高效的压缩文件格式可以被并行执行的机会减少。当规划一个生产部署或进行基准测试时,总是使用真实的数据卷来获得性能和可扩展性的真实图像。


1.1.2  避免摄取过程产生很多年小的文件

       避免数据摄入过程,产生许多小的文件。


       当生产数据文件以外的impala,喜欢的不是文本格式或公司,在那里你可以通过建立文件排排。一旦数据在Impala,你可以将它转换成更高效的Parquet和分裂成多个数据文件中使用一个单一的插入…SELECT语句。或者,如果你有基础设施,生产多兆字节的文件作为您的地板数据准备过程的一部分,这样做,跳过转换进入impala。


       总是使用插入…选择要复制的数据从表到表内大量的impala。避免插入…数据或性能关键表的任何实质性数据量的值,因为每一个这样的语句都会产生一个单独的小数据文件。查看插入的示例的插入语句…选择语法。


       例如,如果你在Parquet有成千上万的分区,每个小于256 MB的数据,考虑在一个较低的粒度划分,如由年/月而不是年/月/日。如果一个低效的数据摄取过程产生成千上万的数据文件在同一个表或分区,考虑通过执行一个插入压缩数据…选择将所有数据复制到另一个表;这个过程将被重新组织成一个较小的较大的文件数。


1.1.3  选择合适的分区粒度

       分区是一种基于一个或多个列的值的物理上划分数据的技术,例如:年、月、日、区域、城市、网站的一部分,等等。当你发出查询请求一个特定的值或值的范围为分区键列,Impala可以避免阅读不相关的数据,可能会产生一个巨大的节省磁盘I / O.


       在决定使用哪个列(S)进行分区时,选择合适的粒度级别。例如,你应该分配一年,一个月,一天,或只有一年和一个月?选择一个分区策略,提出至少256 MB的每个分区中的数据,利用HDFS块I/O和Impala分布式查询。


       在分区也会导致查询计划需要更长的时间比必要的,如Impala修剪不必要的分区。理想情况下,保持表中的分区的数量低于3万。


       准备数据文件时,要在分区目录中,创建几个大文件,而不是许多小文件。如果您以许多小文件的形式接收数据,并没有对输入格式的控制,请考虑使用“插入”…选择语法复制数据从一个表或分区到另一个,它压缩的文件到一个相对小的数量(基于集群中的节点数)。


       如果你需要减少分区的整体数量和增加在每个分区的数据量,分区键列,很少引用或非关键查询引用第一次看(不受SLA)。例如,您的网站日志数据可能会被年、月、日和小时划分,但如果大多数查询每天都将结果卷起来,也许你只需要一年、一个月、一天的时间来划分。


       如果您需要更大的减少粒度,请考虑创建“桶”,计算对应于不同的分区键的值的计算值。例如,您可以使用trunc()功能与时间戳列组的日期和时间间隔的基础上如周或季度值。看到Impala Date和时间函数的详细信息。




1.1.4  使用最小的适当的整数类型进行分区键列

       虽然它是使用字符串的分区键列很吸引人,因为这些值可以转化为HDFS的目录名称,但是不管怎样,你可以用普通分区的关键领域如年月数值最小化内存使用,和天。使用最小的整数类型,认为适当的范围值,通常TINYINT为年月日、年和smallint。使用extract()功能拉出个别日期和时间字段的时间戳值,和cast()返回值到相应的整数类型。


1.1.5  选择一个合适的数据块大小

       默认情况下,插入的Impala…选择语句创建一个256MB的文件块大小的block。(Impala2开始更改变更为默认。从前,限为1 GB,但是Impala关于压缩的保守估计,导致小于1 GB的文件。)


       每个parquet文件写的Impala是一个块,让整个文件是由一个单一的主机单元处理。当你拷贝文件到HDFS地板之间或HDFS文件系统,使用hdfs dfs -pb保持原块的大小。


       如果只有一个或几个数据块中的表,或在一个分区,是唯一的查询访问,那么你可能会经历一个不同的理由放缓:没有足够的数据来利用Impala的并行分布式查询。每个数据块的一个重要组成部分,由一个单一的核心处理。在16个核心机器的100个节点集群中,您可能同时处理数千个数据文件。您要在“多个小文件”和“单个巨型文件”之间找到一个“小文件”和“单个巨文件”之间的一个“小文件”和“并行处理”之间的“小文件”和“并行处理”。你可以设置parquet_file_size查询选项在插入之前…SELECT语句来减少每个生成的parquet文件的大小。(指定文件大小的字节,一个绝对的数量或在Impala2后,在结束与M为千兆字节。兆字节或G单位)使用不同的文件大小的基准,找到适合您的特定数据量正确的平衡点。


1.1.6  收集性能关键或高容量连接查询中使用的所有表的统计数据

       用计算统计语句收集统计数据。查看详细信息的连接查询的性能报告。


1.1.7  尽量减少将结果发送给客户端的开销

       使用技术,如:


       汇聚。如果你需要知道一个条件匹配多少行,从一些列的总值中匹配值,最高或最低的匹配,等等,叫汇总等功能count(),sum(),并在查询结果集的max()而不是发送到应用程序和做这些计算有。记住,一个不汇聚的结果集是巨大的,通过网络传输需要大量的时间。


        过滤。在查询的其中一个子句中使用所有适用的测试,以消除不相关的行,而不是产生一个大的结果集,并使用应用程序逻辑进行过滤。


 限制条款。如果您只需要从结果集上看到一些示例值,或从查询使用顺序的顶部或底部值,包括限制条款,以减少结果集的大小,而不是要求充分的结果集。最好的就是丢掉大多数的行。


        避免过度开销。由于漂亮的打印结果并显示在屏幕上。当你检索结果通过使用Impala的外壳,外壳等选项,B和output_delimiter产生结果没有特殊的格式,并将输出重定向到文件中而不是打印到屏幕上。考虑使用插入…选择写的结果直接向HDFS的新文件。看到Impala外壳配置选项的Impala shell的命令行选项的详细信息。


1.1.8  请确认您的查询以一种有效的逻辑方式进行计划

       在实际运行之前检查一个查询的解释计划。参看性能调整部分的解释声明语句和使用解释计划的细节部分。


1.1.9  验证查询的性能特征

       验证在运行后,检查查询配置文件的查询配置文件中的低级别的I / O、内存使用、网络带宽、中央处理器利用率等方面都在预期的范围内。查看使用查询配置文件进行性能调整的详细信息。


1.1.10     使用适当的操作系统设置

       看到CDH优化性能有关的操作系统设置的建议,你可以改变影响 Impala的性能。特别是,你可能会发现,改变vm.swappiness Linux内核设置一个非零的值(5.7建议为1-10,建议为1,这个参数从早期的为0,5.3的10,目前5.7建议为1,反映一切为最佳实践为依据),提高了系统的整体性能。

————————————————