BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #36807同步于 2020/7/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖

Spark shuffle是写到磁盘还是内存?

mengliluohua
2020/7/5镜像同步15 回复
Spark shuffle时,是写到一个executor memory里,还是写到磁盘里? 还有那个Spark spill是怎么回事?我的理解是Spark shuffle时如果写到一个executor memory里写不下,就写到磁盘里 另外Spark经常有参数调executor memory的大小,为什么没有调Local storage,也就是磁盘大小的参数?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
luweihai机器人#1 · 2020/7/6
应该是写在磁盘里面
AA071427机器人#2 · 2020/7/6
先memory,再disk。memory 放不下就 spill 到disk。 https://www.aboutyun.com/forum.php?mod=viewthread&tid=27252&page=1 这个帖子里的 Sort Shuffle讲的也差不多了
cyme机器人#3 · 2020/7/6
我看的书是早期版本是先把map端所有数据输出到内存,在flush到磁盘,但一个问题是内存不够时会出现OOM异常。 所以spark0.8版本以后,是record-by-record的存入到磁盘,而不是先全部存到内存,再刷到磁盘,避免了内存的压力,也就避免了出现OOM异常
mengliluohua机器人#4 · 2020/7/6
【 在 cyme 的大作中提到: 】 : 我看的书是早期版本是先把map端所有数据输出到内存,在flush到磁盘,但一个问题是内存不够时会出现OOM异常。 : 所以spark0.8版本以后,是record-by-record的存入到磁盘,而不是先全部存到内存,再刷到磁盘,避免了内存的压力,也就避免了出现OOM异常 对,我提这个问题的原因就是我看见了多种不同的说法。你说的早期后期两种方法,跟楼上提的先写内存,内存写不下spill写到磁盘,是什么关系?
mengliluohua机器人#5 · 2020/7/6
【 在 AA071427 的大作中提到: 】 : 先memory,再disk。memory 放不下就 spill 到disk。 : https://www.aboutyun.com/forum.php?mod=viewthread&tid=27252&page=1 : 这个帖子里的 Sort Shuffle讲的也差不多了 学长所说的这种方式,和楼下所说的前后期两种方式,关系是什么?
cyme机器人#6 · 2020/7/6
【 在 mengliluohua 的大作中提到: 】 : : 对,我提这个问题的原因就是我看见了多种不同的说法。你说的早期后期两种方法,跟楼上提的先写内存,内存写不下spill写到磁盘,是什么关系? 我指的是shuffle write的阶段处理之后的输出,下面应该是shuffle read阶段归并排序的时候,若不排序则在内存中使用AppendOnlyMap处理,排序则使用EnternalAppendOnlyMap处理,现在内存进行聚集,达到阈值,再将排序后的数据输出到磁盘,最后将磁盘中全部数据进行归并排序和聚集。
Wizmann机器人#7 · 2020/7/6
业余spark选手瞎说两句。太具体的没研究过。 内存是肯定放不下的,会逐步spill到磁盘上。 如果你executor内存不够用,可以考虑把核数调小一点。貌似每个CPU会占一部分内存,大概是context信息吧。
AA071427机器人#8 · 2020/7/7
【 在 mengliluohua 的大作中提到: 】 : : 学长所说的这种方式,和楼下所说的前后期两种方式,关系是什么? 我的理解是后期的shuffle实现,更加能体现先memory后disk的过程。 准确说,忘了是Spark 1.6还是2.0之后了(版本记不清了),sort shuffle的实现就是楼上说的,使用了Spark自己实现的数据结构,这种shuffle拿到record之后会做sort(在memory中实现,当然也有不sort的选择,这个是参数可调的),然后数量达到一定规模之后会把这部分数据spill 到 disk。 早期的shuffle(hash shuffle),我没怎么看过源码实现,只看过别人写的一些博客。record来了,直接扔到对应的partition的buffer里,然后buffer里的数据是不是spill到disk,这个我不是很清楚了。 有个人叫做耿加安的,1.6版本 和 2.1版本的Spark的书都写了一本,里头对于shuffle的剖析算是比较详细了,你也可以搜来看看
AA071427机器人#9 · 2020/7/7
另外,调 disk 干啥,没有必要呀,好多的部署都是Spark on Yarn,Yarn 在分割source的时候,只是按照cpu 和 memory来分配container,对于Spark来说,应该是没办法感知disk有多大。 而且,一般container所在的节点上,disk的大小是远大于memory的,毕竟这些节点一般还作为HDFS或者Hive之类的在使用