spark3新特性之动态分区裁剪

news2024/10/6 12:30:34

Spark3.0为我们带来了许多令人期待的特性。Spark中的静态分区裁剪在介绍动态分区裁剪之前,有必要对Spark中的静态分区裁剪进行介绍。因此,在这种情况下,我们不能再应用静态分区裁剪,因为filter条件在join表的一侧,而对裁剪有用的表在Join的另一侧。Spark将这个查询转化为一种易于理解的形式,我们称它为查询的逻辑计划。物理计划阶段优化如果维度表很小,那么Spark很可能会以broadcasthashjoin的形式执行这个Join。

Spark 3.0 为我们带来了许多令人期待的特性。动态分区裁剪(dynamic partition pruning)就是其中之一。本文将通过图文的形式来带大家理解什么是动态分区裁剪。

Spark 中的静态分区裁剪

在介绍动态分区裁剪之前,有必要对 Spark 中的静态分区裁剪进行介绍。在标准数据库术语中,裁剪意味着优化器将避免读取不包含我们正在查找的数据的文件。例如我们有以下的查询 SQL:

1

<ol><li>Select * from iteblog.Students where subject = 'English'; </li></ol>

在这个简单的查询中,我们试图匹配和识别 Students 表中 subject = English 的记录。比较愚蠢的做法是先把数据全部 scan 出来,然后再使用 subject = 'English' 去过滤。如下图所示:


 

比较好的实现是查询优化器将过滤器下推到数据源,以便能够避免扫描整个数据集,Spark 就是这么来做的,如下图所示:


 

在静态分区裁剪技术中,我们的表首先是分区的,分区过滤下推的思想和上面的 filter push down 一致。因为在这种情况下,如果我们的查询有一个针对分区列的过滤,那么在实际的查询中可以跳过很多不必要的分区,从而大大减少数据的扫描,减少磁盘I/O,从而提升计算的性能。

然而,在现实中,我们的查询语句不会是这么简单的。通常情况下,我们会有多张维表,小表需要与大的事实表进行 join。因此,在这种情况下,我们不能再应用静态分区裁剪,因为 filter 条件在 join 表的一侧,而对裁剪有用的表在 Join 的另一侧。比如我们有以下的查询语句:

1

<ol><li>Select * from iteblog.Students join iteblog.DailyRoutine  </li><li>where iteblog.DailyRoutine.subject = 'English'; </li></ol>

对于上面的查询,比较垃圾的查询引擎最后的执行计划如下:


 

它把两张表的数据进行关联,然后再过滤。在数据量比较大的情况下效率可想而知。一些比较好的计算引擎可以进行一些优化,比如:


 

其能够在一张表里面先过滤一些无用的数据,再进行 Join,效率自然比前面一种好。但是如果是我们人来弄,其实我们可以把 subject = 'English' 过滤条件下推到 iteblog.Students 表里面,这个正是 Spark 3.0 给我们带来的动态分区裁剪优化。

动态分区裁剪

在 Spark SQL 中,用户通常用他们喜欢的编程语言并选择他们喜欢的 API 来提交查询,这也就是为什么有 Dataframes 和 DataSet。Spark 将这个查询转化为一种易于理解的形式,我们称它为查询的逻辑计划(logical plan)。在此阶段,Spark 通过应用一组基于规则(rule based)的转换(如列修剪、常量折叠、算子下推)来优化逻辑计划。然后,它才会进入查询的实际物理计划(physical planning)。在物理规划阶段 Spark 生成一个可执行的计划(executable plan),该计划将计算分布在集群中。本文我将解释如何在逻辑计划阶段实现动态分区修剪。然后,我们将研究如何在物理计划阶段中进一步优化它。


 

逻辑计划阶段优化

假设我们有一个具有多个分区的事实表(fact table),为了方便说明,我们用不同颜色代表不同的分区。另外,我们还有一个比较小的维度表(dimension table),我们的维度表不是分区表。然后我们在这些数据集上进行典型的扫描操作。在我们的例子里面,假设我们只读取维度表里面的两行数据,而这两行数据其实对于另外一张表的两个分区。所以最后执行 Join 操作时,带有分区的事实表只需要读取两个分区的数据就可以。

因此,我们不需要实际扫描整个事实表。为了做到这种优化,一种简单的方法是通过维度表构造出一个过滤子查询(比如上面例子为 select subject from iteblog.DailyRoutine where subject = 'English'),然后在扫描事实表之前加上这个过滤子查询。

通过这种方式,我们在逻辑计划阶段就知道事实表需要扫描哪些分区。


 

但是,上面的物理计划执行起来还是比较低效。因为里面有重复的子查询,我们需要找出一种方法来消除这个重复的子查询。为了做到这一点,Spark 在物理计划阶段做了一些优化。

物理计划阶段优化

