首页 > 解决方案 > Spark Shuffle 写入大小是输入大小的 7500 倍

问题描述

我正在处理我们的一个火花簇中的一个非常奇怪的情况。

我们正在测试一个在客户端模式下运行并为执行程序使用动态分配的 spark 应用程序。

在测试应用程序时,QA 决定手动终止它(终止命令,而不是 Spark UI)并重新启动它。一旦应用程序再次开始处理数据,它就会永远卡在其中一个阶段。第一次出现问题后,应用程序的行为总是一样的,总是卡在同一个地方(collectAsList()。此时数据预计会非常小,足以放入驱动程序的内存中) .

尽管我能够在有问题的环境中重现该问题,但在另一个环境中我看不到这种行为。在 Spark UI 中寻找线索时,我注意到虽然它从 kafka 加载了 15k 条记录(这没什么),但它正在处理的输入仅显示 2 条记录,不知何故,对于 17298252119 条记录,shuffle 写入的大小是惊人的 6.3GB . 此阶段仅使用 4 个分区运行(我们使用哈希分区,默认设置为 200 用于随机播放)。

随机写入大小

到目前为止,我唯一的理论是杀死进程以某种方式破坏了一些 spark 或 shuffle 服务跟踪信息,而不是只处理它收到的数据,shuffle 服务正在尝试恢复旧记录。

似乎与随机播放问题相关的另一条信息是,在这种情况下,应用程序多次处理数据集,然后加入所有生成的数据帧(在这种情况下,有 4 个数据集加入)。

欢迎任何帮助。尽管我倾向于得出环境已损坏的结论,但我无法证明这一点,而且由于 spark 是一个复杂的野兽,这个问题可能会再次发生。

谢谢你。

标签: apache-sparkjoinshufflepartition

解决方案


推荐阅读