MaxCompute 中的Code Generation技术简介

摘要: 前言       在《数据库系统中的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”的角色上完成。其流程以下:性能

  1. 用户的SQL语句在Executor上通过Parsing和Optimization以后,生成对应的查询计划。
  2. Executor上的Code Generation模块将查询计划翻译成一个名为“mapred.cpp”的C++源文件。如上图所示,查询计划中的每个Task(就是MaxCompute做业中的一个Stage)会被翻译成C++中的一个Class, 而全部的处理逻辑被生成到该Class的Process()方法当中。
  3. Executor调用g++将“mapred.cpp”编译成一个动态库,并将其下发到计算集群中的每个Worker上。
  4. 被调度起来的Worker会Load该动态库,调用相应的Process()方法以完成计算逻辑。

 

   能够看到,利用Code Generation技术,对于每个SQL来讲执行时代码都是通过定制的,所以执行效率较传统的Volcano Model更好。可是,其中也有一些问题。优化

  1. g++ 编译仍是比较消耗CPU/内存的,特别是当优化选项开到O2以上的时候。特别是用户SQL比较复杂的状况下(有些SQL在SELECT语句中有多达上千个表达式,或者表达式的嵌套计算特别深刻),生成的C++源文件也比较大,编译更加耗时。在实际生产中,咱们见过编译耗时数十秒,消耗上G内存的状况。
  2. 生成的动态库在控制集群和计算集群之间传输也会有带来必定的网络开销。由于这个动态库的与SQL逻辑紧密相关的,所以没法复用,所以每一个SQL都会经历编译,下发的过程,在任务提交比较频繁的状况下,控制集群的稳定性会收到必定挑战。
  3. 由于较高的编译时开销,这种Code Generation的方式在处理复杂的语句加中小数据规模查询的场景,好比service mode下,overhead太大。

 

MaxCompute 2.0中的Code Generation翻译

 

 

 MaxCompute 2.0采用了基于LLVM的JIT Code Generation技术。所谓JIT,就是程序在运行期间根据须要动态生成相应的机器指令。这样,整个Code Generation的工做由控制集群移交到了真正执行计算逻辑的计算集群各个Worker上。其流程以下:指针

  1. 和MaxCompute 1.0中同样,用户的SQL语句在Executor上通过Parsing和Optimization以后,生成对应的查询计划。
  2. 查询计划直接被发送到计算集群各个Worker上。
  3. MaxCompute 2.0执行引擎的Code Generation模块Load查询计划,并利用LLVM C++ API生成相应的机器码。Code Generation模块返回一个函数指针做为调用的入口。
  4. 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中同样,在控制集群与计算集群之间传输动态库,下降了控制集群与计算机群之间的网络负载。blog

 

后续工做内存

 

   目前,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技术介绍》和本文的部份内容,有兴趣的同窗能够做为参考。

 

原文连接

阅读更多干货好文,请关注扫描如下二维码:

相关文章
相关标签/搜索