摘要: 前言 在数据库系统中的 Code Generation 技术介绍中, 我们简单介绍了一下 Code Generation 技术及其在大规模 OLAP 系统, 特别是大规模分布式 OLAP 系统中的重要性 MaxCompute 采用了 Code Generation 技术来提高计算效率在 MaxCompute
前言
在数据库系统中的 Code Generation 技术介绍中, 我们简单介绍了一下 Code Generation 技术及其在大规模 OLAP 系统, 特别是大规模分布式 OLAP 系统中的重要性 MaxCompute 采用了 Code Generation 技术来提高计算效率在 MaxCompute2.0 中, 我们又引入了基于 LLVM 的 JIT(Just In Time) Code Generation 技术结合向量化的执行引擎, 基于 SIMD 技术的执行效率优化等方式, 较之 MaxCompute 1.0,MaxCompute 2.0 在性能方便有了较大的提升, 具体可以参照 MaxCompute2.0 性能评测: 更强大更高效之上的更快速
MaxCompute 1.0 中的 Code Generation
如上图, MaxCompute 1.0 采用了静态的 Code Generation 技术, 工作主要在 MaxCompute 控制集群中名为 Executor 的角色上完成其流程如下:
用户的 SQL 语句在 Executor 上经过 Parsing 和 Optimization 之后, 生成对应的查询计划
Executor 调用 g++ 将 mapred.cpp 编译成一个动态库, 并将其下发到计算集群中的每一个 Worker 上
被调度起来的 Worker 会 Load 该动态库, 调用相应的 Process() 方法以完成计算逻辑
可以看到, 利用 Code Generation 技术, 对于每一个 SQL 来说执行时代码都是经过定制的, 因此执行效率较传统的 Volcano Model 更好但是, 其中也有一些问题
g++ 编译还是比较消耗 CPU / 内存的, 特别是当优化选项开到 O2 以上的时候特别是用户 SQL 比较复杂的情况下 (有些 SQL 在 SELECT 语句中有多达上千个表达式, 或者表达式的嵌套计算特别深入), 生成的 C++ 源文件也比较大, 编译更加耗时在实际生产中, 我们见过编译耗时数十秒, 消耗上 G 内存的情况
生成的动态库在控制集群和计算集群之间传输也会有带来一定的网络开销因为这个动态库的与 SQL 逻辑紧密相关的, 因此无法复用, 因此每个 SQL 都会经历编译, 下发的过程, 在任务提交比较频繁的情况下, 控制集群的稳定性会收到一定挑战
因为较高的编译时开销, 这种 Code Generation 的方式在处理复杂的语句加中小数据规模查询的场景, 比如 service mode 下, overhead 太大
MaxCompute 2.0 中的 Code Generation
MaxCompute 2.0 采用了基于 LLVM 的 JIT Code Generation 技术所谓 JIT, 就是程序在运行期间根据需要动态生成相应的机器指令这样, 整个 Code Generation 的工作由控制集群移交到了真正执行计算逻辑的计算集群各个 Worker 上其流程如下:
和 MaxCompute 1.0 中一样, 用户的 SQL 语句在 Executor 上经过 Parsing 和 Optimization 之后, 生成对应的查询计划
查询计划直接被发送到计算集群各个 Worker 上
MaxCompute 2.0 执行引擎的 Code Generation 模块 Load 查询计划, 并利用 LLVM C++ API 生成相应的机器码 Code Generation 模块返回一个函数指针作为调用的入口
Worker 通过调用 Code Generation 模块返回的函数指针以完成计算逻辑
与 MaxCompute 1.0 相比, MaxCompute 2.0 中 Code Generation 速度有明显提升在 1.0 中, 一个 SQL 的平均 Code Generation 耗时大概在 2-3s 左右, 这个时间在 2.0 中被缩短到 100 - 200ms 因为在 2.0 中 Code Generation 都在计算集群的 Worker 上完成, 因此相对来说减轻了控制集群的压力, 有助于 MaxCompute 控制集群的稳定性此外, 因为 MaxCompute 2.0 的执行引擎是复用的 (不因为 SQL 不同而不一样), 因此无需像 1.0 中一样, 在控制集群与计算集群之间传输动态库, 降低了控制集群与计算机群之间的网络负载
后续工作
目前, MaxCompute 2.0 的执行引擎还是以 Volcano Model 为基础只是在 Volcano Model 中各个算子之间以 Batch 模式传递数据, 并且以列式执行的方式提高执行速度基于 LLVM 的 JIT Code Generation 现在主要用在表达式计算, Streamline 等热点部分之后, 我们准备尝试 Full Stage 的 Code Generation, 类似 http://www.hyper-db.com/ 有兴趣的同学可以看看这个: http://www.vldb.org/pvldb/vol4/p539-neumann.pdf 附件中的 PDF 结合了数据库系统中的 Code Generation 技术介绍和本文的部分内容, 有兴趣的同学可以作为参考
来源: http://geek.csdn.net/news/detail/257263