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 専用のメソッドを作成したいですか?