Shuffle调优之调节map端内存缓冲与reduce端占比

main
Oeljeklaus 7 years ago committed by GitHub
parent b0be736e54
commit c35663d54d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -614,6 +614,75 @@ map端输出文件在生产环境中立减5倍
shuffle没调优shuffle就很糟糕了大量的map端输出文件的产生。对性能有比较恶劣的影响。
这个时候,去开启这个机制,可以很有效的提升性能。
### Shuffle调优之调节map端内存缓冲与reduce端占比
**未调优之前**
spark.shuffle.file.buffer默认32k
spark.shuffle.memoryFraction0.2
map端内存缓冲reduce端内存占比很多资料、网上视频都会说这两个参数是调节shuffle性能的不二选择很有效果的样子实际上不是这样的。
以实际的生产经验来说这两个参数没有那么重要往往来说shuffle的性能不是因为这方面的原因导致的
但是有一点点效果的broadcast数据本地化等待时长这两个shuffle调优的小点其实也是需要跟其他的大量的小点配合起来使用一点一点的提升性能
最终很多个性能调优的小点的效果,汇集在一起之后,那么就会有可以看见的还算不错的性能调优的效果
![map端内存缓冲与reduce端](map端内存缓冲与reduce端占比.png)
**原理描述**
reduce端task在拉取到数据之后会用hashmap的数据格式来对各个key对应的values进行汇聚。
针对每个key对应的values执行我们自定义的聚合函数的代码比如_ + _把所有values累加起来
reduce task在进行汇聚、聚合等操作的时候实际上使用的就是自己对应的executor的内存executorjvm进程默认executor内存中划分给reduce task进行聚合的比例是0.2。
问题来了因为比例是0.2所以理论上很有可能会出现拉取过来的数据很多那么在内存中放不下这个时候默认的行为就是说将在内存放不下的数据都spill溢写到磁盘文件中去。
原理说完之后,来看一下,默认情况下,不调优,可能会出现什么样的问题?
默认map端内存缓冲是每个task32kb。
默认reduce端聚合内存比例是0.2也就是20%。
如果map端的task处理的数据量比较大但是呢你的内存缓冲大小是固定的。可能会出现什么样的情况
每个task就处理320kb32kb总共会向磁盘溢写320 / 32 = 10次。
每个task处理32000kb32kb总共会向磁盘溢写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默认32kspark 1.3.x不是这个参数后面还有一个后缀kbspark 1.5.x以后
变了就是现在这个参数调节reduce端聚合内存占比spark.shuffle.memoryFraction0.2
在实际生产环境中,我们在什么时候来调节两个参数?
看Spark UI如果你的公司是决定采用standalone模式那么狠简单你的spark跑起来会显示一个Spark UI的地址4040的端口进去看依次点击进去
可以看到你的每个stage的详情有哪些executor有哪些task每个task的shuffle write和shuffle read的量shuffle的磁盘和内存读写的数据量
如果是用的yarn模式来提交课程最前面从yarn的界面进去点击对应的application进入Spark UI查看详情。
如果发现shuffle 磁盘的write和read很大。这个时候就意味着最好调节一些shuffle的参数。进行调优。首先当然是考虑开启map端输出文件合并机制。
调节上面说的那两个参数。调节的时候的原则。spark.shuffle.file.buffer每次扩大一倍然后看看效果64128spark.shuffle.memoryFraction
每次提高0.1,看看效果。
不能调节的太大,太大了以后过犹不及,因为内存资源是有限的,你这里调节的太大了,其他环节的内存使用就会有问题了。
调节了以后效果map task内存缓冲变大了减少spill到磁盘文件的次数reduce端聚合内存变大了减少spill到磁盘的次数而且减少了后面聚合
读取磁盘文件的数量。
## troubleshooting
### troubleshooting之控制shuffle reduce端缓冲大小避免OOM
shuffle过程中优map端的task是不断的输出数据的数据量可能是很大的但是其实reduce端的task并不是等到map端task将属于自己的那份数据全部
@ -643,6 +712,7 @@ spark作业首先第一要义就是一定要让它跑起来然后再
如果资源特别充分可以尝试增加reduce端缓冲大小这样就可以减少拉取次数减少网络传输。
配置的参数spark.reducer.maxSizeInflight
### troubleshooting之shuffle文件拉取失败
有时候会出现一种情况,非常普遍;shuffle file cannot find在spark的作业中这是非常普遍而且有时候他会偶尔出现但是重现提交task后

Loading…
Cancel
Save