EMR-Jindo Spark 核心引擎优化

news2024/11/30 0:42:45

        Jindo-Spark 是阿里云智能E-MapReduce 团队在开源的Apache Spark 基础上自主研发的分布式云原生 OLAP 引擎,已经在近千E-MapReduce 客户中大规模部署使用。Jindo Spark 在开源版本基础上做了大量优化和扩展,深度集成和连接了众多阿里云基础服务。凭借该引擎,EMR 成为第一个云上 TPC-DS 成绩提交者。经过持续不断地内核优化,目前基于最新 EMR-Jindo 引擎的 TPC-DS 成绩又有了大幅提高,达到了3615071,成本降低到 0.76 CNY。

 

Jindo-Spark高效计算引擎对Spark采起了一系列优化措施,好比Runtime Filter支持自适应的运行时数据裁剪;Enhanced Join Reorder来解决外链接重排等问题;TopK支持推理并下推 TopK 逻辑,帮助尽早地过滤数据;File Index支持文件级别过滤和min/max/bloom/倒排等;自研开发了Relational Cache,实现使用一套引擎就能够将查询从分钟级提高为亚秒级;针对特定的场景推出Spark Transaction功能,为Spark引入Full ACID支持;实现了Smart Shuffle功能,从底层来减小sort-merge 次数,提高Shuffle的效率。

 

4.1 Runtime Filter

相似于Spark中的Dynamic Partition Pruning(DPP),可是其比DPP功能更强大。除了DPP能处理的分析表以外,Runtime Filter还能够处理非分析表。其基本原理是运行时动态裁剪数据,避免没必要要的计算。好比,面对一个join查询,没法经过value下推到存储层而将数据过滤,逻辑推算的时候没法预知最后的数据量级。这种状况下若是是分析表,Runtime Filter首先会估计其中一个表中参与join操做的数据量,若是数据量较小,则提早进行数据筛选,再推送到另外一侧作数据过滤;而对于非分析表,会引入Filter,如BloomFilter得到Min或Max的统计信息,根据这些统计信息,将备选数据比较少的一侧提取出来,推到另外一侧进行过滤。Runtime Filter的成本很小,只须要在优化器中进行简单评估,却能够带来显著的性能提高。以下图所示,Runtime Filter实现了35%左右的总体性能提高。该特性已经在Spark提交了PR(SPARK-27227)。

 

4.2 Enhanced Join Recorde

大家都知道,算子执行顺序可能会极大地影响sql的执行效率,这种状况下优化的核心原则是改变算子的执行顺序,尽早地过滤数据。运维好比下图左上角的例子中,若是最底层两个表很是大的话,则这两张表join的开销会很是大,join后的大数据再去join小表,大数据一层一层地传递下去,就会影响整个流程的执行效率。此时,优化的思想是先将大表中一些无关的数据过滤掉,减小往下游传递的数据量。针对该问题,Spark使用的是动态规划算法,但其只适用于表的数量比较少的状况,若是表的数量大于12,该算法就一筹莫展。面对表的数量比较多的状况,EMR提供了多表join的遗传算法,其能够将原来的动态规划算法的2n的复杂度降到线性的量级,能完成成百上千张表的join。

下图右上角能够看到,Query64有18个表参与join,动态规划算法优化时间就须要耗费1400秒,而多表join的遗传算法仅须要20秒左右就可完成。Join Recorder另一个重要的功能是外链接重排算法,你们都知道sql中外链接不能随意交换顺序的,但这并不表明不能交换顺序,好比A left join B, 而后再left join C,事实上在某种条件下其顺序是可交换的。在Spark中,外链接的优化是直接被放弃掉,而EMR则根据现有研究找到了顺序可交换的充分必要条件,实现了外链接重排算法(以下图左下角所示),对外链接的执行效率有了质的提高(下图右下角)

 

4.3 Relational Cache

Spark Relational Cache希望能够达到秒级响应或者亚秒级响应,能够在提交SQL之后很快地看到结果。并且也支持很大的数据量,将其存储在持久化的存储上面,同时通过一些匹配手段,增加了匹配的场景。此外,下层存储也使用了高效的存储格式,比如离线分析都会使用的列式存储,并且对于列式存储进行了大量优化。此外,Relational Cache也是用户透明的特性,用户上来进行查询不需要知道几个表之间的关系,这些都是已经有过缓存的,不需要根据已有的缓存重写Query,可以直接判断是否有可以使用的Relational Cache,对于一个厂商而言只需要几个管理员进行维护即可。Spark Relational Cache支持自动更新,用户不需要担心因为插入了新的数据就使得Cache过时导致查询到错误的数据,这里面为用户提供了一些设置的规则,帮助用户去进行更新。此外,Spark Relational Cache还在研发方面,比如智能推荐方面进行了大量探索,比如根据用户SQL的历史可以推荐用户基于怎样的关系去建立Relational Cache。

