32查运行内存的map文件_Spark Shuffle调优之调节map端内存缓冲与reduce端内存占比

c5c93d7ef967a627282c5095121d7caa.png

本文首先介绍Spark中的两个配置参数:

spark.shuffle.file.buffer   map端内存缓冲 
spark.shuffle.memoryFraction   reduce端内存占比

很多博客会说上面这两个参数是调节Spark shuffle性能的利器,实际上并不是这样的。

以实际的生产经验来说,这两个参数没有那么重要,往往来说shuffle的性能不是因为这方面的原因决定的,但是整体来说还是有一点点效果的。

这两个shuffle调优的小点能带来一些性能的提升,与其他调优小点结合起来最终可以会有可以看见的还算不错的性能调优的效果。

默认情况下shuffle的map task输出到磁盘文件的时候,统一都会先写入每个task自己关联的一个内存缓冲区。这个缓冲区大小,默认是32kb。

每一次,当内存缓冲区满溢之后,才会进行spill操作,溢写操作,溢写到磁盘文件中去

d138fb9ac8ea350738119f654bbd5276.png

reduce端task拉取到数据之后会用hashmap这种数据格式来对各个key对应的values进行汇聚。针对每个key对应的values执行我们自定义的聚合函数的代码,比如_ + _(把所有values累加起来)。

reduce task在进行汇聚、聚合等操作的时候使用的就是自己对应的executor的内存,默认executor内存中划分给reduce task进行聚合的比例,是0.2。

问题来了,因为默认比例是0.2,理论上很有可能会出现拉取过来的数据很多导致在内存中放不下,内存无法放下的数据,都被spill(溢写)到磁盘文件中去了。

原理说完之后,来看一下默认情况下不调优会出现什么样的问题

默认配置下map端内存缓冲是每个task,32kb。

默认配置下reduce端聚合内存比例,是0.2,也就是20%。

如果map端的task处理的数据量比较大而配置的内存缓冲大小是固定的可能会出现什么样的情况?

每个task处理320kb时总共会向磁盘溢写320 / 32 = 10次。

每个task处理32000kb时总共会向磁盘溢写32000 / 32 = 1000次。

在map task处理的数据量比较大的情况下,而你的task的内存缓冲默认是比较小的(32kb)。可能会造成多次的map端往磁盘文件的spill溢写操作,发生大量的磁盘IO,从而降低性能

reduce端聚合内存占比默认是0.2。如果数据量比较大,reduce task拉取过来的数据很多,那么就会频繁发生reduce端聚合内存不够用,频繁发生spill操作溢写到磁盘上去。而且最致命的是,磁盘上溢写的数据量越大后面在进行聚合操作的时候很可能会多次读取磁盘中的数据进行聚合。

默认不调优,在数据量比较大的情况下,可能频繁地发生reduce端的磁盘文件的读写。

这两个点之所以放在一起说是因为他们俩是有关联的。数据量变大,map端肯定会出点问题;reduce端肯定也会出点问题;出的问题是一样的:都是磁盘IO频繁,影响性能。

调优方案如下:

调节map task内存缓冲:spark.shuffle.file.buffer

调节reduce端聚合内存占比:spark.shuffle.memoryFraction

在实际生产环境中,我们在什么时候来调节两个参数?

看Spark UI,如果采用的是standalone模式,可以通过SparkUI查看每个stage的详情,有哪些executor,task ?每个task的shuffle write和shuffle read的量,shuffle的磁盘和内存,读写的数据量;如果是用的yarn模式来提交,可以从yarn的界面进去,点击对应的application,进入Spark UI,查看详情。

如果发现shuffle 磁盘的write和read很大。这个时候,就意味着最好调节一些shuffle的参数。进行调优。首先当然是考虑开启map端输出文件合并机制。

调节的时候的原则:spark.shuffle.file.buffer,每次扩大一倍,然后看看效果,64,128;spark.shuffle.memoryFraction,每次提高0.1,看看效果。

不能调节的太大,太大了以后过犹不及,因为内存资源是有限的,你这里调节的太大了,其他环节的内存使用就会有问题了。

调节了以后效果如何?map task内存缓冲变大了,减少spill到磁盘文件的次数;reduce端聚合内存变大了,减少spill到磁盘的次数,而且减少了后面聚合读取磁盘文件的数量。

