Vectorized Execution Engine in MaxCompute 2.0简介

文章转自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钉钉群讨论

阅读原文请点击

时间: 2024-11-07 07:47:17

Vectorized Execution Engine in MaxCompute 2.0简介的相关文章

IOS 网络浅析-(十一 三方 AFNetworking3.0简介)

AFNetworking3.0是目前最新的版本,本来打算介绍一下2.6,但是想想2.6名不久矣,就决定不介绍了,有兴趣的小伙伴可以上网查一查.下面我就开始进入正题了. 目前使用人数最多的第三方网络库,没有之一.从开始的NSURLConnection到现在的NSURLSession,它都一直保持着与苹果的步调一致,而由它也衍生出大量的相关第三方网络功能库,不仅仅因为他的可靠,好用,一直保持着维护更新,也是为什么它这么受到广大程序员的青睐. 上传data // // ViewController.m

.NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介

.NET Core 1.0.ASP.NET Core 1.0和EF Core 1.0简介 英文原文:Reintroducing .NET Core 1.0, ASP.NET Core 1.0, and EF Core 1.0 新版本的 ASP.NET 和 Entity Framework 有一个严重的问题,就是它们同以前的版本不兼容.这不只是行为或 API 稍有差异的事,而基本上是进行了完全的重写,去掉了大量的功能. 因此,目前人们认为,将这些框架称为 ASP.NET 5.0 和 Entity

【HANA系列】SAP HANA 2.0简介

公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA 2.0简介 前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适. 正文部分 下一代的内存平台SAP HANA 2.0简化了数据库和数据管理,使应用程序开发人员能够更轻松地提供智能,洞察驱动的应用程序. 该平台的新功能针对创新进行了优化,可帮助您的企业在数字经济中更有效地展开竞争. 而且由于SAP H

Thymeleaf3.0简介

thymeleaf的初次使用(带参请求以及调用带参js方法) 之前对于前端框架接触较少,第一次接触thymeleaf,虽说看起来并不复杂但我还是花费了好一会儿才弄懂. 话不多少下面就简单说一下我在项目中的应用. 首先是java代码 controller层 将需要在前端展示的信息放入model中: @RequestMapping("getAll") public String getAll(Model model){ List<ScheduleJob> list = sche

Spring MVC 3.0简介

1.    背景介绍 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架.通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术.Velocity.Tiles.iText 和 POI.Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术.Spring

Hive0.13.0简介

好久不更新博客了,近几个月经过反复修改整理已经积攒了一堆笔记,恰好趁此更新博客的机会再将所学知识进行一个系统的回顾和梳理. 一.Hive简介 1.1.Hive是建立在Hadoop上的数据仓库基础构架. 他提供了一系列的工具,可以用来进行数据提取和转化加载(ETL),是部署在hadoop集群上的,是hadoop集群上的一个框架,这是一种大规模的数据机制,Hive定义了简单的类SQL查询语句,称为HQL,他允许熟悉Sql的用户查询数据,同时,这个语言也允许熟悉MapperReducer开发者开发自定

maxcompute 2.0复杂数据类型之array

含义类似于Java中的array.有序.可重复. 场景什么样的数据,适合使用array类型来存储呢?这里列举了几个我在开发中实际用到的场景. 2.1 标签类的数据为什么说标签类数据适合使用array类型呢?(1)标签一般是一个只有key.没有value的结构:(2)标签的数量(枚举值个数)会非常多:(3)标签的变化会比较频繁:(4)标签会过期:因此,比起"创建多个字段"."使用指定分隔符分隔的字符串"."使用map"等方法,使用array是更合适

Chapter 1 : OpenGLES 3.0 简介 (1)—— OpenGL ES 简介

OpenGL ES (OpenGL for Embedded Systems 的缩写)是一套在手持设备和嵌入式设备上实现高级3D图形化的应用变成接口(API).OpenGL ES作为图形API在当今的智能机领域占据了主导地位,并且已经将其应用扩展到了台式机.支持OpenGL ES的平台包括iOS.Android.BlackBerry.bada.Linux和Windows.OpenGL ES也支持WebGL——一种实现基于浏览器3D图形化的web标准. 2009年六月,苹果发布了iPhone 3G

Chapter 1 : OpenGLES 3.0 简介 (2)—— OpenGL ES 3.0

管道 如前所属,本书讲解的API版本是OpenGL ES 3.0.本书的目标是,深入讲解OpenGL ES 3.0的技术细节,给出具体的例子来说明如何使用某个特性,并且讨论了各种性能优化技术.当您读完这本书,您应该可以对OpenGL ES 3.0API有一个很好的把握.您将可以轻松的写出让人新服的OpenGL ES 3.0的应用程序,并且您不必通过阅读多种OpenGL ES的规范来搞懂某个特性是如何工作的. OpenGL ES 3.0实现了可编程着色图形管道.OpenGL ES 3.0规范包含两