クラスターモードで、Apache SparkアプリケーションがYARNクラスターで実行されています(sparkにはこのクラスター上に3つのノードがあります)。
アプリケーションが実行されているとき、Spark-UIは2つのエグゼキューター(それぞれが異なるノードで実行されている)とドライバーが3番目のノードで実行されていることを示しています。アプリケーションでより多くのエグゼキューターを使用したいので、引数--num-executorsをSpark-submitに追加して6に設定してみました。
spark-submit --driver-memory 3G --num-executors 6 --class main.Application --executor-memory 11G --master yarn-cluster myJar.jar <arg1> <arg2> <arg3> ...
ただし、執行者の数は2名のままです。
spark UIでは、パラメーターspark.executor.instancesが意図したとおりに6であり、どういうわけか2つのエグゼキューターしか残っていないことがわかります。
コードからこのパラメーターを設定してみました
sparkConf.set("spark.executor.instances", "6")
ここでも、パラメーターが6に設定されていることがわかりますが、エグゼキューターは2つしかありません。
エグゼキューターの人数を増やすことができなかった理由を誰かが知っていますか?
yarn.nodemanager.resource.memory-mbは、yarn-site.xmlで12gです。
増加する yarn.nodemanager.resource.memory-mb
in yarn-site.xml
ノードごとに12gを使用すると、ドライバー(3g)と2つのエグゼキューター(11g)のみを起動できます。
Node1-ドライバー3g(+ 7%オーバーヘッド)
Node2-executor1 11g(+ 7%オーバーヘッド)
Node3-executor2 11g(+ 7%オーバーヘッド)
ここで、11gのexecutor3を要求しており、11gのメモリを利用できるノードはありません。
7%のオーバーヘッドについては https://spark.Apache.org/docs/1.2.0/running-on-yarn.html のspark.yarn.executor.memoryOverheadおよびspark.yarn.driver.memoryOverheadを参照してください=
_yarn.nodemanager.resource.memory-mb
_は total であることに注意してください single NodeManagerは、1つのノードの all コンテナ全体に割り当てることができます。
あなたの場合、_yarn.nodemanager.resource.memory-mb = 12G
_なので、任意の単一ノード上のすべてのYARNコンテナに割り当てられたメモリを合計すると、12Gを超えることはできません。
each Spark Executorコンテナーに対して11G(_-executor-memory 11G
_)をリクエストしました。11Gは12Gよりも小さいですが、これはまだ機能しません。
spark.yarn.executor.memoryOverhead
_はmin(executorMemory * 0.10, 384)
( default でオーバーライドしない限り)であるため、これを考慮する必要があるためです。したがって、以下の数学は成り立つ必要があります:
_spark.executor.memory
_ + _spark.yarn.executor.memoryOverhead
_<=_yarn.nodemanager.resource.memory-mb
_
_spark.yarn.executor.memoryOverhead
_の最新のドキュメントについては、 https://spark.Apache.org/docs/latest/running-on-yarn.html を参照してください
さらに、_spark.executor.instances
_は単なるリクエストです。 SparkアプリケーションのApplicationMasterは、コンテナ数のYARN ResourceManagerにリクエストを作成します= _spark.executor.instances
_。リクエストは、以下に基づいてNodeManagerノードのResourceManagerによって付与されます。
yarn.nodemanager.resource.memory-mb
_しきい値を超えていないかどうか:spark.executor.memory
_ + _spark.yarn.executor.memoryOverhead
_)))<=_yarn.nodemanager.resource.memory-mb
_ *要求が許可されない場合、要求はキューに入れられ、上記の条件が満たされたときに許可されます。
sparkクラスターを最大容量まで利用するには、クラスターごとに--num-executors
、--executor-cores
、--executor-memory
の値を設定する必要があります。
--num-executors
コマンドラインフラグまたはspark.executor.instances
構成プロパティは、要求されたエグゼキューターの数を制御します。--executor-cores
コマンドラインフラグまたはspark.executor.cores
構成プロパティは、executorが実行できる同時タスクの数を制御します。--executor-memory
コマンドラインフラグまたはspark.executor.memory
構成プロパティは、ヒープサイズを制御します。クラスターには3つのノードしかなく、1つはドライバーとして使用され、残りのノードは2つしかありません。どうすれば6つのエグゼキューターを作成できますか?
混乱したと思います--num-executors
と--executor-cores
。
同時実行性を高めるには、より多くのコアが必要であり、クラスター内のすべてのCPUを利用する必要があります。