摘要: 前言 在《数据库系统中的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上的Code Generation模块将查询计划翻译成一个名为“mapred.cpp”的C++源文件。如上图所示,查询计划中的每一个Task(就是MaxCompute作业中的一个Stage)会被翻译成C++中的一个Class, 而所有的处理逻辑被生成到该Class的Process()方法当中。
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技术介绍》和本文的部分内容,有兴趣的同学可以作为参考。
原文链接:https://yq.aliyun.com/articles/61608?spm=a2c41.11181499.0.0
分享到:
相关推荐
在实际应用中,C2000CodeGenerationTools5.0常用于嵌入式系统开发,特别是在需要高性能图形渲染和实时响应的场景下,如工业自动化、汽车电子、智能家居等领域。通过优化CSS3.3,开发者可以创建出更加动态和交互式的...
在Win7下调试28335,CCStudio软件的Code Generation Tools必须升级到这个版本(v5.0.2)否则就是各种报错,搞了一上午,终于搞定了
安装路径: D:\CCStudio_v3.3\C2000\cgtools (盘目录根据实际情况更改)
C2000CodeGenerationTools5_0_2.exe
本书《.NET实用代码生成 Practical_Code_Generation_in_NET》由Peter Vogel撰写,涵盖了.NET框架下的实用代码生成技术,特别关注了Visual Studio 2005、2008和2010版本。作为.NET开发领域的实用指南,书中旨在向...
Code Generation with Roslyn 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者...
6. **案例研究**:书中可能会包含多个实际案例,如数据库访问层的生成、Web服务接口的自动生成等,这些案例将帮助读者理解如何在实践中应用代码生成技术。 7. **最佳实践和注意事项**:作者可能分享了关于代码生成...
这不是一本仅限于Java的书籍,而是一本教你掌握一种技术及其在现实世界中应用的书籍,对任何软件工程师而言,无论其首选实现语言如何,都是一份宝贵的资源。 ### 本书是否适用于我的架构? 代码生成器如同额外的一...
编译原理是计算机科学中的一门重要课程,编译器的Code Generation是整个编译过程中的一个关键步骤。在这个过程中,编译器将源代码转换为目标机器上的可执行代码。Code Generation的目的是生成一个忠实地代表源代码...
CodeGeneration.Roslyn, 在构建过程中执行基于Roslyn的代码生成时,帮助 基于 的代码生成 帮助在构建过程中执行基于roslyn的代码生成。 这包括设计时支持,这样代码生成可以以通过生成新代码在文件保存到时响应更改...
"Code generation.zip" 文件提供的就是一个这样的工具,它能够自动生成相关的代码,提高开发效率,减少错误,让开发者可以更专注于业务逻辑的设计。 代码生成器的主要功能包括: 1. **数据库表对象的自动映射**:...
由于部分内容因OCR扫描技术原因,可能存在识别错误或遗漏,不过总体而言,可以从中提取到关于AUTOSAR架构定义、MathWorks公司的企业信息和其核心技术能力、Simulink和MATLAB软件的广泛应用和在AUTOSAR软件开发中的...
Simulink是MathWorks公司提供的一款基于模型的设计和仿真的工具,而Simulink Coder则是它的代码生成产品,用于将Simulink中的模型转换成可执行的C代码。NASA在其培训教材中对Simulink模型生成C代码的过程进行了详尽...
"CodeGeneration.zip" 文件显然包含了一个代码生成的工具或者模板,它专注于自动生成Entity层和Dao层,极大地提高了开发效率,避免了手动根据数据库字段编写Entity类的繁琐工作。 Entity层,也称为模型层或业务对象...
code generation library
JEECG(J2EE Code Generation)作为一个J2EE敏捷开发框架,它的出现代表了一种新的开发模式,即代码生成与手工合并的半智能开发。JEECG能够自动生成美观大方的前台页面和后台代码,不仅减少了编码工作量,还能通过...
本文将深入探讨一款名为 "leavingkv6_generation_com.gitc.essc" 的Java代码生成器,它能根据数据库中的表结构自动生成对应的实体类,从而简化开发流程。 一、代码生成器的重要性 1. 节省时间:手动编写基础的实体...
Manning+-+Code+Generation+In+Action+%282003%29.part1