DSTREAM提供的union
兩種類型兩種類型工會之間有什麼不同:是Spark流
StreamingContext.union(Dstreams)
Dstream.union(anotherDstream)
所以我想知道什麼是不同的,尤其是在並行性能。
DSTREAM提供的union
兩種類型兩種類型工會之間有什麼不同:是Spark流
StreamingContext.union(Dstreams)
Dstream.union(anotherDstream)
所以我想知道什麼是不同的,尤其是在並行性能。
查看這兩個操作的源代碼,除了一個以單一的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
中的方法簡化了代碼,因此,在這種情況下可能更好。
您的聲明「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
的過程,因此可以在保持代碼清潔的同時提供方便的方法。恕我直言,這不會有性能上的差異。
不錯的答案,我在發佈答案之前準備好了,但我不得不去某個地方,所以我決定發佈我的答案。你能看看嗎? – gsamaras