火花流中两种类型的联合是否有任何不同

时间:2017-08-30 06:51:15

标签: performance apache-spark spark-streaming distributed-computing data-stream

Dstream提供两种union

StreamingContext.union(Dstreams)

Dstream.union(anotherDstream)

所以我想知道有什么不同,特别是在并行性能方面。

2 个答案:

答案 0 :(得分:2)

查看两个操作的源代码,除了将一个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中的方法稍微简化了代码,因此,在这种情况下可能更好。

答案 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的过程,从而提供了一种方法,可以轻松完成此操作,同时保持代码清洁。恕我直言,表现不会有所不同。