我正在尝试在群集的任务中访问累加器的值。但是当我这样做时它会引发异常:
无法读取累加器的值
我尝试使用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()
答案 0 :(得分:0)
根本不可能,也没有解决方法。 Spark accumulators
是来自worker透视图的只写变量。任何在任务期间读取其值的尝试都没有意义,因为工作者之间没有共享状态,本地累加器值仅反映当前分区的状态。
一般来说,accumulators
主要用于诊断,不应用作应用程序逻辑的一部分。在内部转换中使用时,唯一的保证是至少执行一次。
另请参阅:How to print accumulator variable from within task (seem to "work" without calling value method)?