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技术介绍》和本文的部分内容,有兴趣的同学可以作为参考。

原文链接

干货好文,请关注扫描以下二维码:

图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java调用python_Python教程:17个冷门但实用的小技巧

Python是机器学习的主流语言,没有之一。今年5月,它首次在PYPL排行榜上超越JAVA,成为全球第一大编程语言。而一个月后,Stack Overflow也分享了最新的编程语言浏览量统计数字,结果显示,Python的月活历史性地超…

Hadoop精华问答 | NameNode的工作特点

我们很荣幸能够见证Hadoop十年从无到有,再到称王。感动于技术的日新月异时,让我们再来看看关于Hadoop的精华问答。1Q:NameNode的工作特点A:NameNode始终在内存中保存metedata,用于处理“读请求”,到有“写请…

五个非常实用的自然语言处理资源

摘要: 正在学习NLP,手中没有资源?快来看看这些免费的NLP学习资源吧!如果你对自然语言处理方面的资源感兴趣,请仔细阅读本篇文章。运行数据科学POC的7个步骤网上有很多依靠深度学习方法的NLP资源,有一些资源…

'umi' 不是内部或外部命令,也不是可运行的程序 或批处理文件或umi: command not found

1.#首先,需要安装Node.js (一路下一步安装),并确保 node 版本是 8.10 或以上。(mac 下推荐使用 nvm 来管理 node 版本) #安装完成后,通过node -v 命令查看其版本号 node -v2.推荐使用 yarn 管…

库函数strcpy函数的实现

strcpy指的是字符串的拷贝&#xff0c;就是把源字符串拷贝到目标空间里面 1、源字符串的拷贝是是以‘\0’结尾的&#xff0c;同时会将字符串中的’\0’拷贝过去 #include<stdio.h> int main(){char arr1[20]"xxxxxxxxxxxxx";char arr2"hello world"…

机器学习和人工智能的初学指南

摘要&#xff1a; 作者自学机器学习和人工智能&#xff0c;站在一个初学者的角度来回顾这些经历并编写这篇适合初学者的指南。我自学过一年机器学习和人工智能&#xff0c;我认为初学者在该领域还没有一个学习的途径&#xff0c;这是我创建这个指南的目的。在过去的几个月里&am…

idle显示出错信息 python_原来学Python最好的书是这一本?它在bookauthority里排名第三...

有一本学Python的书&#xff0c;也许你还没有关注到&#xff0c;它在bookauthority的Python类目中排名第三&#xff0c;要胜过太多太多的Python书。那就是《Python编程快速上手 让繁琐工作自动化》。就它本身来说&#xff0c;这本书不会让你变成一个职业软件开发者&#xff0c;…

“根本就不需要 Kafka 这样的大型分布式系统!”

由 Scala 和 Java 编写的 Kafka 是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据&#xff0c;不过&#xff0c;Kafka 也存在数据并非真正的实时传输、不支持物联网传感数据直接接入、监控不完善等缺点。事实上&#xff0c;作为开…

一份关于机器学习中线性代数学习资源的汇总

摘要&#xff1a; 本文是一份关于机器学习中线性代数学习指南&#xff0c;所给出的资源涵盖维基百科网页、教材、视频等&#xff0c;机器学习从业者可以从中选择合适的资源进行学习。对于机器学习而言&#xff0c;要学习的特征大多数是以矩阵的形式表示。线性代数是一门关于矩阵…

Linux环境_源码安装Unoconv实现文件在线预览doc,doxc,xls,xlsx,ppt,pptx 文件

因业务需求需要&#xff0c;用unoconv就可以轻松地实现利用LibOffice可以打开的文档的转换。 服务器版本 环境系统版本LinuxRed Hat Enterprise Linux Server release 7.6 (Maipo)LinuxCentOS Linux release 7.6 需要准备软件包 软件及版本下载链接LibreOffice_6.3.2_Linux_x…

车纷享:基于阿里云HBase构建车联网平台实践

