1 背景
Apache Hive是Hadoop之上最流行的数据仓库引擎。提升Hive性能的功能可以显著提高集群资源的整体利用率。Hive使用一连串的运算符来执行查询。这些运算符包括MapTask,ReduceTask或SparkTask,它们在查询执行计划中进行调度。以前这些运算符被设计为每次处理一行数据。一次处理一行导致运算符效率不高,因为需要许多虚函数调用来处理扫描的每一行。另外,如果运算符一次只处理一行,不能利用CPU的SIMD指令集(例如SSE或AVX)进行加速。本文主要介绍如何在Hive中利用基于SIMD的优化,使Apache Parquet表的查询运行效率提升26%以上。
2 CPU矢量化
矢量化是将算法从一次操作一个值转换为一次操作一组值的过程。现在的CPU一般都直接支持矢量操作,即使用单个指令处理多个数据点(SIMD)。

上图显示了使用scalar和vector指令添加两组值的简单示例
例如,支持AVX-512指令集的CPU提供512位寄存器,与16个标量指令中的相同计算相比,它可以保存多达16个32位的值并执行简单操作如在一条指令中执行加法运算。在此示例中,矢量化(vectorized)执行将比标量(scalar )执行快16倍。
3 Hive中的矢量化
为了利用这些优化,Hive在HIVE-4160中引入了矢量化查询执行,参考:
https://issues.apache.org/jira/browse/HIVE-4160
矢量化查询执行引入了新的运算符和表达式,即每次处理一批行,而不是每次只处理一行数据。与基于行的执行相比,矢量化执行避免了大量的虚函数调用,从而提高了指令和数据缓存命中率。它更好地利用了现在的CPU(如 Intel Xeon Scalable proc

本文介绍了Apache Hive利用Parquet矢量化技术提升查询性能的方法,通过处理一批行而非一行数据,利用CPU的SIMD指令集,减少虚函数调用,提高查询效率。测试结果显示,在CDH6.0上启用Parquet矢量化,可以将查询性能提升约26.5%,尤其在处理TPC-DS查询时效果显著。
最低0.47元/天 解锁文章
210

被折叠的 条评论
为什么被折叠?



