YARNでSparkジョブを実行するときのコアの数とエグゼキューターの数の関係を理解しようとしています。
テスト環境は次のとおりです。
- データノードの数:3
- データノードマシンの仕様:
- CPU:Core i7-4790(コア数:4、スレッド数:8)
- RAM:32GB(8GB x 4)
- HDD:8TB(2TB x 4)
ネットワーク:1 Gb
Sparkバージョン:1.0.0
Hadoopバージョン:2.4.0(Hortonworks HDP 2.1)
Sparkジョブフロー:sc.textFile-> filter-> map-> filter-> mapToPair-> reduceByKey-> map-> saveAsTextFile
入力データ
- タイプ:単一のテキストファイル
- サイズ:165GB
- ライン数:454,568,833
出力
- 2番目のフィルター後の行数:310,640,717
- 結果ファイルの行数:99,848,268
- 結果ファイルのサイズ:41GB
ジョブは次の構成で実行されました:
--master yarn-client --executor-memory 19G --executor-cores 7 --num-executors 3
(データノードごとのエグゼキューター、コアと同じだけ使用)--master yarn-client --executor-memory 19G --executor-cores 4 --num-executors 3
(削減されたコアの数)--master yarn-client --executor-memory 4G --executor-cores 2 --num-executors 12
(コアが少なく、実行者が多い)
経過時間:
50分15秒
55分48秒
31分23秒
驚いたことに、(3)ははるかに高速でした。
シャッフルするときに実行者間の通信が少なくなるため、(1)はより高速になると思いました。
(1)のコアの数は(3)より少ないですが、2)は十分に機能したため、コアの数は重要な要素ではありません。
(以下はpwilmotの回答の後に追加されました。)
詳細については、パフォーマンスモニターの画面キャプチャを以下に示します。
- (1)のガングリアデータノードの概要-ジョブは04:37に開始されました。
- (3)のガングリアデータノードの概要-ジョブは19:47に開始されました。それ以前のグラフは無視してください。
グラフはおおまかに2つのセクションに分かれています。
- 最初:最初からreduceByKeyまで:CPU集中型、ネットワークアクティビティなし
- 2番目:reduceByKeyの後:CPUが低下し、ネットワークI / Oが実行されます。
グラフが示すように、(1)は指定されたCPUパワーを使用できます。したがって、スレッド数の問題ではない可能性があります。
この結果を説明するには?