SparkSql oom原因以及参数调优+数据倾斜解决方案

1、Spark历史版本对比

spark1 vs spark2 vs spark3 

1、spark1引入内存计算的理念,解决中间结果落盘导致的效率低下。在理想状况下性能可达到MR的100倍。虽然提高了一定的计算效率,但也带来了大量的内存管理问题,典型的如内存oom问题频发。

2、spark2引入了Tungsten引擎,关键算子效率上比Spark1提升了10倍。启用“统一内存管理”,不再使用“静态内存管理”,不再使用“静态内存管理”,oom问题大幅下降

3、spark3启用自适应查询(Adaptive Query Execution)

  • 1.动态合并shuffle partitions

    可以简化甚至避免调整shuffle分区的数量。用户可以在开始时设置相对较多的shuffle分区数,AQE会在运行时将相邻的小分区合并为较大的分区。

  • 2.动态调整join策略

    在一定程度上避免由于缺少统计信息或着错误估计大小(当然也可能两种情况同时存在),而导致执行次优计划的情况。这种自适应优化可以在运行时sort merge join转换成broadcast hash join,从而进一步提升性能

  • 3.动态优化倾斜的join(skew joins)

    skew joins可能导致负载的极端不平衡,并严重降低性能。在AQE从shuffle文件统计信息中检测到任何倾斜后,它可以将倾斜的分区分割成更小的分区,并将它们与另一侧的相应分区连接起来。这种优化可以并行化倾斜处理,获得更好的整体性能。

Spark内存管理:https://zhuanlan.zhihu.com/p/642722131?utm_id=0

2、SparkSql oom的因素

sparksql oom的因素是多样的,一个程序,从输入、处理2个方面进行考量

2.1 输入数据因素

1、文件格式&压缩

目前我司新建表默认使用parquet格式

 对于snappy压缩,hivesql参考表的“parquet.compression”属性决定是否压缩,采用什么压缩方法,sparksql遇到parquet表默认snappy压缩。

  • parquet相比于text、csv格式普遍有3-4倍的压缩比
  • snappy相比于非压缩普遍有3-4倍的压缩比
  • parquet+snappy相比于原始的text、csv达到6-8倍的压缩比,甚至更高

2、数据文件的大小

  数仓集群默认的文件大小是256M,大数据是分布式计算,普遍存在倾斜不均的情形,加之程序自身的控制,造成了数据文件的大小不一。

  尽管spark有输入数据的拆分能力,但扔存在拆分不均匀的可能。例如:原始文件的大小为300M,将拆分为256M+44M 2个文件,他们的数据规模相差5.8倍。按照1个task处理一个文件的设定,分得256M文件的task将更容易出现oom

3、数据的型态分布

  如字段中包含大量的null、枚举字段大量的相同值等,parquet+snappy将导致实际压缩比进一步提升。

4、大字段如xml,json

  string字段类型,如其中存储的是xml、json等字段(字符长度达千、万字符数级的称为大字段),parquet+snappy导致实际压缩比进一步提升

2.2 运行环境因素

  环境因素也是oom的重要原因,表现在spark默认参数、yarn集群稳定性

1、spark默认参数

  定义在集群的spark.defaults中,每一个提交到集群的spark作业都默认使用这套参数。影响oom的主要参数:

  • spark.executor.cores=4 --executor 4cpu,可并行运行4 task

  • spark.executor.memory=12g --executor 12g内存,task间共享(不建议调整)

  • spark.executor.memoryOverhead=2g --executor 2g堆外内存,task间共享(不建议调整)

  • spark.sql.files.maxPartitionBytes=268435456(256m) --读取数据文件时,单个partition或task最大256m、文件超过256m即拆分

  • spark.sql.adaptive.coalescePartitions.initialPartitionNum=none --aqe动态计算shuffle阶段partitions的最大值,none时向下取spark.sql.shuffle.partitions

  • spark.sql.shuffle.partitions=400 --shuffle阶段最大400个partition,数据规模很大建议调整

  在spark ui 中可以观察任务的具体参数值

2、yarn集群稳定性

  yarn集群稳定性包括yarn资源调度、yarn节点负载高低等。

3、Spark sql的参数调优

