我试图深入了解 Spark Shuffle 过程。当我开始阅读时,我遇到了以下几点。
Spark 完成后将 Map 任务(ShuffleMapTask)输出直接写入磁盘。
我想了解以下关于 Hadoop MapReduce 的内容。
如果Map-Reduce和Spark都将数据写入本地磁盘,那么spark shuffle过程与Hadoop MapReduce有何不同?
既然数据在 Spark 中表示为 RDD,为什么这些输出不保留在节点执行器内存中呢?
Hadoop MapReduce 和 Spark 的 Map 任务的输出有何不同?
如果有很多小的中间文件作为输出,spark 如何处理网络和 I/O 瓶颈?
首先,Spark 并不以严格的 Map-Reduce 方式工作,map
除非必要,否则输出不会写入磁盘。向磁盘写入随机文件。
这并不意味着shuffle后的数据不会保留在内存中。 Spark中的Shuffle文件大部分都是这样写的避免在多个下游操作的情况下重新计算。为什么要写入文件系统?至少有两个交错的原因:
- 内存是一种宝贵的资源,Spark 中的内存缓存是短暂的。需要时可以从缓存中逐出旧数据。
- 如果没有必要,洗牌是一个昂贵的过程,我们希望避免。以使其在给定上下文的生命周期内持久存在的方式存储随机数据更有意义。
除了正在进行的低级优化工作和实现细节之外,Shuffle 本身并没有什么不同。它基于相同的基本方法,但也有其局限性。
任务与 Hadoo 地图有何不同?正如很好地说明的贾斯汀·皮霍尼不需要洗牌的多个转换被压缩在一个任务中。由于这些操作在标准 Scala 迭代器上进行,因此可以通过管道传输单个元素上的操作。
关于网络和 I/O 瓶颈,这里没有灵丹妙药。虽然 Spark 可以通过组合转换、在内存中缓存以及提供转换感知工作器首选项来减少写入磁盘或混洗的数据量,但它与任何其他分布式框架一样受到相同的限制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)