2016-04-11 32 views
1

假設我有大的rdd,我想應用使用全局函數。我的問題是:全球複製了多少次。將全局變量複製(在RAM中)到每個工人的每個處理器上嗎?

比方說,我有一個驅動程序節點和2個工人節點,其中每個工人有4個處理器。將全局變量複製(在RAM中)8次(對於每個工作節點上的每個處理器)? rdd擁有的分區數量不相關(只要不小於8),對吧?

換句話說,如果我的全局/共享數據結構佔用了100 MB的RAM,如果一個工作者有4個處理器,那麼給定的工人將佔用400 MB RAM,對嗎?

以下是我在說什麼僞codish例如:

from pyspark import SparkContext 

sc = SparkContext(appName="myApp) 

my_dict = {"a": 1, "b": 2, "c": 3, "d": 4} # at no point will be modified 

def my_func(letter): 
    return my_dict[letter] 

my_list_rdd = # Make my rdd 

result = my_list_rdd.map(lambda x: my_func(x)) 

# do something with result 

我知道,我應該使用broadcast在這裏,但我想確保我明白什麼是在以下情況下會全局。

回答

3

按照programming guide

火花自動廣播由每個階段內的任務所需要的公共數據。以這種方式廣播的數據以序列化形式緩存並在運行每個任務之前反序列化。

由於PySpark執行單獨interpretes任務與Ñ活性工人和分區變量要傳輸Ñ倍和(對於每個活性Python進程一次)反序列化倍。所以PySpark中最高的內存使用量應該大致爲size-of-serialized-structure + #python-processes * size-of-deserialized-structure

+0

謝謝你的回答,但我還是不完全明白。如果一個工作節點有4個內核,那麼該工作將運行4個任務。在一個對象被反序列化之後,它被存儲在RAM中,並且每個任務都會在worker上發生4次。所以共享變量將被存儲在RAM上4次的工作人員?這是我的理解,是錯的? – Akavall

+0

這很有道理。謝謝。 – Akavall

相關問題