web-dev-qa-db-ja.com

Apache Spark:エグゼキューターインスタンスを設定してもエグゼキューターは変更されません

クラスターモードで、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です。

15
user4688877

増加する 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を参照してください=

15
banjara

_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スケジューリングには独自のニュアンスがあります- this は、YARN FairSchedulerがどのように機能するかについての優れた入門書です。
  • ノードで_yarn.nodemanager.resource.memory-mb_しきい値を超えていないかどうか:
    • (sparkノードで実行されているコンテナの数*(_spark.executor.memory_ + _spark.yarn.executor.memoryOverhead_)))<=_yarn.nodemanager.resource.memory-mb_ *

要求が許可されない場合、要求はキューに入れられ、上記の条件が満たされたときに許可されます。

10
user3730028

sparkクラスターを最大容量まで利用するには、クラスターごとに--num-executors--executor-cores--executor-memoryの値を設定する必要があります。

  • --num-executorsコマンドラインフラグまたはspark.executor.instances構成プロパティは、要求されたエグゼキューターの数を制御します。
  • --executor-coresコマンドラインフラグまたはspark.executor.cores構成プロパティは、executorが実行できる同時タスクの数を制御します。
  • --executor-memoryコマンドラインフラグまたはspark.executor.memory構成プロパティは、ヒープサイズを制御します。
2
SagarKhandagale

クラスターには3つのノードしかなく、1つはドライバーとして使用され、残りのノードは2つしかありません。どうすれば6つのエグゼキューターを作成できますか?

混乱したと思います--num-executors--executor-cores

同時実行性を高めるには、より多くのコアが必要であり、クラスター内のすべてのCPUを利用する必要があります。

1
David S.