摘要&#xff1a; 1. 业务介绍 车纷享是国内首家进行汽车共享开发和运营的公司。旗下共享汽车平台采用新能源汽车作为运营工具以B2CC2C汽车共享作为商业运营模式采用车联网技术作为运营管理技术目前已与国内多个城市建立合作。 1. 业务介绍 车纷享是国内首家进行汽车共享开发和…

promise用法_图解 Promise 实现原理(四):Promise 静态方法实现

作者&#xff1a;Morrain转发链接&#xff1a;https://mp.weixin.qq.com/s/Lp_5BXdpm7G29Z7zT_S-bQ前言Promise 是异步编程的一种解决方案&#xff0c;它由社区最早提出和实现&#xff0c;ES6 将其写进了语言标准&#xff0c;统一了用法&#xff0c;原生提供了Promise对象。更多…

这本零差评且有趣的Python算法书有点火~

普通程序员&#xff0c;不学算法&#xff0c;也可以成为大神吗&#xff1f;对不起&#xff0c;这个&#xff0c;绝对不可以。可是算法好难啊~~看两页书就想睡觉……所以就不学了吗&#xff1f;就一直当普通程序员吗&#xff1f;如果有一本算法书&#xff0c;看着很轻松……又有…

QuickBI助你成为分析师——数据源FAQ小结

摘要&#xff1a; 添加数据源的时候经常会遇到各种问题&#xff0c;下面来讲解一下常见情况&#xff0c;若仍有疑问扫码咨询哦&#xff01; 使用 Quick BI 分析数据时&#xff0c;需要先指定原始数据所在的数据源&#xff0c;测试连通数据源是数据分析的基础&#xff0c;下面让…

库函数strcmp的模拟实现

strcmp是字符串之间的比较&#xff0c;看官方说明 前面字符串大于后面的字符串返回大于0的数字&#xff0c;相等返回0&#xff0c;前面的字符串小于后面的&#xff0c;返回小于0的数字 strcmp的模拟实现 #include<string.h> #include<stdio.h>int my_strcmp(cons…

5种最流行的AI编程语言

摘要&#xff1a; 有没有兴趣来了解更多与AI开发有关的内容&#xff1f; 本文将介绍创建AI程序时可以使用的5种最佳语言。有没有兴趣来了解更多与AI开发有关的内容&#xff1f; 本文将介绍创建AI程序时可以使用的5种最佳语言。PythonPython语法简单&#xff0c;功能多样&#x…

VSFTPD实战02_需求

文章目录一、常用命令&#xff08;Linux&#xff09;二、 需求案例三、思路分析四、coding实战&#xff1a;① 创建ftp用户test 指定目录为/home/test② 为test设置密码③ 切换用户&#xff0c;查看目录五、限制用户目录① 编辑配置文件② 在/etc/vsftpd/目录下面&#xff0c;新…

axure web组件_AXURE原型设计:移动端选择器的应用

移动端的选择器就好比是web端的下拉列表&#xff0c;可以说是每个系统、软件必备的组件&#xff0c;也是移动端元件库的必备元件&#xff0c;文章对移动端选择器的不同种类以及原型应用进行了梳理分析&#xff0c;与大家分享。一般而言&#xff0c;移动端的选择器分为单选选择器…

Storm精华问答 | storm与Hadoop有什么区别?

戳蓝字“CSDN云计算”关注我们哦&#xff01;归于Apache社区&#xff0c;Storm被业界称为实时版Hadoop。随着越来越多的场景对Hadoop的MapReduce高延迟无法容忍。而目前已是分布式技术领域最新爆发点&#xff0c;Storm更是流计算技术中的佼佼者和主流。今天我们就一起来看看Sto…

QuickBI助你成为分析师——搞定数据源

摘要&#xff1a; QuickBI支持多种数据源连接&#xff0c;添加数据源是数据分析展示的第一步&#xff0c;下面来详细介绍一下产品数据源支持情况&#xff01; Quick BI是一个基于云计算的灵活的轻量级的自助BI工具服务平台&#xff0c;提供海量数据即时分析 &#xff0c;拖拽式…