[Spark] Sparkタスク実行の原則

DAGScheduler:広い依存関係操作に従って、ステージを分割し、ステージ内のタスクを1つのtastsetにカプセル化します

TaskScheduler:DAGSchedulerによって送信されたスケジューリングステージを受信し、ノードにタスクを送信して、ノードでタスクを実行します。

1)RDDのさまざまな変換操作を実行します。アクション操作はジョブ生成をトリガーし、RDD血液関係に基づいてDAGグラフを作成します。DAGSchedulerはDAGグラフの分析を担当します。

2)DAGSchedulerは、DAGを幅広い依存関係に応じて相互に依存するステージに分割します。各ステージにはいくつかのタスクが含まれ、各ステージのタスクはタスクセットを形成し、スケジューリングのためにTaskSchedulerに送信されます。

DAGSchedulerは、データローカリゼーション戦略の選択など、最適なスケジューリング戦略を計算します。

DAGSchedulerはスケジューリングプロセスを監視します。ステージが失敗した場合、DAGSchedulerがこのステージを再送信します。

3)各TaskSchedulerは1つのSparkContextのみを処理します。TaskSchedulerは、DAGSchedulerから配布されたタスクセットを受け取り、それを各Executorに配布して実行します。TaskSchedulerは、タスクの実行ステータスとタスクの再試行メカニズムを監視します。

4)エグゼキュータはTaskSchedulerのタスクセットを受け取り、タスクは実行のためにスレッドに渡され、タスクが完了するとタスク情報がTaskSchedulerに返されます。

ShuffleMapTaskは、結果自体ではなくMapStatusオブジェクトを返します。ResultTaskによって返される結果は次のとおりです。

実行結果を取得する

エグゼキューターによって返された計算結果の場合:

1)結果サイズ(∞、1GB)を生成します。結果は直接破棄され、spark.driver.maxResultSizeによって設定されます。

2)生成された結果のサイズ[1GB、128MB-200KB];生成されたサイズは128MB-200KBと等しく、結果はtaskIdを数値としてBlockManagerに格納され、その数値がドライバー端末に送信されます。

3)生成された結果のサイズ(128MB〜200KB、0)は、Nettyを介してドライバー端末に直接送信されます。

 

スケジューリング段階を分割します。

 

 


最初に幅に基づいて各依存RDDをトラバースします

1)SparkContextで実行するために送信されると、DAGSchedulerのhadleJobSubmittedが処理され、最後のRDDがこのメソッドで見つかり、getParentStageメソッドが呼び出されます。

2)getParentStageメソッドは、rddG依存ツリー種にシャッフル操作があるかどうかを決定します。結合操作はシャッフル操作であり、操作を取得するためのRDDはrddBおよびrddFであることがわかります。

3)getAncesterShuffleDependenciesメソッドを使用してrddBから順方向にトラバースし、依存関係ブランチにシャッフル操作がないこと、つまり、広い依存関係がないことを確認します。newOrUsedShuffleStageメソッドを呼び出して、スケジューリングステージShuffleMapStage0を生成します。

4)getAncesterShuffleDependenciesメソッドを使用してrddFから順方向にトラバースし、依存関係ブランチに幅広い依存関係操作groupByがあり、rddDを分割していることを確認します。rddCはShuffleMapStage1、rddE、rddFはShuffleMapStage2です。

5)最後に、rddGのResultStage3が生成されます

コミットスケジュール

この例の最後のスケジューリングステージであるReusltStage3は、handleJobSubmittedメソッドで取得され、スケジューリングステージは、submitStageメソッドを通じて送信されました。
submitStageメソッドでは、最初にジョブインスタンスを作成してから、スケジューリングステージに親スケジューリングステージがあるかどうかを判断します。ReusltStage3には、ShuffleMapStage0とShuffleMapStage2の2つの親スケジューリングステージがあるため、スケジューリングステージをすぐに送信して実行し、ReusltStage3を待機キューに入れて待機することはできません。 waitingStages。
submitStageメソッドを再帰的に呼び出すと、ShuffleMapStage0に親スケジューリングステージがなく、ShuffleMapStage2に親スケジューリングステージShuffleMapStage1があるため、shuffleMapStage2がwaitingStagesリストに追加され、shuffleMapStage0とShuffleMapStage1がsubmitMissingTasksメソッドを使用して初めてスケジュールされることがわかります。 。
エグゼキュータータスクは、タスクの実行が完了するとメッセージを送信し、DAGSchedulerなどのスケジューラーがステータスを更新すると、スケジューリングフェーズの操作をチェックします。実行に失敗したタスクがある場合は、スケジューリングフェーズを再送信します。すべてのタスクが完了している場合は、実行するスケジューリングフェーズを送信し続けます。ReusltStage3の親スケジューリングステージはすべて完了していないため、2番目のスケジューリングステージはShuffleMapStage2を実行依頼するだけです。
ShuffleMapStage2の実行が完了すると、この時点でResultStage3の親スケジューリングステージがすべて完了し、スケジューリング操作が送信されて完了します。
å¨è¿éæå¥å¾çæè¿°

5つの提出タスク

  1. 提出段階では、最初の呼び出しはShuffleMapStage0です[ShuffleMapStage0はShuffleMapStage(0,0)、ShuffleMapStage(0,1)に分割され、ShuffleMapStage1も2つのタスクに分割されます]およびShuffleMapStage1ステージには2つのパーティションしかありません。ShuffleMapStage0はTaskSet0、ShuffleMapStage1はTaskSet1で、各TaskSetには実行する2つのタスクがあります。
  2. TaskSchedulerは送信されたタスクセットTaskSet0とTaskSet1を受け取り、submitTasksメソッドでTaskSetManager0とTaskSetManager1を作成し、両方をシステムのスケジューリングプールに入れ、システム(FIFOまたはFAIR)によって設定されたスケジューリングアルゴリズムに従ってスケジューリングを実行します。
  3. TaskSchedulerImplのResourceOffersメソッドでは、リソースは近接性の原則に従って割り当てられ、各タスクには実行中のコード、データシャーディング、処理リソースが割り当てられます。CoarseGrainedSchedulerBackendのlaunchTasksメソッドを使用して、WorkerノードのCoarseGrainedExecutorBackendにタスクを送信し、Executorを呼び出してタスクを実行します
  4. ShuffleMapStage0、ShuffleMapStage1が完了し、ShuffleMapStage2、ResultStage3は手順1〜3を実行しますが、ReduceStage3はResultTaskを生成します

ここに画像の説明を挿入

6つのタスク

CoarseGrainedExecutorBackendがLaunchTaskメッセージを受信すると、ExecutorのlaunchTaskメソッドを呼び出して処理します。ExecutorのlaunchTaskメソッドで、TaskRunnerを初期化して、タスクランタイムの詳細を管理するために使用されるタスクをカプセル化し、次にTaskRunnerオブジェクトをThreadPoolに入れて実行します。

ShuffleMapTaskの場合、その計算結果はBlockManagerに書き込まれ、最終的にDAGSchedulerに返されるのはMapStatusです。このオブジェクトは、計算結果自体ではなく、BlockManagerに格納されたShuffleMapTask操作結果の関連するストレージ情報を管理します。これらのストレージ情報は、タスクの次のステージに必要な入力データの基礎になります。

 

 

 

公開された61元の記事 ウォンの賞賛2 ビュー7302

おすすめ

転載: blog.csdn.net/hebaojing/article/details/104052360