Dstream提供两种union
:
StreamingContext.union(Dstreams)
Dstream.union(anotherDstream)
所以我想知道有什么不同,特别是在并行性能方面。
答案 0 :(得分:2)
查看两个操作的源代码,除了将一个DStream
作为输入而另一个作为输入之外没有区别。
def union[T: ClassTag](streams: Seq[DStream[T]]): DStream[T] = withScope {
new UnionDStream[T](streams.toArray)
}
def union(that: DStream[T]): DStream[T] = ssc.withScope {
new UnionDStream[T](Array(this, that))
}
因此,您使用哪一个取决于您的偏好,没有性能收益。当你有一个要联合的流列表时,StreamingConext
中的方法稍微简化了代码,因此,在这种情况下可能更好。
答案 1 :(得分:0)
您的声明" DStream
提供两种类型的联盟"是不对的。
ref提到了不同的签名,更具体地说是提供联合操作的不同类。
<强> StreamingContext.union(* dstreams)强>
从相同类型和相同幻灯片持续时间的多个DStream中创建统一的DStream。
<强> DStream.union(其他)强>
通过使用此DStream统一另一个DStream的数据来返回新的DStream。 参数:other - 与此DStream具有相同间隔(即slideDuration)的另一个DStream。
后面将在Spark User List中讨论:&#34; union函数只返回一个带有两者元素的DStream。这与我们在RDD上调用union时的行为相同&#34;。
StreamingContext的源代码:
def union(self, *dstreams):
...
first = dstreams[0]
jrest = [d._jdstream for d in dstreams[1:]]
return DStream(self._jssc.union(first._jdstream, jrest), self, first._jrdd_deserializer)
DStream的源代码:
def union(self, other):
return self.transformWith(lambda a, b: a.union(b), other, True)
你可以看到第一个使用递归(如预期的那样),而另一个使用transformWith
,它在同一个类中定义并转换每个RDD。
要记住的是Level of Parallelism in Data Receiving,如果数据接收成为系统中的瓶颈,那么考虑并行化数据接收过程将是一个好主意。
因此,鼓励将union()
方法应用于多个DStreams
的过程,从而提供了一种方法,可以轻松完成此操作,同时保持代码清洁。恕我直言,表现不会有所不同。