2014-10-20 14 views
1

設想一個簡單的程序是這樣的:Apache Spark:當一個工作人員使用尚未廣播的主機對象值時會發生什麼?

def main(args: String[]): 
val hostLocalValue = args(0).toInt 
val someRdd = getSomeIntRdd 
val mySum = someRdd 
     .map(x => if (x < 0) 1 else hostLocalValue) 
     .reduce(_ + _) 
print(mySum) 

其在遠程工人執行的地圖函數使用主機 - 本地值而沒有正被廣播。這個怎麼用?如果THAT一直工作,那麼我們需要什麼broadcast()

回答

2

在您的示例中,'hostLocalValue'將被序列化並通過'map'關閉發送給每個工作節點。如果你有1000個分區,這個變量將被分配給工人1000次。你的變量是Int,所以沒關係。但是如果你的變量是字典Map〜100mb,你必須通過網絡發送100個演出。

但是,如果你將廣播包裝你的字典,你只能運送一次=>好處!

+0

這不會是100gig流量嗎?我認爲答案是「是的,但'發送'操作只能完成一次。」我對嗎? – 2014-10-20 20:45:53

+1

如果您有100mb字典,10個工作節點,您想要映射的數據集有1000個分區(每個工作者100個),如果您從驅動程序節點發送此數據,則必須發送100mb * 10 = 1gig的數據。然而,對於廣播變量,Spark使用高性能的p2p協議,因此速度會更快。使用java序列化,你將不得不發送100mb數據1000次的序列化clojure – 2014-10-20 21:03:05

相關問題