gpt4 book ai didi

apache-spark - Spark 数据帧缓存/持久未按预期工作

转载 作者:行者123 更新时间:2023-12-03 09:20:58 24 4
gpt4 key购买 nike

我有一个执行典型 ETL 工作的 Spark 1.3 应用程序:它从多个不同的配置单元表中读取数据,对数据帧执行联接和其他操作,最后将输出作为文本文件保存到 HDFS 位置。

该应用程序工作正常,但其第 6 阶段经常遇到故障,并显示错误消息,例如“失败但未被确认”。 Spark 将重试并最终成功完成所有阶段。

为了加快重试过程,我想缓存第 6 阶段的父数据帧。我为第 6 阶段使用的数据帧添加了 .persist(StorageLevel.MEMORY_AND_DISK_SER)。但是,当作业运行时,从 Spark UI 中,我可以看到没有任何内容被缓存/保留。当第 6 阶段失败时,所有需要的数据将再次重新计算。

这对于两个集群来说是一样的,一个是独立的,一个是在 Yarn 下。我还尝试了 .cache().persist(StorageLevel.MEMORY_ONLY) 等,但结果相同。我不确定这是什么原因。与可用内存相比,我想要缓存的数据并不大(~50G 与~500G)。唯一值得一提的是我想要缓存的数据后来从未使用过多次 - 理论上,如果第 6 阶段不会经常失败,我根本不需要缓存。

有人对持久/缓存为何如此表现有更多见解吗?

最佳答案

您可能在阶段边界缓存了 RDD,因此实际缓存和错误发生在同一阶段。尝试通过对每个 RDD 运行一个操作来强制具体化 RDD,例如缓存它们后立即执行 .count()

还要注意,当执行器死亡时,它缓存的数据也会随之消失。如果您的错误属于此类,那么使用 .checkpoint() 而不是缓存会更好。

最后,我建议花时间了解实际导致您所看到的错误的原因(听起来超时太低),否则您将继续浪费周期重新计算数据并最终再次遇到类似的情况。

关于apache-spark - Spark 数据帧缓存/持久未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31256084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com