我需要运行一个处理海量数据的Spark程序。我正在尝试通过Spark UI优化程序,并试图减少Shuffle部分。
这里提到了两个组件:shuffle读取和shuffle写入。我可以根据它们的术语理解它们之间的区别,但我想了解它们的确切含义,以及哪种spark shuffle的读/写会降低性能?
我在互联网上进行了搜索,但找不到关于它们的详细信息,因此想看看是否有人能在这里解释它们。
我需要运行一个处理海量数据的Spark程序。我正在尝试通过Spark UI优化程序,并试图减少Shuffle部分。
这里提到了两个组件:shuffle读取和shuffle写入。我可以根据它们的术语理解它们之间的区别,但我想了解它们的确切含义,以及哪种spark shuffle的读/写会降低性能?
我在互联网上进行了搜索,但找不到关于它们的详细信息,因此想看看是否有人能在这里解释它们。
来自UI工具提示
Shuffle读取
总的shuffle字节数和记录数(包括本地读取的数据和从远程执行器读取的数据)
Shuffle写入
在磁盘上写入的字节和记录,以便在以后的阶段中进行shuffle读取
我最近开始使用Spark。我一直在寻找类似的问题答案。
当来自一个阶段的数据通过网络洗牌到下一个阶段时,处理下一个阶段的执行器通过TCP从第一个阶段的进程中获取数据。我注意到每个阶段的shuffle“写”和“读”的指标都显示在特定作业的Spark UI中。一个阶段还可能有一个“输入”大小(例如来自HDFS或hive表扫描的输入)。
我注意到,一个供给另一个阶段的洗牌写入大小与该阶段的洗牌读取大小不匹配。如果我记得正确,存在可在将其传输到下一个阶段/执行器之前对洗牌数据执行的缩减器类型操作以进行优化。也许这就是两个值之间差异的原因,因此报告这两个值的相关性。