私はPythonでラップされたC++コード上でsparkクラスターを実行しています。現在、マルチスレッドオプションのさまざまな構成をテストしています(PythonレベルまたはSparkレベル)。
私はsparkスタンドアロンバイナリで、HDFS 2.5.4クラスター上で使用しています。クラスターは現在10個のスレーブで構成されており、それぞれに4つのコアがあります。
私が見ることができるものから、デフォルトでは、Sparkはノードごとに4つのスレーブを起動します(私は一度に4つのpythonがスレーブノードで作業しています)。
この数を制限するにはどうすればよいですか? 「spark-submit」に--total-executor-coresオプションがあることがわかりますが、それがクラスター全体のエグゼキューターの分散にどのように影響するかについてのドキュメントはほとんどありません。
明確なアイデアを得るためにテストを実行しますが、知識のある人がこのオプションの機能についての手がかりを持っている場合は、それが役立つ可能性があります。
更新:
sparkのドキュメントをもう一度読みましたが、これが私が理解していることです:
--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++のレガシーコードマルチスレッドに依存する方がよい理由です。研究が終了したら、この投稿を実験結果で更新します。
ドキュメントが明確ではないようです。
私の経験から、リソースを割り当てる最も一般的な方法は、たとえば、エグゼキュータの数とエグゼキュータごとのコアの数を示すことです( 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(または任意のリソースマネージャー)が、ユーザー設定に応じてリソースの管理方法を管理します。
各スレーブで開始されたワーカーの数を確認するには、Webブラウザーを開き、 http:// master-ip:808 と入力し、開始されたワーカーの数についてworkers
セクションを参照してください。正確に、そしてどのワーカーがどのスレーブにいるのか。 (「ノードごとに4つのスレーブ」とはどういう意味かわからないため、上記で言及します)
デフォルトでは、conf /spark-env.shでSPARK_WORKER_INSTANCES=n
を指定しない限り、sparkは各スレーブで正確に1つのワーカーを開始します。ここでnは、eachスレーブで開始するワーカーインスタンスの数です。
Spark-Submitを介してsparkジョブを送信すると、sparkは、ジョブのアプリケーションドライバーと複数のエグゼキューターを起動します。
--total-executor-cores
は、このアプリケーションで使用できるコアの総数を制限します。