2016-10-19 19 views
3

たとえば、エグゼキュータの数が40であるにもかかわらず、タスクの数が80であれば、各エグゼキュータは2つのタスクを並行して実行することになります。また、私の関数(タスクが実行する)は通常の関数ではありませんが、私はその中のプログラムを呼び出します。したがって、各タスクは実際に完了するまでに数分かかります。だから、私の質問は、スパークはそれをどのように管理しているのだろうか?これらのタスクはエグゼキュータのJVMを共有しますか?コアの数はどうでしょうか、それは2つのタスクに分けられますか?これらの2つのタスクを同時に実行するのではなく、ラウンドロビン方式で実行する、つまりすべてのエグゼキュータのコアで最初のタスクを実行し、終了したときに2番目のタスクを実行する場合はどうすればよいでしょうか?Spark Executorは複数のタスクをどのように実行しますか?

答えて

2

これは、リソースをどのように割り当てるか、エグゼキュータにコア数、エグゼキュータごとのコア数、および割り当てられたメモリに依存します。最大の並列性を達成するためのプログラム方法にも依存します。

最大並列性を達成するためにどのようにコードするかによって異なります。 2つのタスクがあり、互いに独立している場合、それらは並行して実行されます。あるタスクが前のタスクの結果に依存する場合、それらは連続して実行されます。

コアの数は、2つのエグゼキュータを作成し、使用可能なコアを割り当てることで2つのタスクに分割できます。

ラウンドロビン方式でタスクを実行するには、パーティション方式を定義し、それに応じてリソースを割り当てる必要があります。これは、各タスクが他のタスクの後に実行されることを保証する。

+0

ラウンドロビン方式でタスクを実行するパーティション分割スキームについて少し詳しく説明できますか? – pythonic

+0

私は、私が出会ったユースケースについて知ることができます。私はデータフレームを使ってデータを保存していました。最初は私は単一のパーティションを持っていたので、完全なパーティションは1つのエグゼキュータで実行され、他のエグゼキュータは使用されませんでした。私は再パーティション機能()を使用してデータフレームを分割しようとしましたが、これらのパーティションはエグゼキュータ間で並行して実行されていました。だから私は2つのエグゼキュータを持っていたときに、それぞれのエグゼキュータは100個のパーティションの周りを処理し、時間を半減させました。実行時に各パーティションは単一のタスクとみなされます。 i executorのために、すべてのタスクが連続して実行されます。 –

+0

実際には、指定するエクステンダコアの数によって異なります。 Sparkは、指定したコアの数と並行して多くのタスクを実行します。したがって、4つのエグゼキュータと4つのエグゼキュータコアがある場合、合計4 x 4 = 16のタスクが並行して実行されます。私が問題を解決するために見つけた1つの方法は、エグゼキュータコアの数を制限することです。その場合、物事はよりラウンドロビン方式で行われます。 – pythonic

関連する問題