web-dev-qa-db-ja.com

Sparkでエグゼキューターメモリとドライバーメモリを処理する方法

Sparkでのエグゼキューターメモリとドライバーメモリの処理について混乱しています。

私の環境設定は次のとおりです。

  • メモリ128 G、9 VM用16 CPU
  • Centos
  • Hadoop 2.5.0-cdh5.2.0
  • Spark 1.1.0

入力データ情報:

  • HDFSからの3.5 GBデータファイル

簡単な開発のために、Pythonコードをスタンドアロンクラスターモード(8ワーカー、20コア、45.3 Gメモリ)でspark-submit。次に、パフォーマンスチューニングのためにエグゼキューターメモリまたはドライバーメモリを設定します。

Spark documentation から、executorメモリの定義は

Executorプロセスごとに使用するメモリの量。JVMメモリ文字列と同じ形式(512m、2gなど)。

ドライバーのメモリはどうですか?

43
wlsherica

ドライバーに割り当てる必要があるメモリは、ジョブによって異なります。

ジョブが変換のみに基づいている場合であり、rdd.saveAsTextFile、rdd.saveToCassandraなどの分散出力アクションで終了する場合、ドライバーのメモリニーズは非常に低くなります。数百のMBで十分です。ドライバーは、ファイルの配信とメトリックの収集も担当しますが、データ処理には関与しません。

ジョブがドライバーに計算への参加を要求する場合、例えば結果を具体化し、次の反復でそれらをブロードキャストする必要がある一部のMLアルゴリズムは、ドライバーを通過するデータの量に依存します。 .collect.taketakeSampleなどの操作はデータをドライバーに配信するため、ドライバーはそのようなデータを割り当てるのに十分なメモリを必要とします。

例えばクラスターに3GBのrddがあり、val myresultArray = rdd.collectを呼び出す場合、そのデータを保持するためにドライバーに3GBのメモリーと、最初の段落で述べた機能のための余分なスペースが必要です。

95
maasg

Sparkアプリケーションでは、ドライバーがタスクのスケジューリングを担当し、エグゼキューターがジョブの具体的なタスクを実行します。

MapReduceに精通している場合、マップタスクとリデュースタスクはすべてExecutor(SparkではShuffleMapTasks&ResultTasksと呼ばれます)で実行されます。また、キャッシュするRDDはすべてエグゼキューターのJVMのヒープとディスクにもあります。

そのため、ドライバーには数GBで十分です。

4
yjshen