1、input阶段

  input阶段将表或数据文件加载到executor,先进行解压(如果有,比如snappy)、展开(比如parquet、orc格式),这些都是在内存中进行,内存不足时是不可溢写磁盘的。

  • 数据文件(拆分后大小差异导致oom)

  • 数据文件(拆分后)大小相似,大JSON字段、高压缩比导致oom

 2、shuffle阶段

  当sql出现出现distinct join、groupby等关键字时,spark需要进行shuffle操作。shuffle操作将前一个或多个阶段的分片数据拉取到同一个excutor进行聚合处理(即我们通常说的reduce),如shuffle partition或者说task数过小,oom是大概率时间。

  • shuffle阶段概要:多少个task执行读/写操作

  •  shuffle阶段详情:读/写是否均匀、是否倾斜

 3.1 参数调优

    目前executor默认配置的是12G+2G内存、4核CPU,最大可以有4个task同时并行(每颗CPU执行一个task),这4个task共享14G内存。日常调优可以如下:

  1、spark.executors.cores

    不论在哪个阶段发生oom,降低executor的负载总是可行的。可调整spark.executor.cores=2,即单个executor同时执行2个task,这样每个task大约可使用7G内存。

  2、spark.sql.adaptive.coalescePartitions.initialPartitionNum/spark.sql.shuffle.partitions

    shuffle阶段的oom,说明shuffle partitions数比较小,导致上阶段的“大规模数据”在本阶段“更聚集”。可调整该参数为更大的值,使大规模数据更分散。

  • spark1,没有spark.sql.adaptive.coalescePartitions.initialPartitionNum参数,固定partitions值为400,调大会造成碎片化
  • spark2,没有spark.sql.adaptive.coalescePartitions.initialPartitionNum参数,可调整spark.sql.shuffle.partitions(配合AQE效果不错)
  • spark3,优先调整spark.sql.adaptive.coalescePartitions.initialPartitionNumtions(是AQE的系列参数之一,默认none时向下取spark.sql.shuffle.partitions)

    *注意:更大的shuffle partitions数固然能减轻shuffle阶段的oom概率,但需要向集群申请更多的服务器资源,不可无限调大(建议控制在2000以内)

方案实现原理:增加shuffle read task的数量,可以让原本分配给一个task的多个key分配给多个task,从而让每个task处理比原来更少的数据。举例来说,如果原本有5个 key,每个key对应10条数据,这5个key都是分配给一个task的,那么这个task就要处理50条数据。而增加了shuffle read task以后,每个task就分配到一个key,即每个task就处理10条数据,那么自然每个task的执行时间都会变短了。

3、spark.sql.files.maxPartitionBytes

  对于input阶段出现的oom,通常原因是输入数据的超高压缩比,如:json、xml大字段、null值占比高、枚举字段多等。

  spark.executor.cores值仍不起作用时,可逐步调小spark.sql.files.maxPartitionBytes=134217728(128m)/67108864(64m)

  调小spark.executor.cores、spark.sql.files.maxPartitionBytes值的本质都是减小executor的负载,spark.executor.cores减少了task的并行度,而spark.sql.files.maxPartitionBytes减小了单个task处理的数据规模。所以:

  •   优先调整spark.executor.cores,验证是否扔有oom
  •   确认不起作用后,再调整spark.sql.files.maxPartitionBytes,此时建议恢复spark.executor.cores的值(如不恢复,相当于2*2=4倍的负载降低、对于单executor14g的内存资源是巨大浪费)

  *注意:spark.sql.files.maxPartitionBytes不建议调得过小(比如32m、16m),过小需要向集群申请更多executor及计算资源、集群负载增大,也可能导致数据文件碎片化

4、数据倾斜解决方案

https://download.csdn.net/blog/column/8735546/111667492

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

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

相关文章

javaEE-02-servlet

文章目录 Servlet 技术servlet程序示例通过实现Servlet接口实现Servlet程序通过继承 HttpServlet 实现 Servlet 程序 Servlet的声明周期 ServletConfig 类ServletContext 类HttpServletRequest 类请求的转发 HttpServletResponse 类请求重定向 HTTP 协议GET 请求Post请求常用请…

LINUX -exec函数族

