将RDD输出收集为流

时间:2015-08-25 12:37:05

标签: apache-spark streaming output

我有一份像这样结束的工作

val iteratorRDD: RDD[Iterator[SomeClass]] = ....

val results = iteratorRDD.map( iterator => iterator.toSeq)
                         .collect

迭代器是惰性的,即它们在访问项目时计算数据,这里toSeq基本上会迭代地调用.next()

现在,这个计算速度很慢,我想在生成迭代器后立即得到迭代器的输出,基本上是每个iterator.next()。原因是后面的步骤(在本地运行)按顺序处理项目:f(all the first items),然后是f(all the seconds)等......我需要尽快得到这些,因此在结束之前这份工作。

spark是否提供了某些意义来检索中间结果作为某种流?或者可能存在迭代器可以向其发送中间数据的分布式数据结构?

我能做的是设置一个充当这样一个缓冲区的Web服务:它会监听每次调用iterator.next()时发送的数据。然后让我的主程序调用该Web服务来获取它存储的内容。但我不喜欢让所有工作人员与外部服务进行通信。

1 个答案:

答案 0 :(得分:0)

这样做我没有任何意义。迭代器,如果你不想在本地内存中创建副本,那么遍历很好,但Spark的工作方式不同。您的迭代器分布在多个执行程序中(在单独的节点中,具有单独的内存),因此当您调用collect时,将强制它们被迭代并发送到主服务器,它们将被加载到内存中。根本无法从主服务器到执行程序中的数据进行延迟评估。

你应该努力将计算发送到数据而不是相反,特别是如果你打算在每个序列上运行相同的代码!例如:

val results = iteratorRDD
  .map(iter => f(iter)) // Whatever f() returns.
  .collect()

然后,您可以在执行程序上懒惰地并行地评估迭代器,只将实际结果带给主控。