如何在任务中访问累加器的值?

时间:2015-12-08 22:40:30

标签: scala apache-spark accumulator

我正在尝试在群集的任务中访问累加器的值。但是当我这样做时它会引发异常:

  

无法读取累加器的值

我尝试使用row.localValue,但它返回相同的数字。有解决方法吗?

private def modifyDataset(
  data: String, row: org.apache.spark.Accumulator[Int]): Array[Int] = {

  var line = data.split(",")
  var lineSize = line.size      
  var pairArray = new Array[Int](lineSize-1)
  var a = row.value
  paiArray(0)=a

  row+=1
  pairArray

}


var sc = Spark_Context.InitializeSpark
var row = sc.accumulator(1, "Rows")

var dataset = sc.textFile("path")

var pairInfoFile = noHeaderRdd.flatMap{ data => modifyDataset(data,row) }
  .persist(StorageLevel.MEMORY_AND_DISK)        
pairInfoFile.count()

1 个答案:

答案 0 :(得分:0)

根本不可能,也没有解决方法。 Spark accumulators是来自worker透视图的只写变量。任何在任务期间读取其值的尝试都没有意义,因为工作者之间没有共享状态,本地累加器值仅反映当前分区的状态。

一般来说,accumulators主要用于诊断,不应用作应用程序逻辑的一部分。在内部转换中使用时,唯一的保证是至少执行一次。

另请参阅:How to print accumulator variable from within task (seem to "work" without calling value method)?