2016-04-11 6 views
1

大きなrddがあり、グローバルを使用する関数を適用したいとします。私の質問は、何回グローバルがコピーされるかです。グローバル変数は、各ワーカーの各プロセッサに(RAMで)コピーできますか?

ドライバノードと2つのワーカーノードがあり、各ワーカーには4つのプロセッサがあるとします。グローバル変数は(各ワーカー・ノードの各プロセッサーごとに)8回(RAMで)コピーされますか? 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はNアクティブワーカーとメートルパーティション変数と別interpretesのタスクを実行するためN回移し、メートル回(一回各アクティブPythonのプロセスのための)を非直列化されなければなりません。そのため、PySparkのメモリ使用量は、おおよそsize-of-serialized-structure + #python-processes * size-of-deserialized-structureとなるはずです。

+0

あなたの答えをありがとうが、私はまだ完全に理解していません。ワーカーノードに4つのコアがある場合、そのワーカーで4つのタスクが実行されます。オブジェクトがデシリアライズされた後、RAMにストロークされます。これは、各タスクに対してワーカーで4回発生します。共有変数はワーカーに4回RAMに保存されますか?それは私の理解です、それは間違っていますか? – Akavall

+0

それは完璧な意味合いがあります。ありがとうございました。 – Akavall

関連する問題