Update README.md

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

@ -546,6 +546,7 @@ reduceByKey(_+_)在某个action触发job的时候DAGScheduler会负责
3.shuffle前半部分的task在写入数据到磁盘文件之前都会先写入一个一个的内存缓冲内存缓冲满溢之后再spill溢写到磁盘文件中。
### Shuffle调优之合并map端输出文件
**如果不合并map端输出文件会怎么样?**
前置条件每个executor有2个cpu core。4个task。task是线程执行的。所以先并行跑2个task再跑剩下2个task。
![合并map端输出文件](合并map端输出文件.png)
问题来了默认的这种shuffle行为对性能有什么样的恶劣影响呢
@ -565,11 +566,13 @@ shuffle中的写磁盘的操作基本上就是shuffle中性能消耗最为严
磁盘IO对性能和spark作业执行速度的影响是极其惊人和吓人的。
基本上spark作业的性能都消耗在shuffle中了虽然不只是shuffle的map端输出文件这一个部分但是这里也是非常大的一个性能消耗点。
**开启map端输出文件合并**
new SparkConf().set("spark.shuffle.consolidateFiles", "true")
开启shuffle map端输出文件合并的机制默认情况下是不开启的就是会发生如上所述的大量map端输出文件的操作严重影响性能。
![map端文件合并](map端文件合并.png)
![map端文件合并](map端合并文件.png)
开启了map端输出文件的合并机制之后
第一个stage同时就运行cpu core个task比如cpu core是2个并行运行2个task每个task都创建下一个stage的task数量个文件
@ -598,11 +601,17 @@ map端输出文件在生产环境中立减5倍
合并map端输出文件对咱们的spark的性能有哪些方面的影响呢
1、map task写入磁盘文件的IO减少100万文件 -> 20万文件
2、第二个stage原本要拉取第一个stage的task数量份文件1000个task第二个stage的每个task都要拉取1000份文件走网络传输合并以后100个节点每个节点2个cpu core第二个stage的每个task主要拉取100 * 2 = 200个文件即可网络传输的性能消耗是不是也大大减少
分享一下实际在生产环境中使用了spark.shuffle.consolidateFiles机制以后实际的性能调优的效果对于上述的这种生产环境的配置性能的提升还是相当的客观的。spark作业5个小时 -> 2~3个小时。
2、第二个stage原本要拉取第一个stage的task数量份文件1000个task第二个stage的每个task都要拉取1000份文件走网络传输
合并以后100个节点每个节点2个cpu core第二个stage的每个task主要拉取100 * 2 = 200个文件即可网络传输的性能消耗是不是也大大减少
分享一下实际在生产环境中使用了spark.shuffle.consolidateFiles机制以后实际的性能调优的效果对于上述的这种生产环境的配置
性能的提升还是相当的客观的。spark作业5个小时 -> 2~3个小时。
大家不要小看这个map端输出文件合并机制。实际上在数据量比较大你自己本身做了前面的性能调优executor上去->cpu core上去->并行度task数量上去shuffle没调优shuffle就很糟糕了大量的map端输出文件的产生。对性能有比较恶劣的影响。
大家不要小看这个map端输出文件合并机制。实际上在数据量比较大你自己本身做了前面的性能调优executor上去->cpu core上去->并行度task数量上去
shuffle没调优shuffle就很糟糕了大量的map端输出文件的产生。对性能有比较恶劣的影响。
这个时候,去开启这个机制,可以很有效的提升性能。
## troubleshooting

Loading…
Cancel
Save