1、功能: *让父子进程来执行不相干的操作 *能够替换进程地址空间的代码.text段 *执行另外的程序,不需要创建额外的的地址空间 *当前程序中调用另外一个应用程序 2、执行目录下的程序: *指定执行目录下的程序 int execl(const char *path,…

网工最常用的10个网络命令,但凡有一个不会用都不算资深网工。

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 当网工,日常工作不仅需要面对各种各样的网络设备和配置,还需要处理不断出现的网络故障…

SpringBoot集成Sharding-JDBC实现分库分表

本文已收录于专栏 《中间件合集》 目录 版本介绍背景介绍拆分方式集成并测试1.引入依赖2.创建库和表3.pom文件配置3.编写测试类Entity层Mapper接口MapperXML文件测试类 4.运行结果 自定义分片规则定义分片类编写pom文件 总结提升 版本介绍 SpringBoot的版本是: 2.3.…

使用DataGrip连接DM达梦数据库(手动添加达梦数据库驱动)

文章目录 一、准备达梦数据库驱动从官网下载驱动下载后,解压,本次选择,DmJdbcDriver18安装: 二、配置达梦驱动打开DataGrip,点击左上角的"Database Explorer"下的加号按钮,选择"Driver"…

秋招复习笔记——八股文部分:网络TCP

TCP 三次握手和四次挥手 TCP 基本认识 序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号&#xf…

数据隐私保护与区块链技术的结合:新兴趋势分析

在当今数字化时代,数据隐私保护成为了一个备受关注的重要话题。随着个人数据的不断生成和流通,如何有效保护用户的隐私成为了技术创新的一个重要方向。区块链技术作为一种去中心化、安全性高且可追溯的技术手段,正在逐渐成为解决数据隐私保护…

aiohttp 的使用

基本介绍 aiohttp 是一个基于 asyncio 的异步 HTTP 网络模块, 它即提供了服务端, 又提供了客户端。其中,我们用服务端可以搭建一个支持异步处理的服务器,这个服务器就是用来处理请求并返回响应的,类似于 Django , Fla…

Ansible的脚本-----playbook剧本【下】

目录 实战演练六:tags 模块 实战演练七:Templates 模块 实战演练六:tags 模块 可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。 playboo…

一个注解解决重复提交问题

一、前言 ​ 在应用系统中提交是一个极为常见的功能,倘若不加管控,极易由于用户的误操作或网络延迟致使同一请求被发送多次,从而生成重复的数据记录。针对用户的误操作,前端通常会实现按钮的 loading 状态,以阻…

行业不同怎么选企业管理咨询公司

在选择企业管理咨询公司时,不同行业的企业往往面临着各自独特的挑战和需求。因此,选择一家适合自身行业特点、能够提供专业且有针对性的咨询服务的管理咨询公司至关重要。本文将从行业差异的角度出发,探讨如何根据企业所在行业的不同&#xf…

SQL-REGEX-常见正则表达式的使用

SQL-REGEX-常见正则表达式的使用 在SQL中,正则表达式(Regex)的使用可以帮助进行更灵活和精确的模式匹配和数据筛选。不同的数据库管理系统对于正则表达式的支持略有差异,但大体都是相似的。 Tips: 模式描述匹配内容…

【python】PyQt5中QCommandLinkButton的详细教程与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

【Linux】socket 套接字 / 序列化与反序列化

目录 一. TCP 网络程序简易计算器1. 核心功能2. 程序结构3. 服务器初始化4. 服务器启动5. 业务处理6. 客户端初始化7. 客户端启动 二. 序列化与反序列化1. 协议2. 序列化与反序列化 一. TCP 网络程序 简易计算器 1. 核心功能 客户端向服务器发送数据, 服务器进行计算并返回结…

墨烯的C语言技术栈-C语言基础-018

char c; //1byte字节 8bit比特位 int main() { int a 10; //向内存申请四个字节,存储10 &a; //取地址操作符 return 0; } 每个字节都有地址 而a的地址就是它第一个字节的地址 要先开始调试才可以查看监控和查看内存 左边是地址 中间是内存中的数据 最后面的是…

Jenkins - apt 安装软件包 404 Not Found

Jenkins - apt 安装软件包 404 Not Found 引言关于 apt解决 apt 安装软件包 404 问题问题分析解决方案 引言 日常 Jenkins job 运行,有段时间会遇到 apt 安装软件包 404 的情况,这种情况不是每次都发生的,但是会导致 Jenkins 失败&#xff0…

【HTML — 构建网络】HTML 入门

在本文中,我们将介绍 HTML 的绝对基础知识。为了帮助您入门,本文定义了元素、属性以及您可能听说过的所有其他重要术语。它还解释了这些在 HTML 中的位置。您将学习 HTML 元素的结构、典型的 HTML 页面的结构以及其他重要的基本语言功能。在此过程中,也将有机会玩转 HTML! …

上传项目到GitHub

上传项目到GitHub 前期工作:创建GitHub仓库 1.使用git命令初始化文件夹 git init2.将文件夹里面所有的文件添加到本地仓库,如果想添加单个文件,将.换成文件名就好。 git add .3.给文件备注,双引号里面是文件备注的内容 git c…

大揭秘:百度云提供支持的智能审核机制是什么?

在论坛、社媒等公共空间里,用户不仅能自主上传信息,还可以通过评论、群聊等方式进行互动。 如果不对信息进行审核,平台可能会涌现大量包含暴力、仇恨、淫秽或其他不当内容的帖子。用人工方式一条条审核信息,不仅成本高、效率低、…

C 观察者模式 Demo

目录 一、基础描述 二、Demo 最近需要接触到 MySQL 半同步插件,发现其中用到了观察者模式,之前没在 C 中用过,遂好奇心驱使下找了找资料,并写了个 Demo。 一、基础描述 观察者设计模式(Observer Pattern&#xff0…