当我们加入两个按键分组的 DStream 时,内部会发生什么?

What happen internally when we join two DStream grouped by keys?

我是 spark 的新手(Python 中的 spark-streaming),如果我理解正确的话,DStream 是 RDD 的序列。

假设我们的代码中有:

ssc = StreamingContext(sc, 5)

因此,每 5 秒生成一个 DSTream 对象,它是一个 RDD 序列。

假设我有两个 DStreams DS1 和 DS2(每个 5s)。我的代码是:

DGS1 = DS1.groupByKey()
DGS2 = DS2.groupByKey()
FinalStream = DS1.join(DS2)

当我调用 groupByKey 和 Join(在 RDD 级别)时内部发生了什么?

谢谢!

当您使用 groupByKeyjoin 时,您会导致随机播放。一张图说明:

假设您有一个传入的 RDD 流(称为 DStream),它们是 String, Int 的元组。你想要的是按键对它们进行分组(在这个例子中是一个词)。但是,并非所有密钥都在同一个执行程序中在本地可用,它们可能会分布在许多以前在上述 RDD 上完成过工作的工作人员之间。

spark 现在要做的是 "Hey guys, I now need all keys which values are equal to X to go to worker 1, and all keys which values are Y to go to worker 2, etc",这样你就可以在单个工作节点中拥有给定键的所有值,然后它可以继续在每个 RDD 上做更多的工作,现在(String, Iterator[Int]) 类型作为分组的原因。

连接在行为上与 groupByKey 相似,因为它必须让所有键都可用才能比较 RDD 的每两个键流。

在幕后,spark 必须做几件事才能使其工作:

  • 数据的重新分区:因为所有键可能无法在单个 worker 上使用
  • 数据serialization/deserialization和压缩:由于spark可能会跨节点传输数据,所以它必须被序列化,然后反序列化
  • 磁盘 IO:由于单个工作人员可能无法将所有数据保存在内存中,因此导致随机溢出。

有关更多信息,请参阅 this introduction to shuffling