糸エグゼキューター、コア、ドライバーの機能と構成でのスパーク

パラメータの意味

糸のスパークの一般的な送信コマンドは次のとおりです。

${SPARK_HOME}/bin/spark-submit --class org.apache.spark.examples.SparkPi \
    --master yarn \
    --deploy-mode cluster \
    --driver-memory 2g \
    --executor-memory 1g \
    --executor-cores 4 \
    --num-executors 3 \
    --queue default \
    ${SPARK_HOME}/examples/jars/spark-examples*.jar \
    10
  • num-executors は、使用されるエグゼキュータの数を指します。
  • executor-memory は、各 executor によって割り当てられるメモリ サイズを指します。
  • executor-cores は、各 executor に割り当てられた CPU コアの数を指します。
  • driver-memory は、ドライバーによって割り当てられたメモリ サイズを指します。

送信されたアプリケーションは AM でドライバーとして実行され、sparkContext オブジェクト、DAGScheduler オブジェクト、TaskScheduler オブジェクトを構築し、RDD 操作を有向非巡回グラフに解析し、幅広い依存関係と狭い依存関係に従ってステージを分割し、タスクを構築し、taskSet をカプセル化します。操作にはメモリ領域が必要であり、driver-memory がメモリ領域を割り当てます。

RDD は最終的にタスクに解析されてエグゼキュータで実行され、各 CPU コアが 1 つのタスクを実行します。クラスター上にはエグゼキュータがありnum-executors、各エグゼキュータにはexecutor-coresCPU コアがあるため、同時にnum-executors * executor-cores最大数のタスクを並列処理できます。つまり、これら 2 つのパラメータはタスクの最大並列処理能力を調整します。並列処理はデータ パーティションの数にも関係します。

Executor のメモリ構造は下図のように、ヤーン オーバーヘッド メモリと JVM ヒープ メモリの 2 つの部分で構成されます。JVM ヒープ メモリは、RDD キャッシュ メモリ、シャッフル メモリ、ワーク ヒープの 3 つの部分に分けることができます。 JVM ヒープのサイズexecutor-memorySpark が MapReduce よりも高速である理由の 1 つは、計算の中間結果をディスクに書き戻すのではなくメモリに保持するためです。したがって、メモリが大きいほど、RDD はより多くのデータをキャッシュでき、シャッフル操作ではより多くのメモリを使用し、ディスクに書き込むデータをできるだけ少なくすることができるため、ディスク IO が削減されます。タスクの実行時にメモリ空間が大きくなるということは、ガベージ コレクションの実行頻度が減れば、この時点からパフォーマンスを向上させることができます。もちろんメモリ空間は大きければ大きいほど良いのですが、メモリ空間が大きすぎるとクラスタがメモリ空間を割り当てることができず、yarnが直接タスクを強制終了してしまいますが、リソースの適用量をある程度増やすことで確かに効率は向上します。タスクの実行。


適用されたリソースを最大限に活用する方法

リソースを最大限に活用することによってのみ、タスクをより効率的に実行できます。これは実際には簡単で、一言で言えば、「タスク task の数は executor core の数と一致します」です。executor-cores=4 および num-executors=3 とすると、12 個のタスクを並列実行できます。ただし、特定のステージを実行するときにタスクの数が 12 未満である場合、適用されるリソースが無駄になり、実行効率が比較的低くなります。

# 总数据量 12G 时:
分区		每个分区数据量    使用的 cores   效率
10 			1.2G		    1012 			10G			    12

公式ドキュメントにはこのような記述があります

Clusters will not be fully utilized unless you set the level of parallelism for each operation high enough.
Spark automatically sets the number of “map” tasks to run on each file according to its size (though you can 
control it through optional parameters to SparkContext.textFile, etc), and for distributed “reduce” operations, 
such as groupByKey and reduceByKey, it uses the largest parent RDD’s number of partitions. You can pass the 
level of parallelism as a second argument (see the spark.PairRDDFunctions documentation), or set the config 
property spark.default.parallelism to change the default. In general, we recommend 2-3 tasks per CPU core in 
your cluster.

ReduceByKey や groupByKey などの Reduce 操作中に、パラメーターを使用してパーティションの数を変更することも、構成ファイルでspark.default.Parallelism を使用してパーティションの数を変更することもできます。一般に、各 CPU コアに 2 ~ 3 個のタスクを割り当てることをお勧めします。つまり、タスクの数は全コアの 2 ~ 3 倍です。

おすすめ

転載: blog.csdn.net/yy_diego/article/details/128023875