Spark的shuffle读和shuffle写有什么区别?

13

我需要运行一个处理海量数据的Spark程序。我正在尝试通过Spark UI优化程序,并试图减少Shuffle部分。

这里提到了两个组件:shuffle读取和shuffle写入。我可以根据它们的术语理解它们之间的区别,但我想了解它们的确切含义,以及哪种spark shuffle的读/写会降低性能?

我在互联网上进行了搜索,但找不到关于它们的详细信息,因此想看看是否有人能在这里解释它们。


1
Spark 中的最佳优化技巧之一:尽量减少洗牌次数。 - LiMuBei
2个回答

12

来自UI工具提示

Shuffle读取

总的shuffle字节数和记录数(包括本地读取的数据和从远程执行器读取的数据)

Shuffle写入

在磁盘上写入的字节和记录,以便在以后的阶段中进行shuffle读取


所以阶段洗牌将数据写入下一个阶段,该洗牌读取数据,并且数据的大小应该相等吗? - yuxh

2

我最近开始使用Spark。我一直在寻找类似的问题答案。

当来自一个阶段的数据通过网络洗牌到下一个阶段时,处理下一个阶段的执行器通过TCP从第一个阶段的进程中获取数据。我注意到每个阶段的shuffle“写”和“读”的指标都显示在特定作业的Spark UI中。一个阶段还可能有一个“输入”大小(例如来自HDFS或hive表扫描的输入)。

我注意到,一个供给另一个阶段的洗牌写入大小与该阶段的洗牌读取大小不匹配。如果我记得正确,存在可在将其传输到下一个阶段/执行器之前对洗牌数据执行的缩减器类型操作以进行优化。也许这就是两个值之间差异的原因,因此报告这两个值的相关性。


嗨@Dranyar,我认为这不仅仅是将数据传递到下一个阶段,当您执行任何按组操作以获取数据局部性时,洗牌会发生。我认为这应该与特定操作的网络数据移动有关。你怎么看? - Srini
在你的陈述中,“它”是什么意思:“我不认为这只是将数据传递到下一个阶段”?我可能有些困惑。此外,我不确定你所说的“获取数据局部性”是什么意思。看起来,Spark 历史 UI 指示任务是否恰好在分区位置本地运行。 - Dranyar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接