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

Guo*_*Guo 24 apache-spark spark-streaming

在火花流中,每个批处理间隔的数据总是产生一个且只有一个RDD,为什么我们用它foreachRDD()来预测RDD?RDD只有一个,不需要foreach.在我的测试中,我从未见过RDD不止一个.

maa*_*asg 46

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

RDD是分布式数据集合.可以将其视为一组指向集群中实际数据的指针.

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

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

val userList: List[User] = ???
userList.foreach{user => doSomeSideEffect(user)}
Run Code Online (Sandbox Code Playgroud)

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

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

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

注意:

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

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

  • @maasg 我还是不明白!正如你所说,“**在每个批次间隔为每个 DStream 生成一个且只有一个 RDD”,它不需要 `foreachRDD()` 的 API 来 foreach RDD,因为只有一个 RDD,`foreachRDD() ` 可以命名为 `getRDD()` 并返回 RDD 对象。您的示例可以这样修改: `val userDStream: DStream[User] = ???` `userDstream.getRDD.foreach{user =>serveCoffee(user)}` (2认同)