12

Python メソッド内からブロードキャスト変数を作成しようとしています (分散操作に依存する、作成中のいくつかのユーティリティ メソッドを抽象化しようとしています)。ただし、Spark ワーカー内からブロードキャスト変数にアクセスできないようです。

この設定があるとしましょう:

def main():
    sc = SparkContext()
    SomeMethod(sc)

def SomeMethod(sc):
    someValue = rand()
    V = sc.broadcast(someValue)
    A = sc.parallelize().map(worker)

def worker(element):
    element *= V.value  ### NameError: global name 'V' is not defined ###

ただし、代わりに仲介者を排除すると、SomeMethod()うまく機能します。

def main():
    sc = SparkContext()
    someValue = rand()
    V = sc.broadcast(someValue)
    A = sc.parallelize().map(worker)

def worker(element):
    element *= V.value   # works just fine

可能であれば、すべての Spark ロジックをメイン メソッドに配置する必要はありません。ローカル関数内から変数をブロードキャストし、それらを Spark ワーカーにグローバルに表示する方法はありますか?

別の方法として、この種の状況に適した設計パターンは何でしょうか?たとえば、自己完結型で、再利用したい特定の機能を実行する Spark 専用のメソッドを作成したいですか?

4

1 に答える 1