SparkSQL优化

news2024/11/26 2:43:02

执行计划

查看执行计划

  • explain():只展示物理执行计划。(使用较多)
  • explain(mode="simple"):只展示物理执行计划。
  • `explain(mode=“extended”):展示物理执行计划和逻辑执行计划。
  • explain(mode="codegen") :展示要 Codegen 生成的可执行 Java 代码。(使用较多)
  • explain(mode="cost"):展示优化后的逻辑执行计划以及相关的统计。
  • explain(mode="formatted"):以分隔的方式输出,它会输出更易读的物理执行计划,并展示每个节点的详细信息。
from pyspark.sql import SparkSession

# 初始化SparkSession
spark = SparkSession.Builder()\
    .appName('test')\
    .enableHiveSupport()\
    .getOrCreate()

sql = """
select level
	,count(distinct from_table) as cnt 
from dw_pub_safe.dw_pub_table_rely_pfd 
where level > 3+7
group by level
"""

spark.sql(sql).explain()

执行计划如下:我们可以看到分成了三个stage,对常量进行了优化,预先计划好,中间有两次shuffle;
该段sql,如果是hive执行计划,则是一个mr过程

在这里插入图片描述

参数优化

yarn单节点参数:内存yarn.nodemanager.resource.memory-mb;cpu核数:yarn.nodemanager.resource.cpu-vcores;可以结合服务器台数及集群资源使用情况,合理分配spark计算资源;

一个executor由一个yarn的Container执行,一个executor设置的内存和cpu核心数要小于yarn对Container资源配置
单个Container
最大cpu数:yarn.scheduler.maximum-allocation-vcores
最大内存:yarn.scheduler.maximum-allocation-mb
更多属性可以看yarn的配置文件或者后台Configuration
在这里插入图片描述

spark_df与pandas_df之间的转化

提速,可以添加参数:spark.conf.set("spark.sql.execution.arrow.enabled",True)
spark_df.toPandas()过程,会将数据回收到driver内存中,如果内存溢出需调整回收driver最大内存参数spark.driver.maxResultSize,样例如下:设置最大32g

spark = spark = SparkSession.Builder()\
	.config("spark.driver.maxResultSize","32g")\
	.enableHiveSupport()\
    .getOrCreate()

广播join

类似与hive中的mapjoin
参数:spark.sql.autoBroadcastJoinThreshold-1时,表示禁用广播join,默认是小表10mb,开启小表广播join;

语句优化

数据倾斜

  1. 过滤倾斜的key,比如业务中爬虫异常key,null
    可以使用df.sample(n)抽样找出倾斜异常key,再df.filter(func)过滤掉倾斜key如果key中的null倾斜需要保留,我们可以将null数据单独拿出来进行处理,比如:
-- 假设a.mobile存在大量的null倾斜
select a.id
  ,a.mobile
  ,b.fields
from table_a
left join table_b
on nvl(a.mobile,rand()) = b.mobile  

-- 或者使用union all改写,单独摘出来再拼接上去
select a.id
  ,a.mobile
  ,b.fields_name
from table_a a 
left join table_b b
on a.mobile=b.mobile  
where a.mobile is not null 
union all 
select a.id,a.mobile,null as fields_name
from table_a a
where a.mobile is null 

-- 过滤异常key
select groupby_field
  ,count(1) as cnt 
from table_a
where groupby_field <> '异常key'
group by groupby_field
  1. 增加shuffle并行度,如果各个key的数据量整体差异不大,task < executor_num(executor个数) * executor_cores(每个executor的核心数),我们可以考虑增加task数量,来充分利用计算资源;spark.sql.shuffle.partitions参数可以设置并行度(默认是200),一般设置每核跑1-3个task,磁盘io时可以充分利用计算资源。
    spark中有很多算子有指定并行度参数,比如:
    textFile(xx,minnumpartition)
    sc.parallelize(xx,num)
    sc.makeRDDD(xx,num)
    sc.parallelizePairs(List[Tuple2],num)
    redduceByKey(xx,num)groupByKey(xx,num),join,distinct
    repartition,coalesce
    spark.default.parallelism在sparksql中并行度由spark.sql.shuffle.partitions决定

  2. 双重聚合,类似于hive中的groupby倾斜参数set hive.groupby.skewindata=true,用两个mr计算作业,第一个mr中的key随机分发聚合,第二个mr做全局聚合;比如:

select groupby_field
  ,sum(cnt) as cnt   -- 全局聚合
from 
(  -- key打散聚合
  select ceiling(rand() * 10) as rnd  -- 添加随机数打散
    ,groupby_field   -- 分组字段
    ,count(1) as cnt  
  from table_name
  group by ceiling(rand() * 10),groupby_field
) t 
group by groupby_field
  1. reduce的joion改写成mapjoin,如果存在小表情况下,可以使用mapjoin,将小表回收到driver端,再广播到各个执行的executor上应用map关联;此场景使用于大表join小表的情况;
    这里需要注意,在外连接时,比如left join或者right join,小表是主表,mapjoin不生效
select /*+mapjoin(b)*/ a.id
  ,b.fields_name
from table_a a
join table_b b  -- b小表
on a.id=b.id
  1. join中倾斜key单独摘出来操作。在hive中会有join倾斜参数,hive.optimize.skewjoin=true;它会将join作业拆分成两个MR,对于倾斜健部分单独摘出来使用mapjoin处理,非倾斜键走正常reduce的join。在spark中,如果倾斜键数据符合大表+小表原则,也可以使用该策略。如果倾斜健两个表的数据都比较大,大表倾斜部分同一个key添加n种前缀,小表膨胀倾斜健部分膨胀n倍,倾斜部分join,再union 非倾斜部分join
select  a.id,a.field_a,b.field_b
from 
( -- 加入随机数
  select id,field_a,ceiling(rand()*10) as rnd_name
  from table_a
  where  a.id in ('倾斜健')
) a 
join 
( -- 数据膨胀
  select id,subview.rnd_name,field_b
  from table_b b
  lateral view explode(array(1,2,3,4,5,6,7,8,9,10))  subview as rnd_name
  where b.id in ('倾斜健')
) b 
on a.id=b.id  and  a.rnd_name=b.rnd_name
union all   -- 拼接非倾斜部分的join
select  a.id,a.field_a,b.field_b
from table_a a 
join table_b b 
on a.id=b.id 
where a.id not in ('倾斜健') and b.id  not in ('倾斜健')

对于rdd计算优化,在代码层面,如果rdd多次使用使用cache(),persist()持久化
尽量避免shuffle类算子,尽量使用有map端聚合算子,比如reduceByKey,aggregateByKey(可以自定义map端聚合函数,自定义初始记录),combineByKey(类同aggregateByKey,初始记录为rdd数据行):可以减少shuffle write数据量,shuffle读数据量,redduce端聚合次数;
尽量使用高性能算子,比如用reduceByKey取代groupByKey;使用mapPartitions取代map;数据filter过滤后使用coalse减少分区
使用广播变量,比如mapjoin


待更新。。。。。。

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

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

相关文章

【数据结构与算法】线性表 01 链表

一、线性表1.1 概念与特点1.2 线性表的存储结构1.3 常见操作1.4 应用场景 二、链表2.1 链表简介2.2 单向链表&#xff08;单链表&#xff09;2.21 基本概念2.22 单链表基本操作2.23 C语言实现 2.3 双向链表2.4 循环链表 一、线性表 线性表是一种最基本、最简单的数据结构&…

Windows下安装及使用pip

首先查看Windows系统下是否安装有pip。终端执行下面命令&#xff1a; pip list # 查看Python中安装了哪些第三方库如果出现 ModuleNotFoundError: No module named ‘pip‘ 则说明系统里未安装成功pip。 那么可以先把pip安装上。安装pip可以选择 在线安装 或者 离线安装 两…

网络配置心得-从switch网络加速出发

背景&#xff1a; 在PC上玩战地5饱受外挂毒打&#xff0c;早想接触主机游戏又没有机会。最近突然有个好机遇带我入坑switch&#xff0c;那肯定得赶紧体验一下啊~~ 被安利的游戏是斯普拉遁3&#xff08;splatoon3&#xff09;&#xff0c;是一款switch独占的第三人称射击游戏&a…

chatgpt赋能python:Python将yyyymmdd转换成yyyy-mm-dd的方法

Python将yyyymmdd转换成yyyy-mm-dd的方法 Python语言不仅易于学习&#xff0c;而且是一种功能强大的语言&#xff0c;广泛应用于数据分析、人工智能和Web开发等领域。在实际开发过程中&#xff0c;我们经常遇到需要将日期格式转换为其他格式的需求。本文将介绍如何使用Python将…

抖音账号矩阵系统|源码|开源代码独立部署难度

抖音账号矩阵系统&#xff0c;短视频账号矩阵系统源码&#xff0c; 短视频矩阵是一种常见的视频编码标准&#xff0c;它通过将视频分成多个小块并对每个小块进行压缩来实现高效的视频传输。在本文中&#xff0c;我们将介绍短视频矩阵的原理和实现&#xff0c;并提供示例代码。 …

谈谈IPv6

最近&#xff0c;在B站看到一个讲解IPv6背景的视频比较热门&#xff0c;而评论区则对IPv6技术有许多误解&#xff0c;这也反映出大家或许对这一新的协议不够了解&#xff0c;本文就谈谈我们生活中的IPv6。 另&#xff1a;前述的B站视频地址电子监听、全国断网&#xff0c;棱镜…

Spring Boot 监听器详解

Spring Boot 3.x系列文章 Spring Boot 2.7.8 中文参考指南(一)Spring Boot 2.7.8 中文参考指南(二)-WebSpring Boot 源码阅读初始化环境搭建Spring Boot 框架整体启动流程详解Spring Boot 系统初始化器详解Spring Boot 监听器详解 监听器的介绍 通过前面的几篇文章&#xff0c…

基于三种机器学习模型的岩爆类型预测及Python实现

写在前面 由于代码较多&#xff0c;本文仅展示部分关键代码&#xff0c;需要代码文件和数据可以留言 然而&#xff0c;由于当时注释不及时&#xff0c;且时间久远&#xff0c;有些细节笔者也记不清了&#xff0c;代码仅供参考 0 引言 岩爆是深部岩土工程施工过程中常见的一种地…

GitHub创建新的项目

想把最近自己做的一些东西整理一下上传到网上进行保存&#xff0c;然后就想到了Github&#xff0c;结果发现自己不会上传&#xff0c;所以去BiliBili大学学习了一下&#xff0c;一下内容主要参考《【程序员一定要掌握的技巧】使用Git上传本地代码到GitHub教程》。 使用Git上传本…

Win10每次开机鼠标桌面右键都会显示撤销删除解决方法

Win10每次开机鼠标桌面右键都会显示撤销删除解决方法分享。有用户电脑开机的时候&#xff0c;就会自动弹出撤销删除的窗口了。那么这个问题是怎么回事呢&#xff1f;接下来我们就一起来看看以下的详细操作方法教学吧。 情况一&#xff1a; 如果是联想&#xff0c;在联想管家把联…

Android 中的 NDK 到底是什么?(详细解析+案例实战)

NDK 提供了一系列的工具&#xff0c;帮助开发者快速开发 C (或 C )的动态库&#xff0c;并能自动将 so 和 java 应用一起打包成 apk&#xff1b;这些工具对开发者的帮助是巨大的 什么是 NDK &#xff1f; Android 原生开发包 NDK(Native Delopment kits )将用于 Android 平台上…

Vue中process.env关键字,process.env.VUE_APP_BASE_API

1.process.env 是Node.js 中的一个环境 打开命令行查看环境&#xff1a; 2.process.env与Vue CLI 项目 Vue Cli 有以下三种运行模式 development 模式用于 vue-cli-service serve test 模式用于 vue-cli-service test:unit production 模式用于 vue-cli-service build 和 vue-c…

pip安装教程 python(针对于Windows系统)

1.什么是pip pip 是 Python 包管理工具&#xff0c;该工具提供了对Python 包的查找、下载、安装、卸载的功能。 目前如果你在 python.org 下载最新版本的安装包&#xff0c;则是已经自带了该工具。 pip 官网&#xff1a;https://pypi.org/project/pip/ 2.判断本机是否安装p…

chatgpt赋能python:Python中如何将NaN变为0

Python中如何将NaN变为0 Python是一种动态、强类型的编程语言&#xff0c;因其简单易学、功能强大&#xff0c;被广泛应用于各种领域。其中NumPy和Pandas是数据科学界最常用的Python库&#xff0c;而在数据处理中&#xff0c;处理缺失值通常是必不可少的。本文将介绍如何使用P…

学成在线----day3

1、JSR303校验 对填入的数据自动做一些约束 package com.xuecheng.content.model.dto;import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data;import javax.validation.constraints.NotEmpty; import javax.validati…

PyCharm安装教程(2023年,3月)

下载PyCharm之前需要准备下载Python 链接&#xff1a;Python安装教程 一、PyCharm下载 1、进入JetBrains官网&#xff1a; 官网地址&#xff1a;https://www.jetbrains.com/ 2、点击【Developer Tools】 开发者工具&#xff0c;选择【PyCharm】点击跳转到PyCharm界面。点击…

【Docker】 7.Docker Internet

文章目录 Docker InternetDocker Internet CommandDocker Bridge Internetdocker Host InternetDocker Container InternetDocker None Internet Docker Internet Docker 网络架构采用的设计规范是CNM&#xff08;Container Network Model&#xff09;。CNM中规定了Docker网络…

RK3588平台开发系列讲解(同步与互斥篇)自旋锁死锁实验

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、自旋锁死锁二、实验程序的编写2.1、驱动程序编写2.2、编写测试 APP沉淀、分享、成长,让自己和他人都能有所收获!😄 📢自旋锁若是使用不当就会产生死锁,在本篇将会对自旋锁的特殊情况-死锁进行讲解。 一、自…

0801详解-redux-react

文章目录 1 redux1.1 概述1.2 示例实现页面数字的加、减1.3 异步加-异步action 2 react-redux2.1 概述2.2 优化示例代码 3 数据共享4 redux开发者工具5 小结5.1 求和案例_redux精简版5.2 求和案例_redux完整版5.3 求和案例_redux异步action版5.4 求和案例_react-redux基本使用5…

【哈士奇赠书活动 - 25期】-〖Python自动化办公应用大全(ChatGPT版) 〗

文章目录 ⭐️ 赠书 - 《Python自动化办公应用大全&#xff08;ChatGPT版&#xff09;》⭐️ 内容简介⭐️ 作者简介⭐️ 编辑推荐⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《Python自动化办公应用大全&#xff08;ChatGPT版&#xff09;》 ⭐️ 内容简介 本书全面系统地介绍了P…