
2.4
変換
23
かねません。この場合、Sparkがクラスタ上でどのようにコードを実行するのかを理解する必要があり
ます。
クラスタモードでは、ジョブが投入されて実行されるとき、そのジョブはドライバノード(もしくは
マスターノード)に送られます。ドライバノードはそのジョブの DAG(「 1 章 Spark を理解する」参照)
を生成し、それぞれのタスクを実行するエクゼキュータ(あるいはワーカー)ノードを決定します。
そしてドライバは、ワーカーに対してそれぞれのタスクを実行し、処理が終われば結果をドライバに
返すように指示します。ただしその前に、ドライバはそれぞれのタスクのクロージャを準備します。ク
ロージャはドライバ上にあるメソッドや変数の集合で、ワーカーが RDDに対してタスクを実行するた
めのものです。
この変数とメソッドの集合は、エクゼキュータの動作環境の中では本来的に静的なものです。すなわ
ち、それぞれのエクゼキュータがドライバから受け取るのはこの変数とメソッドのコピーであり、仮に
タスクの実行時にエクゼキュータがこれらの変数を書き換えたり、メソッドを上書きしたりしても、そ
れが他のエクゼキュータのコピーやドライバの変数やメソッドに影響することはありません。このため
に挙動が予想外のものになったり、しばしばきわめて追跡が難しい実行時のバグが生じたりすることに
なります。
次の
PySpark
のドキュメンテーションにはさらに多くの実際的な例があるので、調べてみて
ください(
http://spark.apa ...