如果维度表很小,那么 Spark 很可能会以 broadcast hash join 的形式执行这个 Join。Broadcast Hash Join 的实现是将小表的数据广播(broadcast)到 Spark 所有的 Executor 端,这个广播过程和我们自己去广播数据没什么区别,先利用 collect 算子将小表的数据从 Executor 端拉到 Driver 端,然后在 Driver 端调用 sparkContext.broadcast 广播到所有 Executor 端;另一方面,大表也会构建 hash table(称为 build relation),之后在 Executor 端这个广播出去的数据会和大表的对应的分区进行 Join 操作,这种 Join 策略避免了 Shuffle 操作。具体如下:


 

我们已经知道了 broadcast hash join 实现原理。其实动态分区裁剪优化就是在 broadcast hash join 中大表进行 build relation 的时候拿到维度表的广播结果(broadcast results),然后在 build relation 的时候(Scan 前)进行动态过滤,从而达到避免扫描无用的数据效果。具体如下:


 

好了,以上就是动态分区裁剪在逻辑计划和物理计划的优化。

动态分区裁剪适用条件

并不是什么查询都会启用动态裁剪优化的,必须满足以下几个条件:

spark.sql.optimizer.dynamicPartitionPruning.enabled 参数必须设置为 true,不过这个值默认就是启用的; 需要裁减的表必须是分区表,而且分区字段必须在 join 的 on 条件里面; Join 类型必须是 INNER, LEFT SEMI (左表是分区表), LEFT OUTER (右表是分区表), or RIGHT OUTER (左表是分区表)。 满足上面的条件也不一定会触发动态分区裁减,还必须满足 spark.sql.optimizer.dynamicPartitionPruning.useStats 和 spark.sql.optimizer.dynamicPartitionPruning.fallbackFilterRatio 两个参数综合评估出一个进行动态分区裁减是否有益的值,满足了才会进行动态分区裁减。评估函数实现请参见 org.apache.spark.sql.dynamicpruning.PartitionPruning#pruningHasBenefit。

本文主要翻译自:https://blog.knoldus.com/dynamic-partition-pruning-in-spark-3-0/

参考:Spark3新特性之动态分区裁剪(Dynamic Partition Pruning,DPP)_spark动态分区裁剪_今天努力了吗??的博客-CSDN博客

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

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

相关文章

【小米的技术分享】拯救程序员的“救命稻草”:Git回滚命令大揭秘!

大家好&#xff0c;我是小米。作为一名热爱技术的程序员&#xff0c;经常使用Git进行版本控制是我们的家常便饭。但是&#xff0c;难免会遇到一些意外&#xff0c;比如不小心提交了错误的代码或者合并了错误的分支&#xff0c;这时候就需要用到Git回滚命令了。今天&#xff0c;…

chrome谷歌浏览器书签不同步的解决办法

背景&#xff1a;多台电脑使用时&#xff0c;发现浏览器书签并没有及时同步&#xff0c;找到最终的解决办法&#xff1a; 第1步&#xff1a;chrome地址栏中输入&#xff1a; chrome://sync-internals/ 第2步&#xff1a;点击 Disable Sync (Clear Data) 点击Request Start 第3…

马上掌握的LayUI树形权限菜单,助力你的权限管理!

目录 一、树形菜单的介绍 1、什么是树形菜单&#xff1f; 二、实现思路流程 三、实现步骤 1、查看数据 1&#xff09;表数据 2&#xff09; 最终效果 2、编程 1&#xff09;实体类编写 2&#xff09;PermissionDao编写&#xff08;难点&#xff09; 第一 在线转json…

vue+springboot基于Web的电子产品销售系统设计与实现 gqon2a

随着人们生活水平的高速发展&#xff0c;电子产品销售方面在近年来呈直线上升&#xff0c;人们也了解到电子产品的实用性&#xff0c;因此电子产品的销售数量也逐年递增&#xff0c;电子产品销售的增加加大了在管理上的工作难度。为了能更好的维护电子产品销售管理秩序&#xf…

Grafana 图形面板定制方案

Grafana 在一个 Panel 中添加多数据源同时展示以及修改通过 transform 修改图表图例的方式。 多个数据在一个折线图中 在 Grafana 中我们可能会希望多个数据在一个Panel 中展示&#xff0c;比如&#xff1a; 通过编辑 Panel 增加 Query 数据我们即可做到&#xff1a;像上面中…

SQL数据库连接类型与常用函数

目录 1. 创建表插入数据 2. 连接类型 2.1 内连接 2.2 外连接 2.2.1 左外连接 2.2.2 右外连接 2.3 交叉连接 2.4 子查询&公用表达式 2.5 UNION连接 3. SQL常用函数 3.1 CASE WHEN函数 3.2 COALESCE函数 3.3 NULLIF函数 3.4 LEAST 和 GREATEST函数 3.5 DISTINCT…

