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”的角色上完成。其流程如下:
用户的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技术介绍》和本文的部分内容,有兴趣的同学可以作为参考。
原文链接
干货好文,请关注扫描以下二维码:
MaxCompute 中的Code Generation技术简介相关推荐
- JAVA 中的代码生成包 CGLIB (Code Generation Library)
JAVA 中的代码生成包 CGLIB (Code Generation Library) CGLIB 是一个功能强大,高性能的代码生成包.它为没有实现接口的类提供代理,为 JDK 的动态代理提供了很好 ...
- CV:无人驾驶/自动驾驶汽车中涉及的软硬件技术(摄像头、雷达、激光雷达)、计算机视觉技术(检测、分类、跟踪、语义分割)的简介
CV:无人驾驶/自动驾驶汽车中涉及的软硬件技术(摄像头.雷达.激光雷达).计算机视觉技术(检测.分类.跟踪.语义分割)的简介 目录 无人驾驶汽车中涉及的软硬件结合相关的技术 摄像头.雷达.激光雷达 影 ...
- JIT Code Generation代码生成
JIT Code Generation代码生成 一.表达式编译 代码生成(Code Generation)技术广泛应用于现代的数据系统中.代码生成是将用户输入的表达式.查询.存储过程等现场编译成二进制 ...
- MLIR与Code Generation
MLIR与Code Generation MLIR多级中间表示 MLIR 项目是一种构建可重用和可扩展编译器基础架构的新方法.MLIR 旨在解决软件碎片问题,改进异构硬件的编译,显着降低构建特定领域编 ...
- 敏捷开发中的Code Review
敏捷开发中的Code Review 一些敏捷团队在实施敏捷开发中忙于编码.忙于Unit Test.忙于沟通.忙于Build等,虽然也有编码审核阶段,但大都浮于表面,流于形式,效果不佳.本文结合实践,介 ...
- 基于python渗透测试_Python中基于属性的测试简介
基于python渗透测试 by Shashi Kumar Raja 由Shashi Kumar Raja Python中基于属性的测试简介 (Intro to property-based testi ...
- 代码生成(Code Generation) 表达式编译
代码生成(Code Generation)技术广泛应用于现代的数据系统中.代码生成是将用户输入的表达式.查询.存储过程等现场编译成二进制代码再执行,相比解释执行的方式,运行效率要高得多.尤其是对于计算 ...
- asm(Java字节码操控框架)和 CGlib(Code Generation Library)
asm概述 asm 是一个 Java 字节码操控框架. 它能够以二进制形式修改已有类或者动态生成类.ASM 可以直接产生二进制 class 文件,也可以在类被加载入Java 虚拟机之前动态改变类行为. ...
- 中间代码生成(Intermediate Code Generation)
中间代码生成(Intermediate Code Generation) 申明语句的翻译 类型表达式 申明式语句翻译 简单赋值语句的翻译 数组引用的翻译 控制流语句的翻译 控制流语句及其SDT 布尔表 ...
最新文章
- 关于搭建fis3 工程的过程记录
- android h5可以获取设备的imei 和iccid_Android10 下获取序列号和IMEI号的权限
- VC/MFC Combo Box控件的用法
- 编程 mcq_MCQ | 8255 PPI(可编程外围接口)
- python获取列表序号_确定列表中的序列号(Python)
- .Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建
- D3 selectselectAll
- Solr(一) Solr 简介及搜索原理
- 「标签管理」用数据管理思维去管理你的日常电子化资料、文件、笔记等
- python3解析纯真ip数据库
- 如何显示或隐藏mac文件后缀名
- 苹果技术支持联系方式
- 小白也能懂的DPDK技术解析
- [BZOJ3993] [SDOI2015]星际战争(最大流+二分)
- Linu安装MySQL
- 告别第三方检测,教你用Windows自带工具检测!
- 冯氏结构、哈佛结构、超级哈佛结构之间的异同
- mdb实时同步mysql_Mysql的实时同步 - 双机互备
- Notification 完整版整合
- pc 端与移动端区分点击与拖拽事件
热门文章
- python合并视频和音频_真没想到,Python 还能实现 5 毛特效
- 【LeetCode笔记】剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
- 简易航空订票系统_四川航空APP全新升级改版,三大亮点提升订票体验
- 苏州大学计算机学院报录比,【图片】18年苏州大学计算机872考研经验分享【苏州大学研究生吧】_百度贴吧...
- mysql 日期类型比价_MySQL 日期时间类型怎么选?
- linux 文件的组织,Linux文件组织和目录结构
- 这份免费AI论文太强了,我肝了!
- 华为宣布:免费培养2000名大数据开发者!
- 微积分和概率统计有什么用?用来表白呀!
- 8位两院院士、20位长江、杰青……这个学院厉害了!