大数据技术架构(组件)31——Spark:Optimize--->JVM On Compute

news2024/12/25 15:31:03

2.1.9.4、Optimize--->JVM On Compute

首要的一个问题就是GC,那么先来了解下其原理:

1、内存管理其实就是对象的管理,包括对象的分配和释放,如果显式的释放对象,只要把该对象赋值为null,即该对象变为不可达.GC将负责回收这些不可达对象的内存空间。

2、GC采用有向图的方式记录并管理堆中的所有对象,通过这些方式来确定哪些对象是可达的,哪些对象是不可达的。根据上图的JVM内存分配来看,当Eden满了之后,一个小型的GC将会被触发,Eden和Survivor1中幸存的仍被使用的对象被复制到Survivor2中。同时Survivor1和Survivor2区域进行交换,当一个对象生存的时间足够长,或者Survivor2满了,那么就会把存活的对象移到Old代,当Old空间快满的时候,这个时候会触发一个Full GC.

根据以上简单对GC的回顾,Spark GC调优的目的是确保Old代只存生命周期长的RDD,Young 代只保存短生命周期的对象,尽量避免发生Full GC。

那么这里梳理一下spark中关于Jvm的一些参数调优以及一些调优步骤:

1、针对MetaSpace:

-XX:MetaspaceSize:初始化元空间的大小

-XX:MaxMetaspaceSize:最大元空间大小

-XX:MinMetaspaceFreeRatio:扩大空间的最小比率,当GC后,内存占用超过这一比率后,就会扩大空间

-XX:MaxMetaspaceFreeRatio:缩小空间的最小比率,当GC后,内存占用低于这一比率,就会缩小空间。

默认的Metaspace只会受限于本地内存大小,当Metaspace达到MetaSpaceSize的当前大小时,就会触发GC.

2、GC查看步骤:

2.1、首先查看GC统计日志观察GC启动次数是否太多,可以给JVM设置参数-verbose:GC -XX:+PrintGCDetails,那么就可以在Worker日志中看到每次GC花费的时间;如果某个任务在结束之前,多次发生了Full GC,那么说明执行该任务的内存不够

spark-submit --name "app-name" \

--master local[4] \

--conf spark.shuffle.spill=false \

--conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" \

jar_name.jar

2.2、如果GC信息显示,Old代空间快满了,那么可以降低spark.memory.storageFraction来减少RDD缓存占用的内存。先不要考虑执行性能问题,先让程序跑起来再说

2.3、如果Major GC比较少,但是Minor GC比较多,可以把Eden内存调大些。

3、计算内存和存储内存调整(钨丝计划就是专门来解决JVM性能问题的)

两者之间没有硬性界限,可以相互借用空间,通过参数spark.memory.fraction(默认0.75)来设置整个堆空间的比例。

spark.storage.memoryFraction:设置RDD持久化数据在Executor内存能占用的比例,默认是0.6;如果作业有较多的RDD持久化的话,那么该参数值可以调高些,避免内存不够缓存所有的数据,导致溢写磁盘;如果作业中shuffle类操作比较多,且频繁发生GC,那么可以适当调低该参数值。

spark.yarn.executor.memoryoverhead:如果数据量很大,导致Stage内存溢出,导致后面的Stage无法获取数据,如出现Shuffle file not found、Executor Task lost、Out Of Memory等问题时,可以调整该参数增大堆外内存。

spark.core.connection.ack.wait.timeout:当然对于not found ,file lost问题也可能是因为某些task去其他节点上拉取数据,而该节点正好正在进行GC,导致连接超时(默认60s),那么可以试着调大该参数值。

spark.shuffle.memoryFraction:设置shuffle过程一个task拉取上一个Stage的task输出后,进行聚合操作时能够使用Executor内存的比例,默认是0.2;如果shuffle使用的内存超过了这个限制,那么就会把多余的数据溢写到磁盘中,如果作业中RDD持久化的操作比较少的话,shuffle比较多的话,那么可以调大该值,降低缓存内存占用比例。

2.1.9.5、Optimize--->Shuffle On Compute

更详细的参数配置见2.1.8.6部分。

1、使用Broadcast实现Mapper端Shuffle。

也就是常说的MapJoin,即将较小的RDD进行广播到Executor上,让该Executor上的所有Task都共享该数据

2、Shuffle传输过程中的序列化和压缩。

序列化和压缩

spark.serializer=org.apache.spark.serializer.KryoSerializer

spark.shuffle.compress=true

spark.shuffle.spill.compress=true

spark.io.compression.codec=snappy

