2017-02-13 1 views
0

私は仕事を開始する方法を十分に理解していないと思います。並列スパークジョブを起動するには?

私は1つのジョブが完了するのに60秒かかる。私は、次のコマンドでそれを実行します。

spark-submit --executor-cores 1 \ 
      --executor-memory 1g \ 
      --driver-memory 1g \ 
      --master yarn \ 
      --deploy-mode cluster \ 
      --conf spark.dynamicAllocation.enabled=true \ 
      --conf spark.shuffle.service.enabled=true \ 
      --conf spark.dynamicAllocation.minExecutors=1 \ 
      --conf spark.dynamicAllocation.maxExecutors=4 \ 
      --conf spark.dynamicAllocation.initialExecutors=4 \ 
      --conf spark.executor.instances=4 \ 

私はエグゼキュータのコードと番号からパーティションの数を増やす場合はアプリが、それは大丈夫だた、より速く終了します。しかし、私がexecutor-coreだけを増やしても、終了時間は同じです。なぜか分かりません。私は時間が最初の時間よりも短くなると期待しています。

私の2番目の問題は、上記のコードを2回実行すると、両方のジョブが60秒で終了すると予想されますが、これは起こりません。両方の仕事は120秒後に終了し、なぜ私は理解していません。

このコードはAWS EMR上で2回実行されます(それぞれ4 cpu、各cpuには2つのスレッドがあります)。デフォルトのEMR設定で見たものから、糸はCapacitySchedulerでFIFO(デフォルト)モードに設定されています。

この問題についてどう思いますか?

答えて

1

Sparkは、データソース内のロジックに基づいてパーティションを作成します。あなたのケースでは、エグゼキュータのエグゼキュータコアの数よりも少ないパーティション数が作成されるため、コアを増やすだけでアイドル状態になるほど速く実行されることはありません。また、パーティションの数を増やすと、より高速に動作することができます。

spark-submitを2回実行すると、動的割り当てが2番目の起動前にエグゼキュータの最大割り当てに達する可能性があります(デフォルトでは4秒かかります)。糸が定義された方法によっては、利用可能なエグゼキュータのすべてがいっぱいになることがあります(定義されたスレッドの数が少なすぎるか、またはメモリがいっぱいになっているためです)。いずれにしても、実際にこのようなことが起こった場合、2回目のスパーク送信は、エグゼキュータが解放されてから合計時間がかかるまで処理を開始しません。

ところで、クラスタモードでは、ドライバはエグゼキュータを占有することに注意してください。

関連する問題