Sparkでのエグゼキューターメモリとドライバーメモリの処理について混乱しています。
私の環境設定は次のとおりです。
入力データ情報:
簡単な開発のために、Pythonコードをスタンドアロンクラスターモード(8ワーカー、20コア、45.3 Gメモリ)でspark-submit
。次に、パフォーマンスチューニングのためにエグゼキューターメモリまたはドライバーメモリを設定します。
Spark documentation から、executorメモリの定義は
Executorプロセスごとに使用するメモリの量。JVMメモリ文字列と同じ形式(512m、2gなど)。
ドライバーのメモリはどうですか?
ドライバーに割り当てる必要があるメモリは、ジョブによって異なります。
ジョブが変換のみに基づいている場合であり、rdd.saveAsTextFile、rdd.saveToCassandraなどの分散出力アクションで終了する場合、ドライバーのメモリニーズは非常に低くなります。数百のMBで十分です。ドライバーは、ファイルの配信とメトリックの収集も担当しますが、データ処理には関与しません。
ジョブがドライバーに計算への参加を要求する場合、例えば結果を具体化し、次の反復でそれらをブロードキャストする必要がある一部のMLアルゴリズムは、ドライバーを通過するデータの量に依存します。 .collect
、.take
やtakeSample
などの操作はデータをドライバーに配信するため、ドライバーはそのようなデータを割り当てるのに十分なメモリを必要とします。
例えばクラスターに3GBのrdd
があり、val myresultArray = rdd.collect
を呼び出す場合、そのデータを保持するためにドライバーに3GBのメモリーと、最初の段落で述べた機能のための余分なスペースが必要です。
Sparkアプリケーションでは、ドライバーがタスクのスケジューリングを担当し、エグゼキューターがジョブの具体的なタスクを実行します。
MapReduceに精通している場合、マップタスクとリデュースタスクはすべてExecutor(SparkではShuffleMapTasks&ResultTasksと呼ばれます)で実行されます。また、キャッシュするRDDはすべてエグゼキューターのJVMのヒープとディスクにもあります。
そのため、ドライバーには数GBで十分です。