往期回顾:

码农铲屎官:Spark Shuffle调优之合并map端输出文件​zhuanlan.zhihu.com
3d21d50fa517d0da25dc53cf14532ffd.png
码农铲屎官:Spark性能调优之资源分配​zhuanlan.zhihu.com
e8c3dc1374d544e76f7a57b3a1d069df.png
码农铲屎官:Flink开发的7点建议​zhuanlan.zhihu.com
6cf04d6b6dbaae34ebd7a625979a62de.png
码农铲屎官:Flink state 使用的4点建议​zhuanlan.zhihu.com
defc5c2e5372eaeb9d9067150fe91ad7.png
码农铲屎官:4个角度轻松理解 Flink中的Watermark​zhuanlan.zhihu.com
60914787692dfa46a024d6b0014bb57e.png
码农铲屎官:3种Flink State Backend | 你该用哪个?​zhuanlan.zhihu.com
af20647bd58db890deeab032d8c7db62.png
码农铲屎官:Flink方案设计中的4大误区​zhuanlan.zhihu.com
abdb28675371aba46c7568dc27df3845.png
码农铲屎官:Flink实现固定时长或消息条数的触发器​zhuanlan.zhihu.com
6cf04d6b6dbaae34ebd7a625979a62de.png
码农铲屎官:详解 Flink 异步 IO​zhuanlan.zhihu.com
b9aad726ffba2f5490ec0dde1fe1ac95.png

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

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

相关文章

odoo self.ensure_one()

源码: def ensure_one(self): """ Verifies that the current recorset holds a single record. Raises an exception otherwise. """ try: # unpack to ensure there is only one value is faster than len when…

模板 字段_劲爆新功能:轻流文字识别(OCR)功能支持自定义识别模板啦

Hi,又和大家见面啦~前段时间我们的文字识别(OCR)功能推出后,由于只支持系统提供的固定识别模板,很多客户跟我们反馈说:希望可以自定义识别模板!现应大家的要求,轻流「文字识别(OCR)」的「自定义…

Java 9中的进程处理

一直以来,用Java管理操作系统进程都是一项艰巨的任务。 这样做的原因是可用的工具和API较差。 老实说,这并非没有道理:Java并非出于此目的。 如果要管理OS进程,则可以使用所需的Shell,Perl脚本。 对于面临更复杂任务的…

拼音缩写是啥意思_NMSL?AWSL?这些拼音缩写到底是啥意思?

我绝对没有在骂你们,我只是单纯的举个例子而已。我们在网上冲浪时经常可以看到这些几个字母组成的拼音缩写,对于知道这些梗的人一眼就能GET到,但对于不明白的人来说猜来猜去也猜不出啥意思。所以今天就来给大家科普几个经常出现的拼音缩写&am…

python利用自动识别写模块_序章:资料预处理(python3.6 可用fortran unformatted sequencial data读取模块)...

首先我只是一个接触Python约半年的菜鸟,开这一个专栏的目的主要是记录自己所学,以及实践的一些有用的东西,顺便分享一些自己写的公用代码段以方便具有同样想法的朋友。 既然是序章我就多写一些吧,我本人对人工智能在气象方面的应用…

python蟒蛇代码_011 实例2-Python蟒蛇绘制

一、"Python蟒蛇绘制"问题分析 1.1 Python蟒蛇绘制 用程序绘制一条蟒蛇 貌似很有趣,可以来试试 先学会蟒蛇绘制,再绘朵玫瑰花送给TA 设计蟒蛇的基本形状:问题1: 计算机绘图是什么原理? 一段程序为何能够产生窗体&#x…

bjd luts_BJD娃娃背后的圈层文化:一个“成品娃”拍出22万元天价!

■ 作者 黑马君 | 黑马品牌(ID:heimapinpai)现如今“Z世代”已经成为品牌营销中不可忽略的一个关键词,作为消费升级浪潮的主力军,他们早已成为品牌重点目标人群。与90后、80后不同,Z世代成长于互联网迅猛发展的时代,追…

qtcreator版本_【IDE】ROS开发环境之Qt Creator的安装与配置

