3

DSTREAM提供的union兩種類型兩種類型工會之間有什麼不同:是Spark流

StreamingContext.union(Dstreams) 

Dstream.union(anotherDstream) 

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

回答

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中的方法簡化了代碼,因此,在這種情況下可能更好。

+0

不錯的答案,我在發佈答案之前準備好了,但我不得不去某個地方,所以我決定發佈我的答案。你能看看嗎? – gsamaras

0

您的聲明「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的過程,因此可以在保持代碼清潔的同時提供方便的方法。恕我直言,這不會有性能上的差異。