在Spark流式传输中,每批数据间隔始终只生成一个且只有一个RDD,为什么我们使用foreachRDD()
来预测RDD? RDD只是一个,不需要的东西。
在我的测试中,我从未见过RDD多于一个。
答案 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.foreach
向每位用户提供咖啡。考虑执行:我们可能会有一群咖啡师制作咖啡。那些是我们的执行者。 Spark Streaming负责制作一小批用户(或订单),Spark会在咖啡师之间分配工作,这样我们就可以将咖啡制作并行化并加快咖啡供应。