LayUi之树形结构的详解(附有全案例代码)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一. 什么是树形结构 二.树形结构在什么时…

表格编程之争:Python VS VBA?Excel用户:新编程语言才真香

Python和VBA哪个更好用&#xff1f; Python和VBA是两种不同的编程语言&#xff0c;它们都有自己的特点和优缺点。在表格编程方面&#xff0c;VBA在Excel中的应用非常广泛&#xff0c;可以通过宏来实现自动化操作和数据处理&#xff0c;也可以通过VBA代码来实现自定义函数和界面…

python qt安装软件包

安装 opencv pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/ 安装pyqt5 pip install pyqt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/ 安装pyqt5-tools pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/

RLHF-基于人类反馈的强化学习

RLHF 文章目录 RLHF强化学习基础回顾为什么要使用基于人类反馈的强化学习大纲RLHF的起源大预言模型中的RLHF案例 ChatGPT RLHF中的技术细节预训练语言模型训练奖励模型基于RL进行微调 RLHF 的未来 强化学习基础回顾 智能体通过采取行动与环境进行交互&#xff0c;并返回状态和奖…

【C语言督学营 第十八天】考研408排序大题初探(将排序思想融入题目)

文章目录 题目一分析代码实战 题目二分析代码实战 补充(快排与归并)数据结构大题注意点&#xff01;&#xff01;&#xff01;(评分标准) 题目一 分析 (1&#xff09;算法的基本设计思想 由题意知&#xff0c;将最小的nl2个元素放在Ai中&#xff0c;其余的元素放在A2中&#x…

FreeRTOS实时操作系统(十三)任务通知

系列文章目录 文章目录 系列文章目录任务通知任务通知值和通知状态任务通知值通知状态 任务通知API函数发送通知函数接收通知函数 实验测试模拟二值信号量实验模拟计数型信号量模拟事件标志组实验模拟消息邮箱实验 任务通知 任务通知&#xff1a;用来通知任务的&#xff0c;任…

ATMEGA16 Proteus仿真自动人体感应电风扇DS18B20温度 -0069

ATMEGA16 Proteus仿真自动人体感应电风扇DS18B20温度 -0069 Proteus仿真小实验&#xff1a; ATMEGA16 Proteus仿真自动人体感应电风扇DS18B20温度 -0069 功能&#xff1a; Protues版本&#xff1a;7.8 程序编写&#xff1a;ICCAVR:7.12 硬件组成&#xff1a;ATMEGA16单片机…

嵌入式开发之编码器速度采集

光电编码器&#xff0c;是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是应用最多的传感器&#xff0c;光电编码器是由光源、光码盘和光敏元件组成。光栅盘是在一定直径的圆板上等分地开通若干个长方形孔。由于光电码盘与电动机同轴&#xff0c;…

spark和zeppelin认证不一致:Only one of --proxy-user or --principal can be provided

spark和zeppelin认证不一致&#xff1a;Only one of --proxy-user or --principal can be provided 如果配置principal认证方式&#xff0c;zeppelin走的是hadoop权限&#xff0c;如果配置proxy-user认证方式&#xff0c;zeppelin走的是当前登录用户的权限&#xff08;ranger控…

GitHub上cambel的ur3项目调试经验

按照https://github.com/cambel/ur3/wiki/Compile-from-source配置环境时&#xff0c;遇到以下问题&#xff1a; catkin clean时报错 [clean] Error: The current or desired workspace could not be determined. Please run catkin clean from within a catkin workspace or…

【学会动态规划】第 N 个泰波那契数(1)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 4. 空间优化 写在最后 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟…

MySQL 中索引是如何实现的,有哪些类型的索引,如何进行优化索引

MySQL 中的索引 前言 上篇文章聊完了 MySQL 中的锁&#xff0c;这里接着来看下 MySQL 中的索引。 一般当我们数据库中的某些查询比较慢的时候&#xff0c;正常情况下&#xff0c;一顿分析下来&#xff0c;大多数我们会考虑对这个查询加个索引&#xff0c;那么索引是如何工作的呢…

从零开始的前后端分离项目学习(前后端从零环境搭建)

一、 前后端分离介绍&#xff1a; 前端独立编写客户端代码&#xff08;用户交互数据展示&#xff09;&#xff0c;后端独立编写服务端代码&#xff08;提供数据处理接口&#xff09;&#xff0c;并提供数据接口就行。 前端通过Ajax访问后端数据借口&#xff0c;将model展示到…

使用VESD脉冲离子风机5年内至少可节省一半的维护成本

之前的文章有给大家详细介绍过&#xff0c;来自VESD的脉冲离子风机&#xff0c;它有着特殊的设计&#xff1a;插拔式结构和可水洗针架&#xff0c;因此对我们的很多客户来说&#xff0c;这款风机性价比是非常高的。 早在15年以前&#xff0c;VESD就对市面上大部分风机进行过测试…