[解決済み] sparkのexecutor数、cores、executor memoryのチューニング方法は?
質問
上記のパラメータをチューニングするには、どこから始めればよいのでしょうか。実行者メモリから始めて実行者数を得るのでしょうか、それともコアから始めて実行者数を得るのでしょうか。私は リンク . しかし、高レベルのアイデアを得たが、まだどのように、またはどこから始め、最終的な結論に到達するかがわからない。
どのように解決するのですか?
以下の回答は、タイトルにある3つの主要な側面、すなわち、エグゼキュータ数、エグゼキュータメモリ、コア数、をカバーしています。ドライバメモリやその他のパラメータについては、この回答では触れていませんが、近い将来に追加したいと思います。
ケース 1 ハードウェア - 6 ノード、および各ノード 16 コア、64 GB RAM
各エクゼキュータは、JVMインスタンスです。そのため、1つのノードで複数のエグゼキュータを持つことができます。
まずOSとHadoopデーモンに1コアと1GBが必要なので、各ノードには15コア、63GBのRAMが利用可能です。
まずコア数の選び方から :
Number of cores = Concurrent tasks as executor can run
So we might think, more concurrent tasks for each executor will give better performance. But research shows that
any application with more than 5 concurrent tasks, would lead to bad show. So stick this to 5.
This number came from the ability of executor and not from how many cores a system has. So the number 5 stays same
even if you have double(32) cores in the CPU.
実行者の数。
Coming back to next step, with 5 as cores per executor, and 15 as total available cores in one Node(CPU) - we come to
3 executors per node.
So with 6 nodes, and 3 executors per node - we get 18 executors. Out of 18 we need 1 executor (java process) for AM in YARN we get 17 executors
This 17 is the number we give to spark using --num-executors while running from spark-submit shell command
各エクゼキュータ用のメモリ。
From above step, we have 3 executors per node. And available RAM is 63 GB
So memory for each executor is 63/3 = 21GB.
However small overhead memory is also needed to determine the full memory request to YARN for each executor.
Formula for that over head is max(384, .07 * spark.executor.memory)
Calculating that overhead - .07 * 21 (Here 21 is calculated as above 63/3)
= 1.47
Since 1.47 GB > 384 MB, the over head is 1.47.
Take the above from each 21 above => 21 - 1.47 ~ 19 GB
So executor memory - 19 GB
最終的な数値 - エグゼキュータ - 17、コア - 5、エグゼキュータメモリ - 19 GB
ケース2 ハードウエア : 同 6ノード、32コア、64GB
5は並行性が良いので同じ
各ノードのエグゼキュータ数 = 32/5 ~ 6
つまり、総実行者数 = 6 * 6ノード = 36。とすると、最終的な数は36 - AMの1 = 35となります。
エクゼキュータのメモリは、各ノードにつき6個です。63/6 ~ 10 . オーバーヘッドは0.07 * 10 = 700 MBです。従って、1GBに丸めると、10-1 = 9 GBとなります。
最終的な数値 - エグゼキュータ - 35、コア - 5、エグゼキュータメモリ - 9 GB
ケース3
上記のシナリオは、コア数を固定とすることから始まり、エグゼキュータ数、メモリ数に移行していきます。
さて、最初のケースですが、19GBも必要ない、10GBで十分だと考えた場合、以下のようになります。
コア数 5 # 各ノードのエグゼキュータ数 = 3
この段階では、最初の計算と同じように21となり、次に19となるはずです。しかし、10 は大丈夫だと思ったので (オーバーヘッドが少ないと仮定して)、ノードあたりの実行者数を 6 に切り替えることはできません。 を6に変更することはできません(63/10のように)。というのも、16コアしかないのに、6コアにすると30コアになってしまうからです。そのため、各エクゼキュータのコア数を変更する必要があります。 コアを変更する必要があります。
というわけで、もう一度計算します。
マジックナンバー 5 は 3 になります (5以下の任意の数)。つまり、3 つのコアと 15 個の利用可能なコアで、1 ノードあたり 5 つのエグゼキュータが得られます。つまり、(5*6 -1) = 29 エグゼキュータとなります。
ということは、メモリは63/5 ~ 12。オーバーヘッドは 12*.07=.84 ということは、エクゼキュータのメモリは12 - 1 GB = 11 GBとなります。
最終的な数値は、29 executor, 3 core, executor memory is 11 GBです。
ダイナミック・アロケーション。
注:動的割り当てが有効な場合の実行者数の上限です。つまり、スパークアプリケーションは必要であればすべてのリソースを食い尽くすことができるということです。つまり 他のアプリケーションが動作しているクラスタでは、タスクを実行するためにコアが必要です。つまり、YARに特定のコア数を割り当てることができます。 ユーザーアクセスに基づいてYARNに特定のコア数を割り当てることができます。つまり、spark_userを作成し、そのユーザーに対してコア数(最小/最大)を割り当てることができます。この制限は、sparkとYARN上で動作する他のアプリケーションの間で共有するためのものです。
spark.dynamicAllocation.enabled - これがtrueに設定されている場合 - エグゼキュータについて言及する必要はありません。理由は以下の通りです。
spark-submitで与える静的なパラメータ数は、ジョブ期間全体に対するものです。しかし、ダイナミックアロケーションが登場した場合、次のような異なるステージが存在することでしょう。
何から始めるか:
最初の実行者数 ( spark.dynamicAllocation.initialExecutors )で開始します。
何個:
次に、負荷(保留中のタスク)に基づき、いくつリクエストするか。これは最終的にspark-submitで静的な方法で与える数字になります。というわけで、最初の実行者数が決まったら、次はmin( spark.dynamicAllocation.minExecutors ) と max ( spark.dynamicAllocation.maxExecutors(スパークダイナミックアロケーションマックスエグゼキュータ ) の数値が必要です。
尋ねるとき、与えるとき。
いつ新しい実行者を依頼するか ( spark.dynamicAllocation.schedulerBacklogTimeout ) - これだけの期間、保留中のタスクがあるので、リクエストします。各ラウンドでリクエストされるエグゼキュータの数は、前のラウンドから指数関数的に増加します。例えば、アプリケーションは最初のラウンドで1つのエグゼキュータを追加し、その後のラウンドで2、4、8...とエグゼキュータを追加していきます。特定の時点で、上記の最大値が表示されます。
いつエクゼキュータを手放すか ( spark.dynamicAllocation.executorIdleTimeout ) -
私が何かを見逃しているならば、私を修正してください。上記は、私が質問で共有したブログといくつかのオンラインリソースに基づいた私の理解です。ありがとうございます。
参考文献。
関連
-
[解決済み】spark.driver.maxResultSizeとは何ですか?
-
[解決済み] Spark が "java.net.URISyntaxException" を報告するのはなぜですか?DataFrameを使用する際に「java.net.URIStyntaxException: Relative path in absolute URI」と表示されるのはなぜですか?
-
[解決済み] format("kafka") で "Failed to find data source: kafka." とエラーになるのはなぜですか?(uber-jarを使用しても)失敗しますか?
-
[解決済み] Sparkクラスタがハートビートのタイムアウトでいっぱいになり、エグゼキュータが勝手に終了してしまう。
-
[解決済み] Apache Spark Executorのメモリを設定する方法
-
[解決済み] spark.yarn.executor.memoryOverhead "の設定値?
-
[解決済み] プロパティspark.yarn.jars - どのようにそれに対処するのですか?
-
[解決済み】Spark StandaloneクラスタのWorker、Executor、Coreとは何ですか?
-
[解決済み] 複数のテキストファイルを1つのRDDに読み込むには?
-
[解決済み] sparkで出力ディレクトリを上書きする方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] spark.sql.autoBroadcastJoinThresholdは、Datasetの結合演算子を使用して結合するために動作しますか?
-
[解決済み] スパーク "プランの文字列表現が大きすぎたため、切り捨てました。" 手動で作成した集計式を使用した場合の警告
-
[解決済み] Spark コンテキスト 'sc' が定義されていない
-
[解決済み] Spark: 2つのDataFrameを減算する
-
[解決済み] sparkでsaveAsTextFileするときのファイル名の付け方は?
-
[解決済み] 実行中のSparkアプリケーションを終了させるには?
-
[解決済み] spark checkpointとpersist to a diskの違いは何ですか?
-
[解決済み] Spark - repartition() vs coalesce()
-
[解決済み】Spark Dataframeで列の内容をすべて表示するにはどうすればよいですか?
-
[解決済み] Apache SparkのWeb UIにおける「Stage Skipped」の意味とは?