Vectorized Execution Engine in MaxCompute 2.0简介-阿里云开发者社区

开发者社区> 隐林> 正文

Vectorized Execution Engine in MaxCompute 2.0简介

简介: 前言     在《数据库系统中的Code Generation技术介绍》一文中,我们阐述了代码的CPU执行效率对于大规模分布式OLAP系统的重要性。现在简单总结如下: OLAP系统中查询往往比较复杂,比如多表Join, 各种聚合函数以及窗口函数,其中涉及大量的Hash计算(比如采用Hash
+关注继续查看

文章转自ruanxi

前言

    在《数据库系统中的Code Generation技术介绍》一文中,我们阐述了代码的CPU执行效率对于大规模分布式OLAP系统的重要性。现在简单总结如下:
  1. OLAP系统中查询往往比较复杂,比如多表Join, 各种聚合函数以及窗口函数,其中涉及大量的Hash计算(比如采用Hash Join, Hash Aggregation),排序(比如采用Merge-Sort Join)操作,CPU开销比较大。
  2. SSD等高性能存储硬件的使用,以及内存计算的普及(比如Spark中利用RDD来Cache部分数据)大大提高了I/O性能,使得CPU日益成为计算的瓶颈。
  3. 在大规模分布式OLAP系统中(比如MaxCompute),因为需要实现分布式Join,聚合以及窗口函数,一个作业可能会由多级Task组成,Task与Task之间可能会有大量的Shuffle/Sort操作,这其中包含的大量的Hash/Compare可能占据作业执行的大量时间。
   面对日益提高的执行效率述求,除了利用Code Generation等技术为SQL Query生成定制化的执行代码以外,整个执行引擎在设计上也需要有相应的考虑和改变。

Volcano Model:Row to Batch

    传统的关系型数据库基本采用Volcano Model来实现SQL执行引擎。这个模型比较好理解,查询计划中的各个算子(如SELECT, FILTER, JOIN等)实现成一个基类Operator的子类,算子和算子之间根据在查询计划中的数据传输关系形成一个有向无环图(绝大多数时候是一棵树)。除了直接与数据源打交道的算子(如从Storage读数据的TableScan)以外,每个算子都从一个或者多个其他算子读取数据,这些算子成为其“孩子”,这个算子也就是其“孩子”们的“父亲”。Operator基类有如下三个接口: 
  1. Open():做一些初始化工作,包括调用其“孩子”算子的Open()。
  2. Next():调用“孩子”算子的Next()方法获取数据,完成自身的计算逻辑。构造输出数据。
  3. Close():做一些清理工作,包括调用“孩子”算子的Close()方法。
   Volcano Model类型的执行引擎在这行过程中,数据以Record的形式在各个算子之间流动。一个Record即代表从存储层读出的一个数据行,或者某个算子计算过程中产生的中间数据行(下图描述了在Volcano Model中执行“SELECT t1.a + t2.b FROM t1 JOIN t2 ON t1.c = t2.c”中可能出现的Record)。如下图所示:

   Volcano Model的优点在于比较简单直观,SQL的执行流和查询计划对应比较紧密。因为各个算子之间都以固定的接口传递数据,因此相互之间耦合比较低,较容易应对SQL中众多算子复杂组合的场景,因此得到广泛引用。
   在执行效率方面,Volcano Model有明显缺陷。在执行过程中,算子之间通过Next()方法传递数据,而Next()方法往往实现为虚函数(或函数指针),这意味着执行过程中的Function Call的次数与Record数量呈正比,这极大影响了代码的instruction cache performance。此外,在Volcano Model中,需要沿着整个Operator Tree自底向上完成一遍执行,代码的Footprint较大,因此导致代码的 instruction locality 较低,当CPU的 instruction cache较小的时候,在执行过程中可能出现“Cache 颠簸”现象(不同算子之间反复将彼此的指令集从cache中刷出),大大降低代码的执行效率。
   一些改良过的Volcano Model,算子与算子之间以“Batch of Records”传输数据,如下图所示。以Batch的方式传递数据,一方面减少了算子之间的函数调用开销(由Record级别降低为Batch级别),也提高了指令和数据的局部性,有利于程序性能 的提升(靖人在这个方面还发表过一篇Paper, 有兴趣的同学可以参阅(传送门))。

Vectorized Execution

   上面讲到的“Batch Based Volcano Model”采用了行式的内存布局,即同一个Record中的不同列在内存中连续存放,不同行的同一列在内存中是离散的。 这在关系型计算的场景中,常常不是最优的选项。举一个例子,在一个“SELECT”算子当中,输入数据有“t1.a”和“t1.c”两列,SELECT算子从中取出"t1.a"这一列,  若采用行式的内存布局,那么需要从每一个输入Record中摘出a列来构造新的Record,事实上需要大量的内存拷贝。另一方面,在做类似“SELECT t1.a + 1”这样的表达式计算时,虽然“t1.c”这一列并没有用到,但是仍然会被Laod到CPU Cache当中,事实上降低了"t1.a"这一列的Cache命中率。


   MaxCompute 2.0在基于“Batch of Records”的Volcano Model基础上,引入了列式数据库的思想,数据在算子之间传递,处理的时候,相同列的数据在内存中地址连续。如下图所示。
       
基于列式的内存布局在上面提到的场景下有更好的性能。在“SELECT t1.a FROM t1”的场景中,我们只需要做一次指针赋值就可以完成投影操作,而不需要大量的内存拷贝,而在“SELECT t1.a +1”这种表达式计算场景下,我们也避免了Load冗余数据进CPU Cache,从而提高了CPU的Cache命中率。
   此外,列式的执行框架使得我们能够更好的提高CPU Pipeline效率,以及利用SIMD技术进行计算优化。这个我们会在后续的文章中更深入的介绍。

欢迎加入“数加·MaxCompute购买咨询”钉钉群(群号: 11782920)进行咨询,群二维码如下:

96e17df884ab556dc002c912fa736ef6558cbb51 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6835 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4395 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7734 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
5409 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
9406 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
2121 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
16737 0
+关注
隐林
阿里云大数据产品专家,擅长MaxCompute、机器学习、分布式、可视化、人工智能等大数据领域;
288
文章
38
问答
来源圈子
更多
MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载