我越来越感到困惑spill to disk
和shuffle write
.使用默认的Sort shuffle管理器,我们使用appendOnlyMap
for聚合和组合分区记录,对吗?然后当执行内存填满时,我们开始排序地图,将其溢出到磁盘,然后清理地图以进行下一次泄漏(如果发生),我的问题是:
溢出到磁盘和shuffle写入有什么区别?它们主要包括在本地文件系统上创建文件以及记录.
承认是不同的,因此Spill记录被排序,因为它们通过地图传递,而不是随机写入记录,因为它们没有从地图传递.
我有一个想法,溢出文件的总大小,应该等于Shuffle写的大小,也许我错过了一些东西,请帮助理解那个阶段.
谢谢.
乔治
spill to disk
并且shuffle write
是两件不同的事情
spill to disk
- 数据从主机RAM移动到主机磁盘 - 在计算机上没有足够的RAM时使用,并将其部分RAM放入磁盘
http://spark.apache.org/faq.html
我的数据是否需要适合内存才能使用Spark?
不会.如果Spark的运算符不适合内存,它会将数据溢出到磁盘,从而可以在任何大小的数据上运行良好.同样,不适合内存的缓存数据集要么溢出到磁盘,要么在需要时动态重新计算,这由RDD的存储级别决定.
shuffle write
- 数据从执行程序移动到另一个执行程序 - 在数据需要在执行程序之间移动时使用(例如,由于JOIN,groupBy等)
可在此处找到更多数据:
https://0x0fff.com/spark-architecture-shuffle/
http://blog.cloudera.com/blog/2015/05/working-with-apache-spark-or-how-i-learned-to-stop-worrying-and-love-the-shuffle/
边缘案例可能有助于解决此问题:
你有10个遗嘱执行人
每个执行器具有100GB RAM
数据大小为1280MB,分为10个分区
每个执行器都拥有128MB的数据.
假设数据包含一个密钥,Performing groupByKey,将把所有数据放入一个分区.Shuffle size
将是9*128MB(9个执行者将他们的数据转移到最后一个执行者),并且没有任何spill to disk
因为执行者有100GB的RAM和只有1GB的数据
关于AppendOnlyMap:
如
AppendOnlyMap
代码中所写(参见上文) - 此函数是针对仅附加用例优化的简单开放哈希表的低级实现,其中键永远不会被删除,但每个键的值可能会更改.
两个不同模块使用相同的低级功能的事实并不意味着这些功能在高级别中是相关的.