いくつかの用語を説明するために、タスクやリソースのスパークを導入する前に:
Dirverプログラム:アプリケーションの主な機能を実行している(利用者から提出された主な機能のjarパッケージ)と、新しいインスタンスSparkContextプログラムを作成し、(ドライバタスク)ドライバ、通常SparkContext代表ドライバと呼ばれます。
クラスタマネージャ:クラスタマネージャは、外部サービスクラスタリソース管理です。スパークは現在、クラスタ・リソース・マネージャのメインスタンドアローン、YARN、Mesos3種類です。スパークは、スタンドアロンモデルがほとんどを満たすことができています
リソース管理のSparkクラスタコンピューティング環境の需要は、基本的な会計の枠組みはYARNとMesosの使用を検討する前に、クラスタ内で実行設定します。一般的に言えば、YARNまたはスタンドアロンのスパークを指し、
異なるクラスタリソース管理(エクスプローラ)。
ワーカーノード:クラスタ内のノードは、業務アプリケーション・コード(計算資源)を実行することができます。
エグゼキュータ:業務アプリケーションプロセスにワーカーノードが実行しているタスク(タスク)を担当するプロセスで、開始及びマルチスレッド(スレッドプール)を介しExcutor内部に、メモリ内またはディスク上に格納されたデータのために責任があります
アプリケーション(コンピューティングリソース、作業プロセス上で実行されている)の特定のタスクの同時処理。
各アプリケーションは、アプリケーション間の別個のエグゼキュータを有し、したがって分離されています。
タスク:ドライバのタスクは、エグゼキュータの作業の単位を指します。通常のデータ処理タスク各パーティションブロックサイズが通常の作業プロセスで実行HDFS(タスクのブロックのパーティション
スレッド)。
アプリケーション:スパーク執行の複数(火花アプリケーションがクラスタ上で実行されている)と、クラスタ内のドライバプログラムを含む、オブジェクトのユーザプログラムSparkContextインスタンスを作成することです。
ジョブ:スパークおよび対応するアクションは、各アクションは、例えば、特定のによって設定されたタスクにおける各タスク用に、各ステージジョブ、ステージ(タスクセット)を含むタスク集合の複数に分割なるであろうジョブに対応します
パラレル実行は、(粒子サイズアプリケーションタスク分割)ユニット(執行)を動作するスケジューリング機構に伝達されます。
スタンドアロン対0のスケジューリング経営資源糸:
スタンドアロン:このモードでは、マスターノードの責任、労働者のノードがマスターノードキュータに開始する予定です。このとき、典型的なマスター/スレーブアーキテクチャのクラスタの展開。
YARNのスパーク:糸クラスタモードが提出され、それが最初のResourceManager通信意志と、このResourceManagerに要求を受信した後ApplicationMaster、このResourceManagerを開始する要求を要求を送信し、
次に、それをノードマネージャにApplicationMaster開始、コンテナに割り当てられています。ApplicationMasterが開始され、後のResourceManager通信、ApplicationMaster(AM)
等価ドライバー。AMは、それがExectutorを開始するために使用される数のコンテナを、割り当てられているRM、執行を、RM、要求されたコンテナを探し始めます。このとき、エグゼキュータ、NMを開始するために、他のNMに接続しようとしています
同等の労働者。スタート執行後、AM逆に登録することができます。スタンドアロンと比較すると、AMはドライバー、NM同等の労働者、マスターへのRM相当に相当します。エグゼキュータまたはNMを開始した後
AM、プロセスの背後にある構造が逆になります登録は糸クラスタモードに提出され、前と同じです。
参考:https://zhuanlan.zhihu.com/p/61902619
関係1.スタンドアロンモードのタスクとリソース
主に低い労働者に対応する対応するコンテナ糸モード、スタンドアロンモードでコンピューティングリソースクラスタスパーク上記、リソースから、アプリケーションに提出され、ユーザが開発したアプリケーションスパークあります
アプリケーションの複数の同じクラスタ上で同時に実行、の間のアプリケーション分離、各SparkContextアプリケーションに対応し、クラスタ上で実行されている、クラスタは起動アプリケーション、資源の回復後に実行するクラスタ(アプリケーションリリースリソース)を実行するためのリソースを割り当てますクラスタオブジェクトによって維持SparkContext関係。
タスク登録アプリケーションは、マスターワーカークラスターによって現在の運転条件に基づいて、リソースの割り当てをマスターした後、労働者のリソースは、マスターによって管理されます。SparkContext、TaskScheduler、SchedulerBackendによって作成された3つのコアオブジェクトDAGSchedulerリソースの割り当ては、アプリケーションに基づいてタスクとスケジュールの適切な部門を作ります。以下に示すように、コアオブジェクトとアクセスコンピューティング・リソース・フローを作成SparkContext
2. DAGScheduler
DAGScheduleはミッションプランの適用のためです。
DAGSchedulerステージ高レベルのスケジューラのためのものである、DAGScheduler DAGは、多くのタスクに分割し、それぞれのタスクステージ、解析ステージ境界逆解像度を構築するためにシャッフル(ブロード依存データが同期シャッフルを生成)。新しいを生成する各出会いのステージをシャッフルし、1つのタスクセット(ステージごとにタスクセットタスクにカプセル化された)基本的なタスクスケジューラTaskSchedulerに送信されたフォーム。これらのRDDを記録するDAGScheduler必要性が再提出ステージに失敗、シャッフルはクロスノードデータの状態を監視し、(このような内部データの局所ステージなど)スケジューリングタスクを最適化しようと、ディスクに保存されます。
親RDDサブRDD複数の依存分配と呼ばれながらDAGSchedulerコア作業がステージ分割による段に分割されてはRDD、パーティションの幅に依存して広い依存性、唯一のサブパーティションは以下のように狭い依存と呼ばれる親パーティションRDD RDD依存性。
後者は前段ステージに応じて、1つのまたは複数のジョブステージ組成物のそれぞれ、異なる開始ジョブ複数ため、アプリケーションのアクションをスパーク。タスクの最適な位置は、ローカル・データを用いて算出ローカルデータは、現在のメモリ内のデータである。スパークはステージジョブ投入工程に分割してタスク、ステージ分割の最適位置を決定した後に計算しました。getPreferedLocations、各パーティションの見かけの入札データの局所性を独自のRDD getPreferedLocations計算データのローカルデータを使用してDAGScheduler。
3.TaskScheduler
TaskScheduler具体的な実施プロセス、タスク、だけでなく、関係するタスクのために。
TaskSchedulerの中核的使命は、タスクセットクラスタ操作を提出し、その結果を報告することです。
。タスクセットを作成し、維持TaskSetManagerをし、地元だけでなく、エラーメッセージのタスクを追跡
B。遭遇散在タスクが再試行する他のノードを配置します
C。シャッフルが失敗し、エラーレポートやその他の情報を取得し、出力の損失を含め、DAGSchedulerに報告を受け。
TaskSchdulerは、地域の原則に従って計算ExecutorBackendている特定のタスクを決定するために実行する必要があり、コンピューティングリソースのタスクのタスクの使用を決定する必要があります。
考えDAGSchedulerのローカルレベルとは異なるデータから、特定の地域の計算を考慮の観点からTaskScheduler。
TaskSchedulerImpl TaskSchedulerサブクラスは、タスクのタスクの特定の動作方法resourceOffers ExecutorBackendによって決定され、以下のように、具体的なプロセスです。
1.再シャッフルすべてのコンピューティングリソースの負荷分散の計算を求めるRandom.shuffle方法。
2.宣言型TaskDescription ArrayBufferアレイのコアの数をExecutorBackend。
3.私たちの仕事に割り当てられた新しいExecutorBackendがある場合は、この時間は、利用可能な新しい完全なコンピューティングリソースを取得するためにexecutorAddedを呼び出します。
4.ローカル優先順位最高レベルを求めます。
/ ** *スレーブ上のリソースを提供するために、クラスタマネージャによって呼び出されます。私たちは、アクティブなタスクを尋ねることによって応答し 、優先度の順にタスクのための*セットを。私たちは、ラウンドロビン方式でタスクを各ノードを埋めるので、 タスクは、クラスタ全体でバランスしていること*。 * / DEF resourceOffers(申し出:IndexedSeq [WorkerOffer]):配列が[配列[TaskDescription]] = {同期 ... //ランダム常に労働者の同じセット上のタスクを配置しないようにするオファーをシャッフルします。 ヴァルshuffledOffers = Random.shuffle(申し出) //各ワーカーに割り当てるタスクのリストを作成します。 ヴァルタスク= shuffledOffers.map(O =>新しいArrayBuffer [TaskDescription(o.cores)) ヴァルavailableCpus = shuffledOffers.map(O => o.cores).toArray ヴァルsortedTaskSets = rootPool.getSortedTaskSetQueue (タスクセット< - sortedTaskSets)用{ logDebug( "parentName:%sは、名前:%sは、runningTasks:%S" .format( taskSet.parent.name、taskSet.name、taskSet.runningTasks)) もし(newExecAvail){ taskSet.executorAdded() } } //以下代码计算最高级别的优先级本地性 //私たちのスケジューリング順に各タスクセットを取り、その後、各ノードの順序増加にそれを提供 するように地域レベルのを//それはそれらのすべてのローカルタスクを起動する機会を得ます。 //注:preferredLocality順:PROCESS_LOCAL、NODE_LOCAL、NO_PREF、RACK_LOCAL、ANY (タスクセット< - sortedTaskSets)のための{ VARのlaunchedAnyTask =偽
偽のvar launchedTaskAtCurrentMaxLocality = { - (taskSet.myLocalityLevels currentMaxLocality <)について ん{ launchedTaskAtCurrentMaxLocality = resourceOfferSingleTaskSet( タスクセット、currentMaxLocality、shuffledOffers、availableCpus、タスク) | = launchedTaskAtCurrentMaxLocality launchedAnyTask }(launchedTaskAtCurrentMaxLocality)しばらく } (launchedAnyTask!){もし taskSet.abortIfCompletelyBlacklisted( hostToExecutors) } } (tasks.size> 0){もし hasLaunchedTask = TRUE } 戻りタスク }
resourceOfferのTaskSetManager地域レベルを呼び出すことによってExecutorBackendタスク特定の操作のそれぞれの最終的な決意。
6. ExecutorBackend実行するタスクのlaunchTasksを送ります。launchTasksは、最初のシリアル化されたサイズは128M、それ以外の場合はエラーデフォルト設定を超えることはできません、シリアライズされます。パラメータで
spark.rpc.message.maxSize设置。
4. SchedulerBackend
そのような管理対象StandaloneSchedulerBackendとしてリソースのSchedulerBackend、インターフェイスは管理資源に異なる配置モードの異なるサブクラスオブジェクト(YarnSchedulerBackend)の下に作成されるように、タスク使用するリソースの集合と割当ての役目を担う、スタンドアロンモードです。
StandaloneSchedulerBackend submitTasksのTaskSchedulerImplを受けた後、reviveOffersは、親クラスがタスクを実行するためにリソースを割り当てるために、最終的なコールmakOffersメソッドを呼び出しますCoarseGrainedSchedulerBackend。
実行のMakOffers方法:
1.最初のアクティブ状態キュータを濾別し、代表執行WorkerOfferを構築するために利用可能なリソースは、(利用可能なリソースとしてここに構築されました)。
タスクID、執行ID、タスクインデックスと他のタスクの実行情報を含む必要resourceOffers二次元アレイTaskDescrition 2.コールTaskSchedulerImpl、。
3. DriverEndPoint launchTaskは、各タスクの実行LaunchTaskキュータに対応するコールバック情報タスクを送ります。
//作る偽のリソースは、すべての執行に提供しています プライベートデフmakeOffers(){ //殺すの下で執行をフィルタリング ヴァルactiveExecutors = executorDataMap.filterKeys(executorIsAlive) ヴァルworkOffers = activeExecutors.map {場合(ID、executorData)=> 新しいWorkerOffer(ID 、executorData.executorHost、executorData.freeCores) } .toIndexedSeq launchTasks(scheduler.resourceOffers(workOffers)) }