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

时间:2016-03-16 17:24:42

标签: spark-streaming

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

想象一下,我们的代码中有:

ssc = StreamingContext(sc, 5)

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

想象一下,我有两个DStream DS1和DS2(每个5s)。我的代码是:

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

当您使用groupByKeyjoin时,您会导致混乱。一张图片说明:

Shuffling data

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

现在要做的是什么,是说"嘿伙计们,我现在需要所有值等于X的键去工作者1,所有键值Y是去工人2等等#34;,因此您可以在单个工作节点中拥有给定键的所有值,然后可以继续对每个RDD(现在为(String, Iterator[Int])类型作为分组原因)执行更多工作。

联接的行为类似于groupByKey,因为它必须拥有所有密钥才能比较RDD的每两个密钥流。

在幕后,为了实现这一点,火花必须做一些事情:

  • 重新分区数据:由于单个工作人员可能无法使用所有密钥
  • 数据序列化/反序列化和压缩:由于spark必须可能跨节点传输数据,因此必须将其序列化并在以后反序列化
  • 磁盘IO:由于单个工作人员可能无法将所有数据保存在内存中,因此导致了随机泄漏。

有关详情,请参阅this introduction to shuffling