我正在使用spark streaming,我想创建一个累加器来计算到目前为止dstream的实例数。我想在train方法中增加计数器然后我想在另一个名为assign的方法中使用这个计数器。发布的代码不起作用。我在sparks UI中找不到命名累加器,当我在方法外打印它的值时总是为零。如果您认为有更合适的方法(我的意思是没有累加器)请解释我如何。
var numInstances: LongAccumulator = null
def init(ssc:StreamingContext) : Unit = {
numInstances = ssc.sparkContext.longAccumulator("numInst")
}
def train(input: DStream[Example]): Unit = {
input.foreachRDD(rdd => {
rdd.foreach(ex => {
manager = manager.update(ex)
numInstances.add(1)
})
})
}
def assign: Array[Example] = {
if(numInstances.value <= sizeOption.getValue) {
//do something
}
else {
//do something else
}
}
答案 0 :(得分:0)
由于传递给foreachRDD
的函数在驱动程序上执行,您可以用这种方式重写train
:
var totalCount = 0L
def train(input: DStream[Example]): Unit = {
input.foreachRDD { rdd =>
totalCount += rdd.count()
rdd.foreach { ex =>
manager = manager.update(ex)
}
}
}
小心totalCount
值 - 更改不由Spark分发,仅在驱动程序上有效,因此您无法在执行程序上运行的代码中使用它。