2017-01-15 33 views
3

我对spill to diskshuffle write感到困惑。使用默认的Sort shuffle管理器,我们使用appendOnlyMap来聚合和合并分区记录,对吗?然后,当执行内存填满,我们开始整理地图,它溢出到磁盘,然后清理映射下一个溢出(如果发生),我的问题是:泄漏到磁盘并​​洗牌写火花

  • 是什么盘溢出的区别并随机写入?它们主要包括在本地文件系统上创建文件并记录。

  • 承认是不同的,所以溢出记录被排序,因为它们是通过地图传递的,而不是随机写入记录因为它们没有从地图传递。

  • 我有这样的想法,即溢出文件的总大小应该等于Shuffle写入的大小,也许我错过了一些东西,请帮助理解该阶段。

谢谢。

乔治

回答

6

spill to diskshuffle write是两回事

spill to disk - 从主机RAM 数据移动到主机磁盘 - 使用时,有你的机器上没有足够的内存,并放置的一部分它的内存为磁盘

http://spark.apache.org/faq.html

我是否需要数据到f它在内存中使用Spark?

号星火的运营商数据溢出到磁盘,如果它不适合在内存中, 允许它在任何大小的数据很好地运行。同样,不适合内存的高速缓存数据集 要么溢出到磁盘,要么根据RDD的存储级别确定需要时重新计算。

shuffle write - 从执行人(S)到另一个执行器(一个或多个)数据移动 - 用于当数据需要执行器之间移动(例如,由于JOIN,GROUPBY等)

更多的数据可以在这里找到:

边缘案例可能有助于清除该问题:

  • 你有10个执行人
  • 与每个执行人100GB RAM
  • 数据大小为1280MB,并且被划分为10个分区
  • 每个执行人拥有128MB的数据。

假设数据持有一个密钥,执行groupByKey,会将所有数据放入一个分区。 Shuffle size将是9 * 128MB(9个执行人将他们的数据转移到最后的执行者),而不会有任何spill to disk执行人的RAM和100GB仅数据

的1GB关于AppendOnlyMap

作为写入AppendOnlyMap代码(见上文) - 该功能是 用于 优化的简单的开哈希表的一个低一级执行追加只使用情况下,当键被永远不会被删除,但该值 每个键可能会改变。

两个不同的模块使用相同的低级函数的事实并不意味着这些函数在高级别相关。

+0

但是,如果溢出不会发生,这意味着聚合记录不会从appendOnlyMap传递?这样他们将被排序? – Giorgio

+0

如果没有发生溢出到磁盘,这意味着执行程序可以将整个数据保存在RAM中(请参阅我的答案中的边界案例) – Yaron

+0

因此appendOnlyMap只用于溢出?溢出的文件包含稍后要洗牌的记录,或者仅仅是用于不能保留在RAM中的细化的对象?我仍然认为这是相关的,因为我认为每条记录都必须从appendOnlyMap传递出来,请澄清一下,谢谢 – Giorgio