【问题标题】:Where does an accumulator variable in Spark live?Spark 中的累加器变量在哪里?
【发布时间】:2016-02-29 18:53:32
【问题描述】:

我的假设是在驱动程序的 Spark 上下文中维护一个累加器。与广播变量不同,累加器的值不会发送到集群中的工作节点。这个对吗 ?如果是这样,它如何在 Spark Context 中更新的机制是什么?工作节点上的各种 Executor 对它的更新是如何实现的?是单例对象吗?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    引用spark documentation

    然后可以使用 add 方法或 += 运算符(在 Scala 和 Python 中)将在集群上运行的任务添加到其中。但是,他们无法读取其值。只有驱动程序可以读取累加器的值,使用它的 value 方法。

    查看实现,累加器似乎将其值保留在驱动程序端(可以读取)。

    至于执行者。我看到累加器在反序列化时注册到TaskContext。所以看起来executors保留了自己的内部累加器,稍后与驱动程序的真实累加器合并。

    累加器不是单例对象,因为可以创建多个累加器。然而,执行器有办法与驱动程序应用程序的原始累加器进行通信。

    【讨论】:

    • 但是如果执行者保留自己的内部累加器,那么执行者的更新是如何发生的呢?所以执行器 1 说加 2,执行器 2 加 1 等等,这些都是由驱动程序在其“黄金”累加器中加起来的吗?
    • 是的。从我在代码中看到的情况来看,累加器有一个合并函数,用于合并执行器的结果以计算驱动程序中的最终结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多