累加器作为火花流中的计数器

时间:2018-05-12 13:39:09

标签: apache-spark spark-streaming

我正在使用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
 }
}

1 个答案:

答案 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分发,仅在驱动程序上有效,因此您无法在执行程序上运行的代码中使用它。