2 つの EC2 インスタンス (m4.xlarge) を持つ小さな Spark クラスターを実行しています。
これまでのところ、1 つのノードで spark マスターを実行し、もう 1 つのノードで 1 つの spark スレーブ (4 コア、16g メモリ) を実行してから、spark (ストリーミング) アプリをクライアント デプロイ モードでマスターにデプロイしました。設定の概要は次のとおりです。
--executor-memory 16g
--executor-cores 4
-- ドライバメモリ 8g
-- ドライバーコア 2
-- 展開モードのクライアント
これにより、4 つのコアと 16Gb のメモリで実行されている単一のスレーブ上に単一のエグゼキュータが作成されます。ドライバーは、マスターノードのクラスターの「外部」で実行されます (つまり、マスターによってリソースが割り当てられません)。
理想的には、監視オプションを利用できるように、クラスター展開モードを使用したいと考えています。マスター ノードで 2 番目のスレーブを開始し、2 つのコアと 8g のメモリを割り当てました (マスター デーモン用のスペースを確保するために割り当てられたリソースを小さくしました)。
Spark ジョブをクラスター デプロイ モードで実行すると (上記と同じ設定を使用しますが、--deploy-mode クラスターを使用します)。約 50% の時間で、ドライバーがマスター ノード (2 コアと 8Gb の適切なリソースを持つ) で実行されているスレーブを介して実行され、元のスレーブ ノードに 4 のエグゼキューターを割り当てる自由を与えるという目的の展開が得られます。コア & 16Gb。ただし、残りの 50% の時間は、マスターが非マスター スレーブ ノードでドライバーを実行します。つまり、そのノードで 2 コアと 8Gb メモリを備えたドライバーを取得することになり、エグゼキューターを起動するのに十分なリソースを持つノードが残りません (これには 4 コアと 16Gb が必要です)。
Spark マスターがドライバーに特定のワーカー/スレーブを使用するように強制する方法はありますか? Spark が 2 つのスレーブ ノード (1 つは 2 コア、もう 1 つは 4 コア) があり、私のドライバーには 2 つのコアが必要であり、私のエグゼキューターには 4 つのコアが必要であることを知っているとすれば、適切な最適な配置を理想的にはうまくいくでしょうが、これはそうではありません。そのようです。
どんなアイデアや提案もありがたく受け取った!
ありがとう!