9.spark自适应查询-AQE之动态调整Join策略

目录

  • 概述
  • 动态调整Join策略
    • 原理
    • 实战
  • 动态优化倾斜的 Join
    • 原理
    • 实战

概述

broadcast hash join 类似于 Spark 共享变量中的广播变量,Spark join 如果能采取这种策略,那join 的性能是最好的

  • 自适应查询AQE(Adaptive Query Execution)
    • 动态调整Join策略
      • 原理
      • 实战
    • 动态优化倾斜的 Join
      • 原理
      • 默认环境配置
      • 修改配置

动态调整Join策略

实际上在生产中,特别是工厂中的局限性,表设计的时候,不是那么合理,导致这这种情况,很少见,很难被调整。

原理

AQE 可以将 sort-merge join 转成 broadcast hash join ,条件是当join 表小于自适应 broadcast hash join 的阀值。
开启了自适应查询执行机制之后,可以在运行时根据最精确的数据指标重新规划join策略,实现动态调整join策略。
看以下图:
在这里插入图片描述
后续测试过程中,可以看 spark sql 的执行图。

属性名称默认值解释版本
spark.sql.adaptive.localShuffleReader.enabledtrue当值为true,且spark.sql.adaptive.enabled也为true时,Spark尝试不需要shuffle分区时,使用本地的shuffle读取器读取shuffle数据,例如:在将 sort-merge 转换成 broadcast-hash join 之后3.0.0
spark.sql.adaptive.autoBroadcastJoinThreshold(none)为表配置最大的字节数,能优化成 broadcast join,通过设置此配置为-1,可以禁用 broadcast ,默认值与 spark.sql.autoBroadcastJoinThreshold 相同3.2.0
spark.sql.autoBroadcastJoinThreshold10MB同上1.1.0

当所有的 shuffle partitions 都小于阀值, AQE 将 sort-merge join 转成 shuffled hash join ;最大阀值配置:spark.sql.adaptive.maxShuffledHashJoinLocalMapThreshold

属性名称默认值解释版本
spark.sql.adaptive.maxShuffledHashJoinLocalMapThreshold0为每个分区配置最大的字节数,能够构建 local hash map,如果这个值不小于 spark.sql.adaptive.maxShuffledHashJoinLocalMapThreshold并所有的分区不大于这个配置,join选择更倾向于使用 shuffled hash join,而不是 sort merge join3.2.0

实战

执行的 sql

select count(*) from xx where dt ='2023-06-30' and workorder='011002118525' ;
## 同样的表相连
select * from (select * from xx  where dt ='2023-06-30' and workorder='011002118525') as a
left join  xx as b  on b.dt ='2023-06-30' and b.workorder='011002118525' and  a.id = b.id  ;

在这里插入图片描述
由上图,三百多万的数据,肯定超过10MB了,所以是 sort merge join
在这里插入图片描述
在这里插入图片描述
修改 sql 如下:

select	* from (select id from xx where dt = '2023-06-30' and workorder='011002118525' ) as a join xx as b on a.id = b.id and b.dt = '2023-06-30' and b.unitid = 'H8TGWJ035ZY0000431';

在这里插入图片描述

动态优化倾斜的 Join

原理

数据倾斜严重,将严重影响 join 查询的性能。该功能动态处理在 sort-merge join 倾斜数据时,将其分为大小差不多的任务。当同是启用 spark.sql.adaptive.enabledspark.sql.adaptive.skewJoin.enabled 时,动态优化倾斜 这个功能将生效。

属性名称默认值解释版本
spark.sql.adaptive.skewJoin.enabledtrue当同是启用 spark.sql.adaptive.enabled动态优化倾斜 这个功能将生效3.0.0
spark.sql.adaptive.skewJoin.skewedPartitionFactor5如果分区的大小大于此因子乘以分区大小的中值,并且也大于spark.sql.adaptive.skewJoin.strakedPartitionThresholdInBytes,则该分区被视为偏斜。3.2.0
spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes256MB如果分区的字节大小大于此阈值,并且也大于spark.sql.adaptive.skewJoin.strakedPartitionFactor乘以分区大小中值,则该分区被视为偏斜。理想情况下,此配置应设置为大于spark.sql.adaptive.advisoryPartitionSizeInBytes3.0.0

