溢出到磁盘并随机写入火花
Spill to disk and shuffle write spark
我对 spill to disk
和 shuffle write
感到困惑。使用默认的 Sort shuffle 管理器,我们使用 appendOnlyMap
来聚合和组合分区记录,对吗?然后当执行内存填满时,我们开始对映射进行排序,将其溢出到磁盘,然后为下一次溢出清理映射(如果发生),我的问题是:
溢出到磁盘和随机写入有什么区别?它们基本上包括在本地文件系统上创建文件并记录。
承认不同,所以Spill记录是排序的,因为它们是通过map传递的,而不是shuffle write records no,因为它们不是从map传递的。
- 我认为溢出文件的总大小应该等于 Shuffle 写入的大小,也许我遗漏了什么,请帮助理解那个阶段。
谢谢。
乔治
spill to disk
和shuffle write
是两个不同的东西
spill to disk
- 数据从主机 RAM 移动到主机磁盘 - 当你的机器上没有足够的 RAM 时使用,它将部分 RAM 放入磁盘
http://spark.apache.org/faq.html
我的数据是否需要适合内存才能使用 Spark?
No. Spark's operators spill data to disk if it does not fit in memory,
allowing it to run well on any sized data. Likewise, cached datasets
that do not fit in memory are either spilled to disk or recomputed on
the fly when needed, as determined by the RDD's storage level.
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的数据。
假设数据持有一个key,执行groupByKey,将所有数据归为一个partition。 Shuffle size
将是 9*128MB(9 个执行者将他们的数据传输到最后一个执行者),并且不会有任何 spill to disk
因为执行者有 100GB 的 RAM 而只有 1GB 的数据
As written in the AppendOnlyMap
code (see above) - this function is
a low level implementation of a simple open hash table optimized for
the append-only use case, where keys are never removed, but the value
for each key may be changed.
两个不同的模块使用相同的 low-level 函数并不意味着这些函数在 hi-level 中是相关的。
我对 spill to disk
和 shuffle write
感到困惑。使用默认的 Sort shuffle 管理器,我们使用 appendOnlyMap
来聚合和组合分区记录,对吗?然后当执行内存填满时,我们开始对映射进行排序,将其溢出到磁盘,然后为下一次溢出清理映射(如果发生),我的问题是:
溢出到磁盘和随机写入有什么区别?它们基本上包括在本地文件系统上创建文件并记录。
承认不同,所以Spill记录是排序的,因为它们是通过map传递的,而不是shuffle write records no,因为它们不是从map传递的。
- 我认为溢出文件的总大小应该等于 Shuffle 写入的大小,也许我遗漏了什么,请帮助理解那个阶段。
谢谢。
乔治
spill to disk
和shuffle write
是两个不同的东西
spill to disk
- 数据从主机 RAM 移动到主机磁盘 - 当你的机器上没有足够的 RAM 时使用,它将部分 RAM 放入磁盘
http://spark.apache.org/faq.html
我的数据是否需要适合内存才能使用 Spark?
No. Spark's operators spill data to disk if it does not fit in memory, allowing it to run well on any sized data. Likewise, cached datasets that do not fit in memory are either spilled to disk or recomputed on the fly when needed, as determined by the RDD's storage level.
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的数据。
假设数据持有一个key,执行groupByKey,将所有数据归为一个partition。 Shuffle size
将是 9*128MB(9 个执行者将他们的数据传输到最后一个执行者),并且不会有任何 spill to disk
因为执行者有 100GB 的 RAM 而只有 1GB 的数据
As written in the
AppendOnlyMap
code (see above) - this function is a low level implementation of a simple open hash table optimized for the append-only use case, where keys are never removed, but the value for each key may be changed.
两个不同的模块使用相同的 low-level 函数并不意味着这些函数在 hi-level 中是相关的。