当我们按键加入两个 Stream 组时,内部会发生啥?
Posted
技术标签:
【中文标题】当我们按键加入两个 Stream 组时,内部会发生啥?【英文标题】:What happen internally when we join two DStream grouped by keys?当我们按键加入两个 Stream 组时,内部会发生什么? 【发布时间】:2016-03-16 17:24:41 【问题描述】:我是 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 级别)时,内部会发生什么?
谢谢!
【问题讨论】:
【参考方案1】:当您使用groupByKey
和join
时,您会造成随机播放。一张图来说明:
假设您有一个传入的 RDD 流(称为 DStream
),它们是 String, Int
的元组。您想要的是按键(在本例中是一个词)对它们进行分组。但是,并非所有密钥都在同一个 executor 中本地可用,它们可能会分布在之前在所述 RDD 上完成工作的许多工作人员之间。
spark 现在要做的就是说“嘿伙计们,我现在需要所有值等于 X 的键去给工人 1,所有值为 Y 的键去给工人 2 等等”,所以您可以在单个工作节点中拥有给定键的所有值,然后可以继续在每个 RDD 上做更多的工作,现在类型为 (String, Iterator[Int])
作为分组的原因。
join 的行为类似于 groupByKey
,因为它必须具有所有可用的键才能比较 RDD 的每两个键流。
在幕后,Spark 必须做几件事才能使其发挥作用:
数据重新分区:因为单个工作人员可能无法使用所有密钥 数据序列化/反序列化和压缩:由于 spark 必须潜在地跨节点传输数据,因此必须对其进行序列化,然后再进行反序列化 磁盘 IO:作为 shuffle 溢出的原因,因为单个工作器可能无法将所有数据保存在内存中。欲了解更多信息,请参阅this introduction to shuffling。
【讨论】:
感谢您的解释。我误解了这样一个事实,即 DStream 可以在瞬间 t 被视为一个 RDD。我还有一个问题,你知道 mapWithState 是否会很快在 Python (PySpark) 中实现吗?这里介绍过 databricks.com/blog/2016/02/01/… @AimeneBelfodil 我不知道。询问的好地方是Apache Spark User List 我正在尝试订阅用户列表但没有成功@Yuval 哈哈以上是关于当我们按键加入两个 Stream 组时,内部会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
仅当找到第 1 组时,来自两个组的 Redshift SQL 汇总量