Scala 在执行器上动态创建累加器
我想使用累加器来计算RDD中对象的几个参数的组合。 例如,我有Scala 在执行器上动态创建累加器,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我想使用累加器来计算RDD中对象的几个参数的组合。 例如,我有Obj的RDD,带有a和b字段。这两个字段都是枚举,可能有几个值中的一个。 为了实现这一点,我应该在驱动程序上创建累加器,并在工人身上使用: val acc1 = sc.longAccumulator("a1-b1") val acc2 = sc.longAccumulator("a2-b1") val acc3 = sc.longAccumulator("a1-b2") .
Obj
的RDD,带有a
和b
字段。这两个字段都是枚举,可能有几个值中的一个。
为了实现这一点,我应该在驱动程序上创建累加器,并在工人身上使用:
val acc1 = sc.longAccumulator("a1-b1")
val acc2 = sc.longAccumulator("a2-b1")
val acc3 = sc.longAccumulator("a1-b2")
...
我不想为所有spark作业中的所有值组合声明大量计数器,因为我将使用相同的逻辑。
是否有任何机制允许在executor上动态创建累加器或以另一种方式解决此问题
我搜索类似的内容:
rdd.foreach{ getAccumulator("${obj.a} - ${obj.b}").add(1) }
从字面上回答您的问题,您不能在执行器上动态注册新的累加器。在作业实际开始之前,必须在驱动程序(
sparkContext.acculator()
)上计划蓄能器。这就是Spark中蓄能器的设计方式
但是考虑到您实际想要实现的功能,您可能会得出结论,通过只有一个“静态”累加器可以实现相同的功能,该累加器收集Map
条目,而不是Long
博客文章可能会让我更实际地理解这里的意思