【问题标题】:Can Spark theoretically lose a data of the failed job?Spark 理论上会丢失失败作业的数据吗?
【发布时间】:2018-09-26 15:46:58
【问题描述】:

所以我们使用RDD 并对一组数据执行flatMap。然后我们使用映射操作转换每个元素。

val elementsRDD: RDD[Element] = ...

val result = elements.map(processData);

在一组固定的元素上,我们看到在每次运行时,如果某些执行器在 map 操作期间死亡,spark 会启动新的执行器,但它不会为操作提供数据,因此我们会丢失数据。我们期望 Spark 应该提供数据或至少从头开始重新运行阶段。

我们使用 Spark 2.4 的最新 Kubernetes 功能(仍在开发中)

更新:文档说这是不可能的情况,但是我们从执行程序的日志记录表明,在对一组固定数据进行数据处理期间,我们丢失了不同的数据。此外,如果我们在一个过程中不杀死任何执行者,我们就不会丢失任何数据。

【问题讨论】:

    标签: apache-spark kubernetes


    【解决方案1】:

    没有。为死掉的执行者处理的数据将会丢失,但是当驱动程序注意到一个执行者的失败时,它会将死亡执行者的工作分配给仍然活着的执行者。在成功完成所有作业之前,Spark 不会成功申请成功。

    你可以阅读一些关于 Spark 高可用性的注释here

    更新:

    正如@user6910411 所指出的,在某些情况下您可能会丢失数据:如果您的 Spark 应用程序使用的数据源不是持久的,或者它提供了临时数据。在这些情况下,修改 Spark 应用程序使用的数据可能会导致数据丢失。

    【讨论】:

    • 当且仅当您假设数据源是持久/可靠的时,整个陈述才是正确的。如果不是这种情况,执行程序失败可能会导致不可恢复的数据丢失。
    • 同意。如果您有不可靠的数据源,最好检查点,即从源创建一个中间表,然后对其进行处理
    • 你们说的都对,我已经更新了我的答案,指出了这一点。
    • 不幸的是,这些案例都与我们无关,我们从文件中读取数据。还有其他可能导致这种奇怪行为的想法吗?
    • @GregTk 听起来您正在处理一个非常具体的场景。因此,问题将真正受益于某种形式的minimal reproducible example 或至少对过程的详细描述(你如何加载,processData,它是什么接收器,你如何登录等等)。
    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多