从dstream驱动程序中收集RDD的结果

时间:2015-02-25 22:09:32

标签: apache-spark spark-streaming rdd dstream

我在驱动程序中有这个功能,它将rdds的结果收集到一个数组中并发回。但是,即使RDD(在dstream中)有数据,该函数也会返回一个空数组......我做错了什么?

def runTopFunction() : Array[(String, Int)] = {
        val topSearches = some function....
        val summary = new ArrayBuffer[(String,Int)]()
        topSearches.foreachRDD(rdd => {
            summary = summary.++(rdd.collect())
        })    

    return summary.toArray
}

2 个答案:

答案 0 :(得分:1)

因此,虽然foreachRDD将执行您要执行的操作,但它也是非阻塞的,这意味着它不会等到所有流都被处理完毕。由于您在调用toArray后立即在缓冲区上调用foreachRDD,因此尚未处理任何元素。

答案 1 :(得分:1)

DStream.forEachRDD是对给定DStream的操作,将在每个流批处理间隔计划执行。这是后来要执行的作业的声明性构造。

不支持以这种方式累积值,因为当Dstream.forEachRDD只是说“在每次迭代时执行此操作”时,会立即执行周围的累积代码,从而产生一个空数组。

根据计算后summary数据发生的情况,如何实现这一点的选项很少:

  • 如果数据需要由另一个进程检索,请使用共享的线程安全结构。优先级队列非常适合使用top-k。
  • 如果要存储数据(fs,db),您可以在将topSearches功能应用到dstream后写入存储。