假设有两个表 t1t2,其中表t1中的P0分区里面的数据量明显大于其他分区,默认的执行情况是这样的,看这个图:
在这里插入图片描述

t1表中p0分区的数据比p1\p2\p3这几个分区的数据大很多,可以认为t1表中的数据出现了倾斜
当t1和t2表中p1、p2、p3这几个分区在join的时候基本上是不会出现数据倾斜的,因为这些分区的数据相对适中。但是P0分区在进行join的时候就会出现数据倾斜了,这样会导致 join 的时间过长

动态优化倾斜的 join 机制会把P0分区切分成两个子分区P0-1和P0-2,并将每个子分区关联到表t2的对应分区P0,看这个图:
在这里插入图片描述
t2表中的P0分区会复制出来两份相同的数据,和t1表中切分出来的P0分区的数据进行 join 关联。
这样相当于就把t1表中倾斜的分区拆分打散了,最终在 join 的时候就不会产生数据倾斜了。

实战

todo: 以后如果遇到,再补充上

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

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

相关文章

pytorch 初始化

初始化 import matplotlib.pyplot as plt import torch import torch.nn as nn from torch.utils.data import Dataset,DataLoader import torch.optim as optim import numpy as np random_seed=1000 # np.random.seed(random_seed) torch.manual_seed(random_seed)#自定义损…

linux(ubuntu)安装并使用scrcpy

scrcpy 是一款开源的在计算机上显示和控制 Android 设备的工具。要在 Ubuntu 上使用 scrcpy,你可以按照以下步骤进行安装: 通过命令行安装 scrcpy: 安装 scrcpy: 打开终端(Terminal)并执行以下命令来安装…

uniapp小程序v-for提示“不支持循环数据”

问题描述: 在uniapp小程序项目中使用多层for循环时&#xff0c;小程序端提示&#xff1a;uniapp v-for 暂不支持循环数据&#xff0c;以至于获取不到循环的数据。 <view v-for"(item,index) in list" :key"item.id"> <view v-for"child i…

.net core添加SQL日志输出

GreDbContext : Microsoft.EntityFrameworkCore.DbContext 下添加 public static readonly ILoggerFactory MyLoggerFactory LoggerFactory.Create(builder > { builder.AddConsole(); }); protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder…

代码随想录算法训练营第四十六天丨 动态规划part09

198.打家劫舍 思路 如果刚接触这样的题目&#xff0c;会有点困惑&#xff0c;当前的状态我是偷还是不偷呢&#xff1f; 仔细一想&#xff0c;当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。 所以这里就更感觉到&#xff0c;当前状态和前面状态会有一种依赖关系…

go-carbon v2.2.13 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库&#xff0c;支持链式调用。 目前已被 awesome-go 收录&#xff0c;如果您觉得不错&#xff0c;请给个 star 吧 github.com/golang-module/carbon gitee.com/golang-module/carbon 安装使用 Golang 版本大于…

Mysql5.7二级等保配置项示例

一、Mysql5.7的配置文件my.ini配置示例 [mysql] #设置mysql客户端默认字符集 default-character-setutf8 [mysqld] #设置mysql端口号&#xff0c;调整为非默认端口3306 port 3807 #设置为mysql的程序安装目录 basedir"C:\Program Files\MySQL\MySQL Server 5.7\" #…

Jupyter Notebook 内核似乎挂掉了,它很快将自动重启

报错原因&#xff1a; OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade perfo…

uniapp刻度尺的实现(swiper)滑动打分器

实现图&#xff08;百分制&#xff09;&#xff1a;滑动swiper进行打分&#xff0c;分数加减 <view class"scoring"><view class"toggle"><view class"score"><text>{{0}}</text><view class"scoreId&quo…

