返回信息流Spark shuffle时,是写到一个executor memory里,还是写到磁盘里?
还有那个Spark spill是怎么回事?我的理解是Spark shuffle时如果写到一个executor memory里写不下,就写到磁盘里
另外Spark经常有参数调executor memory的大小,为什么没有调Local storage,也就是磁盘大小的参数?
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #36807同步于 2020/7/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖
Spark shuffle是写到磁盘还是内存?
mengliluohua
2020/7/5镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
先memory,再disk。memory 放不下就 spill 到disk。
https://www.aboutyun.com/forum.php?mod=viewthread&tid=27252&page=1
这个帖子里的 Sort Shuffle讲的也差不多了
我看的书是早期版本是先把map端所有数据输出到内存,在flush到磁盘,但一个问题是内存不够时会出现OOM异常。
所以spark0.8版本以后,是record-by-record的存入到磁盘,而不是先全部存到内存,再刷到磁盘,避免了内存的压力,也就避免了出现OOM异常
【 在 cyme 的大作中提到: 】
: 我看的书是早期版本是先把map端所有数据输出到内存,在flush到磁盘,但一个问题是内存不够时会出现OOM异常。
: 所以spark0.8版本以后,是record-by-record的存入到磁盘,而不是先全部存到内存,再刷到磁盘,避免了内存的压力,也就避免了出现OOM异常
对,我提这个问题的原因就是我看见了多种不同的说法。你说的早期后期两种方法,跟楼上提的先写内存,内存写不下spill写到磁盘,是什么关系?
【 在 AA071427 的大作中提到: 】
: 先memory,再disk。memory 放不下就 spill 到disk。
: https://www.aboutyun.com/forum.php?mod=viewthread&tid=27252&page=1
: 这个帖子里的 Sort Shuffle讲的也差不多了
学长所说的这种方式,和楼下所说的前后期两种方式,关系是什么?
【 在 mengliluohua 的大作中提到: 】
:
: 对,我提这个问题的原因就是我看见了多种不同的说法。你说的早期后期两种方法,跟楼上提的先写内存,内存写不下spill写到磁盘,是什么关系?
我指的是shuffle write的阶段处理之后的输出,下面应该是shuffle read阶段归并排序的时候,若不排序则在内存中使用AppendOnlyMap处理,排序则使用EnternalAppendOnlyMap处理,现在内存进行聚集,达到阈值,再将排序后的数据输出到磁盘,最后将磁盘中全部数据进行归并排序和聚集。
业余spark选手瞎说两句。太具体的没研究过。
内存是肯定放不下的,会逐步spill到磁盘上。
如果你executor内存不够用,可以考虑把核数调小一点。貌似每个CPU会占一部分内存,大概是context信息吧。
【 在 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的剖析算是比较详细了,你也可以搜来看看
另外,调 disk 干啥,没有必要呀,好多的部署都是Spark on Yarn,Yarn 在分割source的时候,只是按照cpu 和 memory来分配container,对于Spark来说,应该是没办法感知disk有多大。
而且,一般container所在的节点上,disk的大小是远大于memory的,毕竟这些节点一般还作为HDFS或者Hive之类的在使用