阿里云EMR具有很多核心技术,如数据预计算、查询自动匹配以及数据预组织

数据预计算

数据在很多情况下都有一个模型,雪花模型是传统数据库中非常常见的模型,阿里云EMR添加了Primary Key/Foreign Key的支持,允许用户通过Primary Key/Foreign Key明确表之间的关系,提高匹配成功率。在数据预计算方面,充分利用EMR Spark加强的计算能力。此外,还通过Data Cube数据立方来支持多维数据分析。

执行计划重写

这部分首先通过数据预计算生成预计算的结果,并将结果存储在外部存储上,比如OSS、HDFS以及其他第三方存储中,对于Spark DataSource等数据格式都支持,对于DataLake等热门的存储格式后续也会添加支持。在传统数据库中有类似的优化方案,比如物化视图方式,而在Spark中使用这样的方式就不合适了,将逻辑匹配放在了Catalyst逻辑优化器内部来重写逻辑执行计划,判断Query能否通过Relational Cache实现查询,并基于Relational Cache实现进一步的Join或者组合。将简化后的逻辑计划转化成为物理计划在物理引擎上执行。依托EMR Spark其他的优化方向可以实现非常快速的执行结果,并且通过开关控制执行计划的重写。

自动查询匹配

这里有一个简单的例子,将三个表简单地Join在一起,经过过滤条件获得最终的结果。当Query过来之后先判断Spark Relational Cache是否能够符合需求,进而实现对于预先计算好的结果进行过滤,进而得到最终想要的结果。

数据预组织

如果将数十T的数据存在存储里面,那么从这个关系中获取最终的结果还需要不少的时间,因为需要启动不少的Task节点,而这些Task的调度也需要不少的开销,通过文件索引的方式将时间开销压缩到秒级水平,可以在执行时过滤所需要读取的文件总量,这样大大减少了任务的数量,这样执行的速度就会快很多。因为需要让全局索引变得更加有效,因此最好让数据是排过序的,如果对于结构化数据进行排序就会知道只是对于排列在第一位的Key有一个非常好的优化效果,对于排列在后面的Key比较困难,因此引入了ZOrder排序,使得列举出来的每个列都具有同等的效果。同时将数据存储在分区表里,使用GroupID作为分区列。

如何使用

对于简单的Query,可以指定自动更新的开关,并起一个名字方便后续管理。还可以规定数据Layout的形式,并最终通过SQL语句来描述关系,后续提供给用户WebUI一样的东西,方便用户管理Relational Cache。

数据更新

Relational Cache的数据更新主要有两种策略,一种是On Commit,比如当依赖的数据发生更新的时候,可以将所有需要添加的数据都追加写进去。还有一种默认的On Demand形式,用户通过Refresh命令手动触发更新,可以在创建的时候指定,也可以在创建之后手工调整。Relational Cache增量的更新是基于分区实现的,后续会考虑集成一些更加智能的存储格式,来支持行级别的更新。

性能分析

阿里巴巴的EMR Spark对于1T数据的构建时间只需要1小时。

查询性能

在查询性能方面,SSB平均查询耗时,无Cache时查询 时间按Scale成比例增加,Cache Cube后始终保持在亚秒级响应。

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

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

相关文章

工作流-流程实例【ProcessInstance】与执行实例【Execution】