Apipost-Helper:IDEA中的类postman工具

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;无需安装、打开任何其他软件&#xff1b;写完代码IDEA内一键调试&#xff0c;无需安装、打开任何其他软件&#xff1b;生成API目录树&#xff0c;双击即可快速…

STM32F103C8T6第三天:pwm、sg90、超声波、距离感应按键开盖震动开盖蜂鸣器

1. 定时器介绍1&#xff08;317.21&#xff09; 软件定时&#xff08;之前的定时方法&#xff09;&#xff08;软件延时&#xff09;缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (-…

微服务-网关设计

文章目录 引言I 网关部署java启动jar包II 其他服务部署细节2.1 服务端api 版本号III 网关常规设置3.1 外部请求系统服务都需要通过网关访问3.2 第三方平台回调校验文件的配置IV 微服务日志跟踪4.1 打印线程ID4.2 封装线程池任务执行器4.3 将自身MDC中的数据复制给子线程4.4 微服…

龙迅LT8911EXB功能概述 MIPICSI/DSI TO EDP

LT8911EXB 描述&#xff1a; Lontium LT8911EXB是MIPIDSI/CSI到eDP转换器&#xff0c;单端口MIPI接收器有1个时钟通道和4个数据通道&#xff0c;每个数据通道最大运行2.0Gbps&#xff0c;最大输入带宽为8.0Gbps。转换器解码输入MIPI RGB16/18/24/30/36bpp、YUV422 16/20/24bp…

PageHelper多表关联查询数量问题

PageHelper多表关联查询数量问题 通常我们会使用PageHelper进行分页查询&#xff0c;但是当分页查询被用到多个表的关联查询中时&#xff0c;就有可能导致查询出来的数据总数比我们想要的多得多。 首先在数据库中创建三个demo表&#xff1a;role、path、role_path role角色表…

使用Selenium发邮件附件

发邮件可以使用SMTP协议实现程序去发送&#xff0c;但附件的不能太大&#xff0c;一般不超过20M。 以下使用Selenium模拟发送邮件&#xff0c;跳过这个限制&#xff0c;网上找了很多资料&#xff0c;都没有完整实现的&#xff0c;那么自己实现一个&#xff0c;以下代码用Python…

WM 报错不含领货点存储类型的存储类型需要部分搁板管理

试图为SAP新建堆放策略维B标准存储类型系统报错如下&#xff1a; 不含领货点存储类型的存储类型需要部分搁板管理 加个P类型的&#xff0c;先保存&#xff0c;然后再改 解决方案&#xff1a; 进入如下配置路径&#xff0c; 新增一个配置条目&#xff0c;如上图示&#xff0c;…

ci-cd的流程

1、项目在gitlab上&#xff0c;从gitlab上使用git插件获取源码&#xff0c;构建成war包&#xff0c;所以使用tomcat作为运行环境 发布 &#xff1a;使用maven插件发布&#xff0c;使用ssh连接。

小米6安装Ubuntu Touch系统也不是很难嘛

序言 这个文章是用来解说,小米6如何安装Ubuntu Touch系统 正文 安装这个系统需要注意的几点 1.手机必须已经解BL锁 2.没了 安装步骤 先双击打开压缩包查看,按照第一步第二步来进行执行,下面是解压图片 第一步 1.打开第一个文件夹 复制刷入rec的命令.txt里面的内容,然后打开红…

HTTP-HTTPS区别详解

一、HTTP协议 1. GET和POST的请求的区别 Post 和 Get 是 HTTP 请求的两种方法&#xff0c;其区别如下&#xff1a; 应用场景&#xff1a; GET 请求是一个幂等的请求&#xff0c;一般 Get 请求用于对服务器资源不会产生影响的场景&#xff0c;比如说请求一个网页的资源。而 Po…

Mac 禁用一些高占用cup的进程

什么是CrashReporter&#xff1f; CrashReporter在应用程序崩溃的任何时候都会运行&#xff0c;它旨在保存应用程序状态&#xff0c;以帮助开发人员找出应用程序崩溃原因。基本上&#xff0c;一个进程是启动、崩溃&#xff08;并调用CrashReporter&#xff09;&#xff0c;然后…