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,一经查实,立即删除!

相关文章

element ui 表单验证为正整数

很多时候都会用表单中输入正整数的情况&#xff0c;在element ui中可以用el-input-number 标签来显示输入框是number类型的&#xff0c;或者type"number"也可以的&#xff0c;但是正整数就需要判断了 可以利用正则来判断 代码如下 <el-form ref"checkData&qu…

python用input输入列表_Python如何使用input函数获取输入

所谓输入&#xff0c;就是用代码获取用户通过键盘输入的信息。 例如&#xff1a;去银行取钱&#xff0c;在 ATM 上输入密码。 在 Python 中&#xff0c;如果要获取用户在键盘上的输入信息&#xff0c;需要使用到input()函数。 函数input()让程序暂停运行&#xff0c;等待用户输…

web.xml.jsf_使用JSF 2.0可以更轻松地进行多字段验证

web.xml.jsf开发应用程序表单时最常见的需求之一是多字段验证&#xff08;或跨字段验证&#xff0c;但我没有使用此术语&#xff0c;因为当我将其放在Google上时&#xff0c;实际上得到了一些战后图片&#xff09;。 我正在谈论的情况是&#xff0c;我们需要比较初始日期是早于…

odoo self.ensure_one()

源码&#xff1a; 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&#xff0c;又和大家见面啦&#xff5e;前段时间我们的文字识别(OCR)功能推出后&#xff0c;由于只支持系统提供的固定识别模板&#xff0c;很多客户跟我们反馈说&#xff1a;希望可以自定义识别模板&#xff01;现应大家的要求&#xff0c;轻流「文字识别(OCR)」的「自定义…

中文字符频率统计python_python统计字符串出现最多的字母及其出现次数

统计字符串出现最多的字母及其出现次数 另外如果次数相同按字母顺序排序。 方法1 可以使用自定义键对c.most_common()进行排序&#xff0c;该键首先考虑频率的降序&#xff0c;然后考虑字母的降序&#xff08;请注意lambda x: (-x[1], x[0]) &#xff09;&#xff1a; from col…

c#float取小数点后两位_C# 保留小数点后两位(方法总结)

最简单使用: float i=1.6667f; string show=i.ToString("0.00"); //结果1.67(四舍五入) 其他类似方法: string show=i.ToString("F");//"F2","f" 不区分大小写 string show=String.Format("{0:F}",i);//也可以为F2,或者&q…

Java 9中的进程处理

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

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

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

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

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

python自然场景文字识别_chineseocr

本项目基于yolo3 与crnn 实现中文自然场景文字检测及识别master分支将保留一周&#xff0c;后续app分支将替换为master实现功能文字方向检测 0、90、180、270度检测(支持dnn/tensorflow)支持(darknet/opencv dnn /keras)文字检测,支持darknet/keras训练不定长OCR训练(英文、中英…

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

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

java知识回顾_Java – 2012年回顾和未来预测

java知识回顾这篇文章将重点讨论2012年发生的大小事件&#xff0c;并展望2013年的一些未来预测。其中一些预测将是诚实的猜测&#xff0c;而另一些则将是诚实的猜测。 好吧&#xff0c;只要说我的“恶魔般”的一面就已经接管了。 因此&#xff0c;我们无需再讨论Java的2012年了…

redis 能不能监听特定的key失效_php监听redis key失效触发回调事件

订单超时、活动过期解决方案&#xff1a;php监听redis key失效触发回调事件Redis 的 2.8.0 版本之后可用&#xff0c;键空间消息(Redis Keyspace Notifications)&#xff0c;配合 2.0.0 版本之后的 SUBSCRIBE就能完成这个定时任务的操作了&#xff0c;定时的单位是秒。1.我们先…

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

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

javaweb 需要对表格建立实体类吗_如何采用java界面编程建立一个表格

5.总体代码&#xff1a;为了便于大家复制&#xff0c;下面给出完整的程序代码&#xff0c;如下&#xff1a;package ArrayCreateTable;import javax.swing.table.*;import java.awt.BorderLayout;import java.awt.GridLayout;import javax.swing.*;public class ArrayCreateTab…

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

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

基本API速率限制

您可能正在开发某种形式的&#xff08;Web / RESTful&#xff09;API&#xff0c;并且如果它是面向公众的&#xff08;甚至是内部的&#xff09;&#xff0c;通常您希望以某种方式对其进行速率限制。 即&#xff0c;限制一段时间内执行的请求数&#xff0c;以节省资源并防止滥用…

无人值守安装之cdrom_无人值守安装

第一阶段项目内容&#xff1a;内容配置PXEDHCPvsftp&#xff0c;实现客户端网络安装linux操作系统阶段目的&#xff1a;目的是让你体验如何通过网络引导&#xff0c;安装redhat系统&#xff0c;解决了很多时候没有光驱&#xff0c;却需要装系统的需求。步骤&#xff1a;服务器端…

python函数定义中参数列表里的参数是_python函数参数中的/和*是什么意思?

在python3.8之后函数参数中允许出现/和*号&#xff0c;/用来指明某些函数形参必须使用位置参数而非关键字参数的形式&#xff0c;*出现在函数参数中第一种含义可以表示为可变参数&#xff0c;一般写作*args&#xff1b;对于单独出现在参数中的*参数&#xff0c;则表示&#xff…