是Spark流

问题描述:

DSTREAM提供的union两种类型两种类型工会之间有什么不同:是Spark流

StreamingContext.union(Dstreams) 

Dstream.union(anotherDstream) 

所以我想知道什么是不同的,尤其是在并行性能。

查看这两个操作的源代码,除了一个以单一的DStream作为输入而另一个是一个列表之外,没有区别。

StreamingContext

def union[T: ClassTag](streams: Seq[DStream[T]]): DStream[T] = withScope { 
    new UnionDStream[T](streams.toArray) 
} 

Dstream

def union(that: DStream[T]): DStream[T] = ssc.withScope { 
    new UnionDStream[T](Array(this, that)) 
} 

因此,您所使用的一个取决于您的喜好,没有性能提升可拿。当你有一个要联合的流列表时,StreamingConext中的方法简化了代码,因此,在这种情况下可能更好。

+0

不错的答案,我在发布答案之前准备好了,但我不得不去某个地方,所以我决定发布我的答案。你能看看吗? – gsamaras

您的声明“DStream提供了两种类型的联合”并不完全正确。

ref提到了不同的签名,更具体地说是提供联合操作的不同类。

StreamingContext.union(* dstreams)

创建由相同类型和相同幻灯片的时间长度的多个DStreams统一DSTREAM。

DStream.union(其他)

返回一个与此DSTREAM另一DSTREAM的统一数据新DSTREAM。 参数:other - 与此DStream具有相同间隔(即,slideDuration)的另一个DStream。

后来在Spark User List讨论:“工会函数返回与来自两个元素的DSTREAM这是相同的行为,当我们要求工会在RDDS”。


StreamingContext源代码:4 DStream

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) 

的源代码:

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的过程,因此可以在保持代码清洁的同时提供方便的方法。恕我直言,这不会有性能上的差异。