Vipin、私はあなたがそれを可能にし、エグゼキュータの分を設定見ることができるようにあなたは、スパークでダイナミックアロケーションを設定
。しかし、実行者が200人必要になると、割り当てにはspark.dynamicAllocation.schedulerBacklogTimeout
という1つの設定があります。これはデフォルトで1秒のタイムアウトを持ちます。
これは、1秒後にタスクが完了しなかった場合、より多くのエグゼキュータを割り当てることを意味します。
saprkでdocumentationによると、それは言う:ラウンドで
スパーク要求エグゼキュータを。実際の要求は、spark.dynamicAllocation.schedulerBacklogTimeout秒の保留中のタスクがあるときにトリガされます。その後、保留中のタスクのキューが存続する場合は、spark.dynamicAllocation.sustainedSchedulerBacklogTimeout秒後に再度トリガされます。さらに、各ラウンドで要求されたエグゼキュータの数は前回より指数関数的に増加します。たとえば、アプリケーションでは、第1ラウンドで1人のエグゼキュータを追加し、その後のラウンドでエグゼキュータを2人、4人、8人など追加します。
したがって、すべてのseccond Sparkでは、n秒間の遅延のために2^nを割り当てます。エグゼキュータを200人に達するには、エグゼクティブをヤーンに要求するために少なくとも8秒待つ必要があります。それを解決するには数秒で済む。
多分コアの数を増やすと役立つでしょう。しかし、あなたが各ノードの完全なコアを使用している場合...うーんthreは解決策ではありません。
1 2 4 8のようなオープニングエグゼキュータの実装はプライベートですか? 私のシステムが新しいvmを開くように10 20 30を作ることができれば、私の問題として解決することができます – vipin
まあ、私はコードをチェックしていました。それは私有であるようです。リンク:https://github.com/apache/spark/blob/6ee28423ad1b2e6089b82af64a31d77d3552bb38/core/src/main/scala/org/apache/spark/ExecutorAllocationManager.scala#L309を参照してください。 –