关于sparksql调优的一些操作

1、查看执行计划
1、直接sql查看: explain select … from …

2、ds.explain()
2、执行计划的处理流程
sql代码 -> 未决断的逻辑执行计划 -> 根据元数据生成已决断的逻辑执行计划 -> 生成物理执行计划 -> 模型评估 -> 选择物理执行计划 -> 生成执行代码
3、cbo优化
注意:要想使用cbo优化必须先收集表、列的信息,否则cbo优化不起作用
收集信息:
收集表的信息: ANALYZE TABLE 表名 COMPUTE STATISTICS
收集列的信息: ANALYZE TABLE 表名 COMPUTE STATISTICS FOR COLUMNS 列1,列2,列3
使用cbo:
cbo优化可以优化多表join的顺序、调整表的join的策略
spark.sql.cbo.enabled: 是否开启cbo优化
spark.sql.cbo.joinReorder.enabled: 是否调整多表Join的顺序
spark.sql.cbo.joinReorder.dp.threshold: 设置多表jion的表数量的阈值,一旦join的表数量超过该阈值则不优化多表join的顺序
4、广播join
场景: 大表join小表,可以将小表数据广播出去避免shuffle操作
使用广播join
1、设置小表的大小阈值:
在sparksession创建的时候使用config方法配置spark.sql.autoBroadcastJoinThreshold,后续join的时候一旦表的大小小于该阈值,则认为是小表,会广播小表数据
2、使用hint语法强制广播
select /+ BROADCASTJOIN(别名1) / …. from 表1 别名1 join 表2 别名2 on …

select /+ BROADCAST(别名1) / …. from 表1 别名1 join 表2 别名2 on …

select /+ MAPJOIN(别名1) / …. from 表1 别名1 join 表2 别名2 on …

5、smb join
场景: 大表 join 大表可以使用smb join,可以减少join的时候扫描的表的数据量,提高效率
使用前提:
1、join的两个大表必须是分桶表,两个分桶表的桶的个数必须一样或者是倍数关系
2、join的时候,join的列 = 分桶的的列
6、AQE自适应优化【spark3.x版本才有】
1、动态合并分区: spark会根据分区的数据量将小数据量的多个分区合并成一个分区,可以提高资源的利用率
spark.sql.adaptive.enabled: 是否开启AQE优化
spark.sql.adaptive.coalescePartitions.enabled: 是否开启动态合并分区
spark.sql.adaptive.coalescePartitions.initialPartitionNum: 初始分区数
spark.sql.adaptive.coalescePartitions.minPartitionNum: 合并之后的最小分区数
当RDD的分区数处于spark.sql.adaptive.coalescePartitions.initialPartitionNum与spark.sql.adaptive.coalescePartitions.minPartitionNum范围内才会合并
spark.sql.adaptive.advisoryPartitionSizeInBytes: 合并分区之后,分区的数据量的预期大小
2、动态切换join策略: 在join的时候,会动态选择性能最高的join策略,提高效率
spark.sql.adaptive.enabled: 是否开启AQE优化
spark.sql.adaptive.localShuffleReader.enabled:在不需要进行shuffle重分区时,尝试使用本地shuffle读取器。将sort-meger join 转换为广播join
3、动态申请资源: 当计算过程中资源不足会自动申请资源
spark.sql.adaptive.enabled: 是否开启AQE优化
spark.dynamicAllocation.enabled: 是否开启动态资源申请
spark.dynamicAllocation.shuffleTracking.enabled: 是否开启shuffle状态跟踪
4、动态join数据倾斜: join的时候如果出现了数据倾斜,会动态调整分区的数据量,优化数据倾斜导致的性能问题。
spark.sql.adaptive.enabled: 是否开启AQE优化
spark.sql.adaptive.skewJoin.enable: 是否开启join数据倾斜的优化
spark.sql.adaptive.skewJoin.skewedPartitionFactor: N
spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes: M
spark.sql.adaptive.advisoryPartitionSizeInBytes: G [代表优化之后,分区数数据的预期大小]
sparksql判断出现数据倾斜的依据[需要两个条件同时满足]:
当某个分区处理的数据量>= N * 所有task处理数据量的中位数
当某个分区处理的数据量>= M
7、手动处理数据倾斜
1、如何判断有数据倾斜
可以从4040webui界面查看所有task的执行时间与处理的数据量
如果某个task处理的数据量与执行时间相比其他task多很多,此时可以判定该task存在数据倾斜
2、数据倾斜的出现的阶段
数据倾斜一般在shuffle阶段才会出现
因为在shuffle的时候需要根据key.hashCode%分区数得到分区号,如果某个key的数据量很多,此时全部聚在一个分区导致数据倾斜
3、数据倾斜出现的场景
1、key为null的数据很多
解决方案
1、如果null值数据对业务不影响,可以直接过滤掉
2、如果null值数据对业务影响,此时先可以给key弄一个随机数,将数据打散
2、groupBy的时候,某个key的数据很多导致数据倾斜
解决方案:
1、局部聚合
1、给分组的字段加上随机数
2、按照加上随机数的key分组聚合
2、全局聚合
1、去掉key中的随机数
2、按照key再次分区聚合
3、join的时候,某个key的数据很多导致数据倾斜
1、大表join小表出现数据倾斜
解决方案: 在sparksession中配置spark.sql.autoBroadcastJoinThreshold,将小表广播出去,避免shuffle
2、大表 join 大表,个别key数据量多导致的数据倾斜
解决方案:
1、将倾斜表中倾斜key与非倾斜key数据单独过滤出来
2、将非倾斜表中倾斜key与非倾斜key数据单独过滤出来
3、将倾斜表中非倾斜key的数据与非倾斜表中非倾斜key的数据正常join
4、将倾斜表中倾斜key的数据的join的列加上N以内的随机数
5、将非倾斜表中倾斜key的数据扩容N倍
6、将第四步与第五步的数据join
7、将第六步的结果与第三步的结果union all
3、大表 join 大表,大量key数据量都比较多导致的数据倾斜
解决方案:
1、将倾斜表中join的列加上N[N最多只能是10以内]以内的随机数
2、将非倾斜表中的数据扩容N[N最多只能是10以内]倍
3、将第一步与第二步的数据join

