web-dev-qa-db-ja.com

spark-submitを使用すると、-total-executor-coresオプションの動作はどうなりますか?

私はPythonでラップされたC++コード上でsparkクラスターを実行しています。現在、マルチスレッドオプションのさまざまな構成をテストしています(PythonレベルまたはSparkレベル)。

私はsparkスタンドアロンバイナリで、HDFS 2.5.4クラスター上で使用しています。クラスターは現在10個のスレーブで構成されており、それぞれに4つのコアがあります。

私が見ることができるものから、デフォルトでは、Sparkはノードごとに4つのスレーブを起動します(私は一度に4つのpythonがスレーブノードで作業しています)。

この数を制限するにはどうすればよいですか? 「spark-submit」に--total-executor-coresオプションがあることがわかりますが、それがクラスター全体のエグゼキューターの分散にどのように影響するかについてのドキュメントはほとんどありません。

明確なアイデアを得るためにテストを実行しますが、知識のある人がこのオプションの機能についての手がかりを持っている場合は、それが役立つ可能性があります。

更新:

sparkのドキュメントをもう一度読みましたが、これが私が理解していることです:

  • デフォルトでは、ワーカーノードごとに1つのエグゼキューターがあります(ここでは10のワーカーノード、したがって10のエグゼキューター)
  • ただし、各ワーカーは複数のタスクを並行して実行できます。スタンドアロンモードでは、デフォルトの動作は利用可能なすべてのコアを使用することです。これが、4つのPythonを観察できる理由を説明しています。
  • ワーカーごとに使用されるコアの数を制限し、並列タスクの数を制限するために、少なくとも3つのオプションがあります:
    • 使用する --total-executor-cores whith spark-submit(コアのプールがどのように処理されるかについての手がかりがないため、満足度が最も低い)
    • 使用する SPARK_WORKER_CORES構成ファイル内
    • 使用する -c開始スクリプトのオプション

このドキュメントの次の行 http://spark.Apache.org/docs/latest/spark-standalone.html 何が起こっているのかを理解するのに役立ちました:

SPARK_WORKER_INSTANCES
各マシンで実行するワーカーインスタンスの数(デフォルト:1)。非常に大きなマシンがあり、複数のSparkワーカープロセスが必要な場合は、これを1つ以上にすることができます。これを設定する場合は、SPARK_WORKER_CORESも明示的に設定して、ワーカーあたりのコアを制限してください。 、そうでない場合、各ワーカーはすべてのコアを使用しようとします。

私にはまだはっきりしないのは、私の場合、ワーカーノードあたりの並列タスクの数を1に制限し、C++のレガシーコードマルチスレッドに依存する方がよい理由です。研究が終了したら、この投稿を実験結果で更新します。

11
MathiasOrtner

ドキュメントが明確ではないようです。

私の経験から、リソースを割り当てる最も一般的な方法は、たとえば、エグゼキュータの数とエグゼキュータごとのコアの数を示すことです( here から取得)。

$ ./bin/spark-submit --class org.Apache.spark.examples.SparkPi \
--master yarn-cluster \
--num-executors 10 \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 4 \
--queue thequeue \
lib/spark-examples*.jar \
10

ただし、このアプローチは[〜#〜] yarn [〜#〜]に限定されており、 によると、スタンドアロンおよびメソベースのSparkには適用できません。 this

代わりに、パラメータ--total-executor-coresを使用できます。これは、Sparkジョブに割り当てられたコア(すべてのエグゼキュータの)の合計量を表します。あなたの場合、合計40コアで、属性--total-executor-cores 40を設定すると、使用可能なすべてのリソースが使用されます。

残念ながら、利用可能なリソースの合計よりも少ないリソースが提供された場合に、Sparkがワークロードをどのように分散するかはわかりません。ただし、2つ以上の同時ジョブを操作する場合は、ユーザーに対して透過的である必要があります。つまり、Spark(または任意のリソースマネージャー)が、ユーザー設定に応じてリソースの管理方法を管理します。

6
Mikel Urkia

各スレーブで開始されたワーカーの数を確認するには、Webブラウザーを開き、 http:// master-ip:808 と入力し、開始されたワーカーの数についてworkersセクションを参照してください。正確に、そしてどのワーカーがどのスレーブにいるのか。 (「ノードごとに4つのスレーブ」とはどういう意味かわからないため、上記で言及します)

デフォルトでは、conf /spark-env.shでSPARK_WORKER_INSTANCES=nを指定しない限り、sparkは各スレーブで正確に1つのワーカーを開始します。ここでnは、eachスレーブで開始するワーカーインスタンスの数です。

Spark-Submitを介してsparkジョブを送信すると、sparkは、ジョブのアプリケーションドライバーと複数のエグゼキューターを起動します。

  • 明確に指定されていない場合、sparkは、ワーカーごとに1つのエグゼキューターを開始します。つまり、エグゼキューターの合計数はワーカーの合計数と等しくなり、すべてのコアがこのジョブで使用可能になります。
  • 指定した--total-executor-coresは、このアプリケーションで使用できるコアの総数を制限します。
4
yjshen