我的假设是在驱动程序的Spark Context中维护累加器。与广播变量不同,累加器的值不会发送到群集中的工作节点。它是否正确 ?如果是这样,它在Spark上下文中如何更新的机制是什么?如何从工作节点上的各个执行程序实现更新?它是Singleton对象吗?
答案 0 :(得分:1)
然后,在集群上运行的任务可以使用add方法或+ =运算符(在Scala和Python中)添加到它。但是,他们无法读懂它的价值。只有驱动程序可以使用其值方法读取累加器的值。
查看实现,似乎累加器将其值保持在驱动程序端(可以读取的位置)。
至于遗嘱执行人。我看到累加器在反序列化时注册到TaskContext
。因此,执行程序似乎保留了自己的内部累加器,后来与驱动程序的实际累加器合并。
累加器不是单个对象,因为可以创建多个累加器。但是,执行程序有一种与驱动程序应用程序的原始累加器进行通信的方法。