Original: https://www.cnblogs.com/CYan521/p/16714984.html
Author: 再美不及姑娘你
Title: 关于sparksql调优的一些操作

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/714583/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 内部类

    当目前某个类现在需要一个只能该类使用的类时 1.能修饰类的权限修饰符只能时 默认不写(default) 和公共(public) 2.内部类私有化 正向思考: 四种权限修饰符常用来修…

    技术杂谈 2023年6月21日
    0100
  • 低代码如何构建支持OAuth2.0的后端Web API

    OAuth2.0 OAuth 是一个安全协议,用于保护全球范围内大量且不断增长的Web API。它用于连接不同的网站,还支持原生应用和移动应用于云服务之间的连接,同时它也是各个领域…

    技术杂谈 2023年5月31日
    086
  • 关于实现

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年5月31日
    085
  • Linux下TIME_WAIT连接优化内核参数tcp_tw_reuse与tcp_tw_recycle区别与联系浅析

    概述 最近学习网络相关知识点,很多文章提到针对TCP time wait(后续简称TW)状态连接进行优化的参数tcp_tw_reuse和tcp_tw_recycle,并且不少文章提…

    技术杂谈 2023年6月21日
    099
  • 武林头条-建站小能手争霸赛

    好话说在前头 如果你 想在自己的主机上 搭建一个属于自己的、独一无二的博客 想学会自主安装WordPress 掌握CentOS常用命令 可以在WordPress上自主安装主题和插件…

    技术杂谈 2023年7月11日
    065
  • 异构计算技术分析

    异构计算技术分析 参考文献链接 https://mp.weixin.qq.com/s/xW_Y0JBKK3d42IZvHA9CrQ https://mp.weixin.qq.com…

    技术杂谈 2023年5月31日
    0109
  • C 中的字符数组

    在C语言中没有专门的字符串变量,字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。通常用一个 字符数组来存…

    技术杂谈 2023年7月10日
    098
  • SpringMVC入手项目注解版

    SpringMVC入手项目注解版 1.创建Maven项目在pom.xml文件引入相关的依赖 <dependencies> <dependency> <…

    技术杂谈 2023年7月11日
    072
  • Monkey工具之fastbot-iOS实践

    Monkey工具之fastbot-iOS实践 背景 目前移动端App上线后 crash 率比较高, 尤其在iOS端。我们需要一款Monkey工具测试App的稳定性,更早的发现cra…

    技术杂谈 2023年5月31日
    097
  • 带研发团队后的日常思考1 初级管理者的困惑

    前言: 本人于2020年4月开始接触管理工作到现在有2年的时间,累计招聘前、后端开发30余人,目前划分为5个小团队,分别负责对应的项目,从刚开始忙的一团糟经常加班,到现在准时下班,…

    技术杂谈 2023年7月11日
    088
  • R语言读取matlab中数据

    1. 在matlab中将数据保存到*.mat 文件夹 save("data.mat","data","label")#&…

    技术杂谈 2023年7月11日
    084
  • 如何在Windows 10 上定时备份线上Minio 资源

    @ 一、系统环境 二、软件安装 三、设置定时任务 3.1 创建账号 3.2 同步测试 3.3 编写同步脚本 3.4 脚本测试 3.5 创建定时任务 3.6 定时任务测试 四、总结 …

    技术杂谈 2023年6月21日
    098
  • 关于计算两日期之间经过多少天的超巧妙算法

    首先声明:本文引自一博主原创博客 昨天呢,刚刚阅读了这个代码,大部分都还可以看懂,有一两个地方属实难懂,但细细思来,方知博主此代码超神奇。简直巧妙至极。 所以来细细解析一下此代码。…

    技术杂谈 2023年7月23日
    0172
  • 进程上下文、中断上下文及原子上下文***

    谈论进程上下文 、中断上下文 、 原子上下文之前,有必要讨论下两个概念: a — 上下文 上下文是从英文 context翻译过来,指的是一种 环境。相对于进程而言,就是…

    技术杂谈 2023年5月31日
    085
  • 【软考】软件架构

    1.软件架构风格 1.1 数据流风格 1.2 调用/返回风格 1.3 独立构件风格 1.4 虚拟机风格 1.5 仓库风格 2.相关考题 1.软件架构风格 软件架构分为以下几种风格:…

    技术杂谈 2023年5月31日
    094
  • 解决VisualStudio中无法使用热重载的问题

    最近发现Visual Studio的热重载不好使了,老报错误”未预期此错误,进程可能已损坏,建议重新启动应用程序。” 然后怎么弄都不行,网上也没有找到有同样…

    技术杂谈 2023年5月31日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球