可以用于ROS开发的IDE很多(可以参考【工具合辑】ROS工程师都在用什么IDE开发呢?用哪种IDE开发更加高效呢? ),ROS的调试依赖环境变量,与外部程序有通讯,因此要求启动IDE的时候加载ROS环境参数,其他方面并无太…

java线程死锁_Java并发:隐藏线程死锁

java线程死锁大多数Java程序员熟悉Java线程死锁概念。 它本质上涉及2个线程,它们彼此永远等待。 这种情况通常是平面(同步)或ReentrantLock(读或写)锁排序问题的结果。 Found one Java-level deadlock:"pool-1-t…

空间滤波_第三章 灰度变换与空间滤波-(六)锐化空间滤波器之非锐化掩蔽

知识使人自由,印刷术使知识自由。按照书中的顺序,我们插入一章非微分模式下的锐化的方法,非锐化掩蔽。这种方法在印刷术和出版界已经用了好多年了,具体的过程:模糊原图像从原图像中减去模糊图像(产生的差值…

go语言io reader_【已解决】go语言中如何使用io的MultiWriter

【背景】折腾:期间,需要去搞懂:如果新建和设置MultiWriter。【折腾过程】1.参考:去看看:2.然后去试试代码:var filenameOnly stringfilenameOnly GetCurFilename()fmt.Println("filenameOnly", …

golang 包含文本_Golang教程之Web篇(七)

首先,大家一起思考一个问题:何为Web编程?严格来说,这只是一个叫法,并没有学术上的定义,但是一般大家都说到web都是指浏览器相关,所以大家一般说的web开发要么是PC Web要么就是手机Web&#xff0…

delphi switch语句例子_Java 14 祭出增强版 switch,真香!!

Java14:栈长,我还有机会吗?栈长:必须有!今天说下switch!关注Java技术栈的朋友应该都知道,switch 在 JDK 12 中进行增强了,并且在 JDK 12/13 中一直是预览特性,刚出来的时…

sqoop 导入到hive字段全是null_Sqoop 一点通

sqoop 是什么?sqoop 主要用于异构数据:1. 将数据从hadoop,hive 导入、导出到关系型数据库mysql 等;2. 将关系型数据库 mysql 中数据导入、导出到 hadoop 、hve 。sqoop 版本说明sqoop 1 版本主要从1.4.0 到 1.4.7;sqoop 2 版本主要…

php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP

本文实例讲述了php使用PDO操作MySQL数据库的方法。分享给大家供大家参考。具体分析如下:PDO是mysql数据库操作的一个公用类,我们不需要进行自定类就可以直接使用pdo来操作数据库,但是在php默认配置中pdo是未开启所以我们必须先在php.ini中开启它才可以使用,这里来详…

雅虎yql_从RSS Feed和YQL创建数据表

雅虎yqlYahoo Query Language( YQL )是一种查询语言,例如SQL。 使用YQL,我们可以跨Web服务 查询 , 过滤和联接数据。 YQL也可以阅读RSS feed。 响应可以是JSON或XML。 雅虎提供了一个YQL控制台,用于调试…

流线动态图python_Node.js Stream(流)

Node.js Stream(流) Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。 Node.js,Stream 有四种流类型&#xff1…

gacutil不是内部或外部命令_Win7命令提示符输入taskkill提示不是内部或外部命令...

使用win7系统的用户,想在命令提示符下使用taskkill命令删掉进程的时候,却提示taskkill不是内部或外部命令,也不是可运行的程序,遇到这样的问题,这位用户不知道怎么解决。所以给大家带来了解决方法教程,希望…

mysql两台服务器怎么做数据同步_两台mysql服务器实现双机互备配置并测试数据同步...

对于实现两台机子的互备配置,本文作出了详细的介绍,之后的测试数据同步,在10.168.1.44服务器数据库里修改一条数据, 可以看到数据已经同步过来了。反过来,修改10.168.0.126的数据,也可以看到10.168.1.44数据…

excel 复制数据 sql server 粘贴_win32 实现 excel 快速复制粘贴

直接简明说:该方法可以直接将一张代码的区域内容直接 copy 到另一张表上,并且字体颜色、背景、格式都不变,另外还可以 copy 公式(相当于 excel 下拉公式)from win32com.client import Dispatchimport win32com.clientdef writeCol(filename):…