DStream.foreachRDD函数的含义是什么?

时间:2016-04-05 08:57:51

标签: apache-spark spark-streaming

在Spark流式传输中,每批数据间隔始终只生成一个且只有一个RDD,为什么我们使用foreachRDD()来预测RDD? RDD只是一个,不需要的东西。 在我的测试中,我从未见过RDD多于一个。

1 个答案:

答案 0 :(得分:41)

DStream或"离散化的流"是一种抽象,将连续的数据流分成小块。这被称为"微型化"。每个微量分析成为一个RDD,给予Spark进行进一步处理。 每批次间隔为每个DStream生成一个且仅有一个RDD

RDD是分布式数据集合。可以把它想象成一组指向实际数据在集群中的位置。

DStream.foreachRDD是"输出运算符"在Spark Streaming中。它允许您访问DStream的底层RDD,以执行对数据执行实际操作的操作。例如,使用foreachRDD可以将数据写入数据库。

这里的小小思想是要理解DStream是一个有时限的集合。让我将其与经典集合进行对比:获取用户列表并应用foreach:

val userList: List[User] = ???
userList.foreach{user => doSomeSideEffect(user)}

这会将副作用函数doSomeSideEffect应用于userList集合的每个元素。

现在,让我们说我们现在不了解所有用户,因此我们无法建立他们的列表。相反,我们有一群用户,就像早上赶到咖啡馆的人一样:

val userDStream: DStream[User] = ???
userDstream.foreachRDD{usersRDD => 
    usersRDD.foreach{user => serveCoffee(user)}
}

请注意:

  • DStream.foreachRDD为您提供RDD[User]不是单个用户。回到我们的咖啡示例,即在一段时间内到达的用户集合。
  • 要访问集合的单个元素,我们需要进一步操作RDD。在这种情况下,我使用rdd.foreach向每位用户提供咖啡。

考虑执行:我们可能会有一群咖啡师制作咖啡。那些是我们的执行者。 Spark Streaming负责制作一小批用户(或订单),Spark会在咖啡师之间分配工作,这样我们就可以将咖啡制作并行化并加快咖啡供应。