【发布时间】:2016-02-29 18:53:32
【问题描述】:
我的假设是在驱动程序的 Spark 上下文中维护一个累加器。与广播变量不同,累加器的值不会发送到集群中的工作节点。这个对吗 ?如果是这样,它如何在 Spark Context 中更新的机制是什么?工作节点上的各种 Executor 对它的更新是如何实现的?是单例对象吗?
【问题讨论】:
标签: apache-spark
我的假设是在驱动程序的 Spark 上下文中维护一个累加器。与广播变量不同,累加器的值不会发送到集群中的工作节点。这个对吗 ?如果是这样,它如何在 Spark Context 中更新的机制是什么?工作节点上的各种 Executor 对它的更新是如何实现的?是单例对象吗?
【问题讨论】:
标签: apache-spark
然后可以使用 add 方法或 += 运算符(在 Scala 和 Python 中)将在集群上运行的任务添加到其中。但是,他们无法读取其值。只有驱动程序可以读取累加器的值,使用它的 value 方法。
查看实现,累加器似乎将其值保留在驱动程序端(可以读取)。
至于执行者。我看到累加器在反序列化时注册到TaskContext。所以看起来executors保留了自己的内部累加器,稍后与驱动程序的真实累加器合并。
累加器不是单例对象,因为可以创建多个累加器。然而,执行器有办法与驱动程序应用程序的原始累加器进行通信。
【讨论】: