按名称获取已注册的Spark Accumulator

时间:2018-01-18 14:16:18

标签: scala apache-spark

有没有办法按名称获取已注册的Spark累加器,而不传递实际参考?期望的行为:

val cnt1 = sc.longAccumulator("cnt1")
val cnt2 = something.getAccumulatorByName("cnt1") asInstanceOf[LongAccumulator]
cnt1.add(1)
cnt2.value // returns 1

由于

1 个答案:

答案 0 :(得分:2)

Spark中的累加器保存在AccumulatorContext中,无法从中获取它们。 Spark不允许您执行此操作,因为保留累加器,直到您停止SparkContext。他们实现了规范化的映射:保留累加器,直到您强烈引用它为止,并且一旦它们超出范围,GC就会清理它们(使用特殊的终结处理)。

按名称获取累加器的唯一方法是将其放入Map中。 例如,如果您需要在FileFormatRelationProvider中写入累加器,然后在驱动程序中读取它,则只需保持静态引用即可。 如果您在同一类中读写累加器,并且想按名称获取它们,则很可能需要在内部创建Map[String, Long]的自定义累加器。就性能而言,它更有利可图。