我是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级别)时,内部会发生什么?
谢谢!
答案 0 :(得分:1)
当您使用groupByKey
和join
时,您会导致混乱。一张图片说明:
假设您有一个传入的RDD流(称为DStream
),它们是String, Int
的元组。你想要的是按键分组(在这个例子中是一个单词)。但是,所有的密钥在同一执行者中并不是本地可用的,它们可能会在之前已完成上述RDD工作的许多工作人员之间传播。
现在要做的是什么,是说"嘿伙计们,我现在需要所有值等于X的键去工作者1,所有键值Y是去工人2等等#34;,因此您可以在单个工作节点中拥有给定键的所有值,然后可以继续对每个RDD(现在为(String, Iterator[Int])
类型作为分组原因)执行更多工作。
联接的行为类似于groupByKey
,因为它必须拥有所有密钥才能比较RDD的每两个密钥流。
在幕后,为了实现这一点,火花必须做一些事情:
有关详情,请参阅this introduction to shuffling。