使用KryoSerializer的原因是因为其支持relocation,也就是说在把对象进行序列化之后进行排序,这种排序效果和先对数据排序再序列化是一样的。这个属性会在UnsafeShuffleWriter进行排序中用到。

3、为了避免Spark下的JVM GC可能会导致Shuffle拉取文件失败的问题,可以使用以下措施:

3.1、调整获取Shuffle数据的重试次数,默认是3次

3.2、调整获取Shuffle数据重试间隔,通过spark.shuffle.io.retryWait参数配置,默认为5s

3.3、适当增大reduce端的缓存空间,否则会spill到磁盘,同时也减少GC次数,可以通过spark.reducer.maxSizeInFlight参数配置

3.4、ShuffleMapTask端也可以增大Map任务写缓存,可以通过spark.shuffle.file.buffer,默认为32k

3.5、可以适当调大计算内存,减少溢写磁盘。

2.1.9.6、Optimize---->Data Skew

spark层面的数据倾斜定位可以通过以下几个方面:

1、通过spark web ui界面,查看每个Stage下的每个Task运行的数据量大小

2、通过Log日志分析定位是在哪个Stage中出现了倾斜,然后再定位到具体的Shuffle代码

3、代码走读,重点看Join,各种byKey的关键性代码

4、数据特征分布分析

针对数据倾斜有以下几种解决手段:

2.1.9.6.1、聚合过滤导致倾斜的Keys

可过滤针对业务逻辑中不需要的倾斜数据,例如无效数值

2.1.9.6.2、提高并行度

其主要思想在于把一个Task处理的数据量拆分为多份给不同的task进行处理,进而减轻Task的压力,其本质在于数据的分区策略。

例如

1、通过repartition或者coalesce进行重分区

2、对外部数据读取设置最小分区数

3、在使用涉及到shuffle类算子时,可以显示指定分区数(默认spark会推导分区数)

4、设置默认spark.default.parallelism并行度

2.1.9.6.3、随机Key二次聚合

使用场景:对于各种byKey操作,可以将每个key通过加上随机数前缀进行拆分,先做局部聚合,然后将随机数拆掉在做全局聚合。

2.1.9.6.4、MapJoin

使用场景:两个RDD的数据量,其中一个RDD的数据量特别小,可以放到内存中。

2.1.9.6.5、采样倾斜Key单独处理

使用场景:两个RDD进行join操作,如果一个RDD倾斜严重,那么可以通过采样方式进行拆分,然后再分别和另外一个RDD进行join,最后把结果进行union。

2.1.9.6.6、随机Join

使用场景:两个RDD中的某一个Key或者某几个Key对应的数量很大,那么在Join的时候会发生倾斜。可以将RDD1中的一个或者几个Key加上随机数前缀,然后RDD2在相同的Key上做同样的处理。

2.1.9.6.7、扩容Join

使用场景:如果两个RDD的倾斜Key特别多,则可以将其中一个RDD的数据进行扩容N倍,另一个RDD的每条数据都打上一个n以内的随机前缀,最后进行join

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

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

相关文章

ISYSTEM调试实践9-winIDEA Analyzer功能2

上一篇文章介绍了如何启动Trace,并配置。本文简单介绍一下Analyzer的输出结果,具体每个窗口的内容。 1、程序溯源 Profiler Timeline介绍了函数在时间轴上的执行调用情况。鼠标左键可以设置具体时间点,CTRL 左键和CTRL 右键设置观测的时间窗口&#xf…

技术树基础——16排它平方数(Bigdecimal,int,string,数组的转换)

题目:03879 * 203879 41566646641这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个,请你…

openFeign源码学习

openFeign这个框架要解决的问题是:通常在调用远程接口的时候,如果是http请求,需要我们通过restTemplate去拼接调用参数和连接,然后发起调用,openFeign帮我们把拼接参数的这个过程包装了起来,通过代理对象的…

[WUSTCTF2020]level1 题解