一、ProcessInstance与Execution的区别 这是一个Activiti的难点,能够懂得这个,工作流也就入门大半了。 下面,我就细致的讲解一下他们的区别。 (1)首先,我们来看一张我总结的图片(这个图片中两条…

Flink-处理函数以及TopN运用案例

7 处理函数 7.1 概述 更底层的操作,直接对流进行操作,直接调用处理函数 7.2 基本处理函数ProcessFunction 分析 ProcessFunction的来源 处理函数继承了AbstractRichFunction富函数抽象类,因此就具有访问状态(state)和其他运行时环境 例…

Day39——Dp专题

文章目录01背包二维数组一维数组6.整数拆分7.不同的二叉搜索01背包 01背包:每一个物品只能选一次,选或者不选 状态标识:f[i][j]:所有只考虑前i个物品,且总体积不超j的所有选法的集合 属性:Max 状态计算&a…

链表之反转链表

文章目录链表之反转链表题目描述解题思路代码实现链表之反转链表 力扣链接 题目描述 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: ​ 输入: 1->2->3->4->5->NULL ​ 输出: 5->4-&…

如何设计高性能架构

高性能复杂度模型 高性能复杂度分析和设计 单机 集群 任务分配 将任务分配给多个服务器执行 复杂度分析 增加“任务分配器”节点,可以是独立的服务器,也可以是SDK任务分配器需要管理所有的服务器,可以通过配置文件,也可以通过…

RK3588移植-opencv交叉编译aarch64

文章参考:https://blog.csdn.net/KayChanGEEK/article/details/80365320 文章目录概括准备资源交叉编译OPENCV修改CMakelist文件将lib库复制到/lib目录注意:本文中的所有配置相关路径都与当前安装的路径有关,需要根据自己的环境进行自行修改&…

『Java课设』JavaSwing+MySQL实现学生成绩管理系统

👨‍🎓作者简介:一位喜欢写作,计科专业大三菜鸟 🏡个人主页:starry陆离 如果文章有帮到你的话记得点赞👍收藏💗支持一下哦 『Java课设』JavaSwingMySQL实现学生成绩管理系统前言1.开…

SparkMlib 之随机森林及其案例

文章目录什么是随机森林?随机森林的优缺点随机森林示例——鸢尾花分类什么是随机森林? 随机森林算法是机器学习、计算机视觉等领域内应用极为广泛的一个算法,它不仅可以用来做分类,也可用来做回归即预测,随机森林机由…

RabbitMQ之可靠性分析

在使用任何消息中间件的过程中,难免会出现消息丢失等异常情况,这个时候就需要有一个良好的机制来跟踪记录消息的过程(轨迹溯源),帮助我们排查问题。在RabbitMQ 中可以使用Firehose 功能来实现消息追踪,Fire…

艾美捷MTT细胞增殖检测试剂盒结果示例引用文献

艾美捷MTT细胞增殖检测试剂盒测定原理: 该试剂盒提供了比色形式测量和监测细胞增殖,含有足够的试剂用于评估在96孔板中进行960次测定或在24孔板中进行192次测定。细胞可以被镀,然后用影响增殖的化合物或药剂。然后用增殖试剂检测细胞&#x…

3.矩阵计算及导数基础

1. 梯度 将导数拓展到向量。 1. 标量对向量求导 x是列向量,y是标量,求导之后变成了行向量 ps: x1^2 2x2^2 这个函数可以画成等高线,对于(x1,x2)这个点,可以做等高线的切线,再做出…

Spark Streaming(二)

声明: 文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。 By luoyepiaoxue2014 B站&#xff…

动态规划算法(2)最长回文子串详解

文章目录最长回文字串动态规划代码示例前篇: (1)初识动态规划 最长回文字串 传送门: https://leetcode.cn/problems/longest-palindromic-substring/description/ 给你一个字符串 s,找到 s 中最长的回文子串。 s &qu…

大数据学习:使用Java API操作HDFS

文章目录一、创建Maven项目二、添加依赖三、创建日志属性文件四、在HDFS上创建文件五、写入HDFS文件1、将数据直接写入HDFS文件2、将本地文件写入HDFS文件六、读取HDFS文件1、读取HDFS文件直接在控制台显示2、读取HDFS文件,保存为本地文件一、创建Maven项目 二、添加…

Spring Security 中重要对象汇总

前言 已经写了好几篇关于 Spring Security 的文章了,相信很多读者还是对 Spring Security 的云里雾里的。这是因为对 Spring Security 中的对象还不了解。本文就来介绍介绍一下常用对象。 认证流程 SecurityContextHolder 用户认证通过后,为了避免用…

【JavaWeb】Servlet系列 --- HttpServlet【底层源码分析】

HttpServlet一、什么是协议?什么是HTTP协议?二、HTTP的请求协议(B -- > S)1. HTTP的请求协议包括4部分(记住)2. HTTP请求协议的具体报文:GET请求3. HTTP请求协议的具体报文:POST请…

生成式模型和判别式模型

决策函数Yf(x)Y f(x)Yf(x)或者条件概率分布 P(Y∣X)P(Y|X)P(Y∣X) 监督学习的任务都是从数据中学习一个模型(也叫做分类器),应用这一模型,对给定的输入xxx预测相应的输出YYY,这个模型的一般形式为:决策函数Yf(x)Y f(x)Yf(x)&…

java 每日一练(6)

java 每日一练(6) 文章目录单选不定项选择题编程题单选 1.关于抽象类与最终类,下列说法错误的是?   A 抽象类能被继承,最终类只能被实例化。   B 抽象类和最终类都可以被声明使用   C 抽象类中可以没有抽象方法,最终类中可以没…

Bean 管理(工厂bean)

IOC操作Bean 管理(FactoryBean) 下面是在Bean 管理(工厂bean)之前的学习,基于xml方式注入集合并实现 基于xml方式注入集合并实现 :http://t.csdn.cn/H0ipR Spring 有两种类型bean,一种普通bean…

第五章. 可视化数据分析分析图表—图表的常用设置2

第五章. 可视化数据分析分析图 5.2 图表的常用设置2 本节主要介绍图表的常用设置,设置标题和图例,添加注释文本,调整图表与画布边缘间距以及其他设置。 7.设置标题(title) 1).语法: matplotlib.pyplot.ti…