Dim*_*sov 7 scala apache-spark
有没有办法按名称获取已注册的Spark累加器,而不传递实际参考?期望的行为:
val cnt1 = sc.longAccumulator("cnt1")
val cnt2 = something.getAccumulatorByName("cnt1") asInstanceOf[LongAccumulator]
cnt1.add(1)
cnt2.value // returns 1
Run Code Online (Sandbox Code Playgroud)
谢谢
Spark 中的累加器被保存在其中AccumulatorContext,并且无法从中获取它们。Spark 不允许您这样做,因为累加器在您停止之前不会SparkContext保留。他们实现了规范化映射:累加器会一直保留,直到您对它有强引用为止,一旦它们超出范围,GC 就会清理它们(使用特殊的最终确定过程)。
通过名称获取累加器的唯一方法是将其放入 Map 中。例如,如果您需要在FileFormat或中写入累加器RelationProvider,然后在驱动程序中读取它,只需保留对其的静态引用即可。如果您在同一个类中读取和写入累加器并且希望通过名称获取它们,那么您很可能需要在Map[String, Long]内部创建自定义累加器。就性能而言,它的利润要高得多。