1.查壳 64bit elf 还有一个文本文件,打开 打开是一串数字 根据这个txt文件的名称Output,可以猜测,这个文件的内容可能是程序的输出 2.静态分析 找到main函数反汇编 v7 __readfsqword(0x28u); stream fopen("flag", "r…

二叉搜索树之AVL树

AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决上…

PCCW-HKT Futurera NFT 作品集来袭!

欢迎来到 Futurera,未来的虚拟城市! 凭借庞大的 web2 资源,在全球首创的虚拟 5G 移动网络技术的鼎力支持下,Futurera 正力争跨越元宇宙的边界。 NFT 系列介绍 为庆祝 The Sandbox 中 Futurera 体验的开放,我们发布了一…

LSTM已死,Transformer当立(LSTM is dead. Long Live Transformers! ):下

2017 年,Google 在论文 Attention is All you need 中提出了 Transformer 模型,其使用 Self-Attention 结构取代了在 NLP 任务中常用的 RNN 网络结构。而且实验也证明Transformer 在效果上已经完败传统的 RNN 网络。Transformer 的整体模型架构如下图所示。尽管它看起来还是很…

python网络爬虫—快速入门(理论+实战)(七)

系列文章目录 (1)python网络爬虫—快速入门(理论实战)(一) (2)python网络爬虫—快速入门(理论实战)(二) (3) p…

平价款的血糖血压监测工具,用它养成健康生活习惯,dido F50S Pro上手

之前看有数据显示国内的三高人群越来越年轻,很多人不到三十就有了高血压、高血糖的问题,埋下了不小的健康隐患,加上前阵子的疫情管控放松,人们了解到了新冠病毒对心脏负担的认知,预防慢病被大众提上了日程,…

获取成员userID

文章目录一、简介二、获取token1、获取秘钥2、获取Token三、获取部门数据1、获取部门列表2、获取子部门ID列表3、获取单个部门详情四、获取成员信息1、读取成员2、获取部门成员3、获取部门成员详情一、简介 同步数据到企微: 企业如果需要从自有的系统同步通讯录到…

操作系统systemd启动自启服务进程

概念与背景 Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。历史上,Linux 的启动一直采用init进程。在ubuntu18.04以后,都采用systemd启动。 更换主要原因是init进程有两个原因 启动时间长。init进…

Java高级-多线程

本篇讲解java多线程 基本概念: 程序、进程、线程 **程序(program)**是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 **进程(process)**是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程…

12年老外贸的经验分享

回想这12年的经历,很庆幸自己的三观一直是正确的,就是买家第一不管什么原因,只要你想退货,我都可以接受退款。不能退给上级供应商,我就自己留着,就是为了避免因为这个拒收而失去买家。不管是什么质量原因&a…

2022年11月软考领证通知

纸质证书领取时间 根据往年各地软考证书的领取时间看,上半年软考证书领取一般在10月底陆续开始,下半年的证书领取时间一般在次年2/3月份左右开始(各地证书领取具体时间不一样,届时请多留意当地证书领取通知。) 1、证…

PyTorch学习笔记:nn.LeakyReLU——LeakyReLU激活函数

PyTorch学习笔记:nn.LeakyReLU——LeakyReLU激活函数 功能:逐元素对数据应用如下函数公式进行激活 LeakyReLU(x)max⁡(0,x)α∗min⁡(0,x)\text{LeakyReLU}(x)\max(0,x)\alpha*\min(0,x) LeakyReLU(x)max(0,x)α∗min(0,x) 或者 LeakyReLU(x){x,ifx≥0α…

在浏览器输入url到发起http请求,这过程发生了什么

当用户输入url,操作系统会将输入事件传递到浏览器中,在这过程中,浏览器可能会做一些预处理,比如 Chrome 会根据历史统计来预估所输入字符对应的网站,例如输入goog,根据之前的历史发现 90% 的概率会访问「ww…

1理想的大数据处理框架设计

以下内容基于极客 蔡元楠老师的《大规模数据处理实战》做的笔记哈。感兴趣的去极客看蔡老师的课程即可。 MapReduce 缺点 高昂的维护成本 因为mapreduce模型只有map和reduce两个步骤。所以在处理复杂的架构的时候,需要协调多个map任务和多个reduce任务。 例如计…

C#开发的OpenRA的扩展方法

C#开发的OpenRA的扩展方法 在我们以往的开发方法认知里, 对一个类进行扩展方法,只有继父类,然后在子类里创建新的内容。 但是C#又给我们上了一课,它不但可以采用前面的方法, 而且可以对类没有进行继承,也能扩展类型的方法。 这种方式,对于没有进行学习之前,看到代码就是…

Allegro更改线段,丝印,走线,形状,铜箔到不同层的方法

更改线段到不同的Class和Subclass的方法下面以更改线段为例进行讲解1、原先线段在Board Geometry→Soldermask_Top层2、选中线段,鼠标右击选择→Change class/subclass更改到所想要的Class和Subclass3、更改后的线段到Package Geometry→Silkscreen_Top层更改丝印&a…

详解shell中的运算符

目录 前言 一、运算指令 二、运算符号 练习 总结 前言 上一篇文章我们着重学习了 ,shell中的执行流控制,本章我很学习和执行流控制相结合使用的运算符号与运算指令。 一、运算指令 计算的三种方式 (()) ##((a12)) let …