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
矢量化查