、RDDのフォールトトレランス原理をスパーク
別の依存関係スパークにRDDリードは異なる依存関係に異なるアプローチを持っています。
全体依存かなりの幅依存性に起因するが、親パーティションを指すためにサブRDDに対応するパーティションのRDDの複数部分的この場合、そこ失われた結果であろう、単一の欠落データの効果を達成するように計算することができない、それを使用して再計算されますデータの重複をもたらすことができるこの手順のすべてのデータが計算され、狭依存性のために、原因狭い実質的信頼RDD親パーティションにRDDに子を意味使用され、誤差演算部は、算出結果から、この場合に発生します唯一の親RDD-依存に関連するデータを持つデータは、エラーのデータ部分のみを再計算するためにすべてのデータを再計算する必要はありません。
二つ、4つのコア要素のRDDフォールトトレランス
3つのレベルの4つのコア要素におけるスパークRDDフォールトトレランスを含む三つのレベル(レベルのスケジューリング、RDD降下層、チェックポイント層)に分割スパークレベルフォールトトレランスフレームワーク。
(1)ステージ出力が失敗し、DAGScheduler上位スケジューラを再試行してください。
(2)スパーク計算は、タスクの内部タスクが失敗し、最小スケジューリングを再試行します。
(3)RDD系統系統依存狭い、広い依存計算。
(4)チェックポイントキャッシュ。
1。スケジューリング・レベル(DAG生成および2つのコアのタスクの再計算を含みます)
ディスパッチ・レベル・話すから、誤差は、主に二つの側面、段階出力の計算において、すなわちミスやエラーが発生しました。
1)DAG発生層
上側のスケジューラが再試行しますDAGSchedulerステージ出力の故障、DAGScheduler.scalaのresubmitFailedStagesソースは、以下の通りです。
/ ** *通常と呼ばれる小さな時間は量が作動経過した後に再送信は、任意の。ステージに失敗した 最後の障害をFETCH *。 * / プライベート[スケジューラ] DEF resubmitFailedStages(){ //ステージの故障があるか否かを判断する (failedStages.sizeのIF > 0){ //ステージがジョブキャンセルによって除去することができる失敗し、さらに空IF SOかもしれない失敗 //イベントがスケジュールResubmitFailedStagesであった。 //はResubmitFailedStagesイベントがスケジュールされた場合、位相は、ジョブを介して元に戻すことができる失敗し、失敗しヌルさ LOGINFOは(「再サブミットがステージに失敗しました」) clearCacheLocs() //すべてのリストを取得する段階失敗 ヴァルfailedStagesCopy = failedStages.toArrayを //空failedStagesを failedStages.clearを() //すべての取得の段階は、ジョブIDを個別にソートリトライによれば、前に失敗した { - (FailedStagesCopy.sortBy(_ firstJobId)。段階<)ため submitStage(ステージ) } } )submitWaitingStages( }
2)タスク計算層
スパーク算出処理が失敗タスクタスクの内部で発生計算タスク最低のスケジューリングはこの再試行(デフォルト4)のいくつかの数です。TaskSetManager.scalaのhandleFailedTaskソースは、以下の通りです。
/ ** *マークとしてタスクを再-ITは保留中のタスクのリストを追加し、通知に、失敗した * DAGスケジューラを。 * / DEF handleFailedTask(TID:ロング、状態:TaskState、理由:TaskEndReason){ .... ... IF(!州立isZombie &&!= TaskState.KILLED && reason.isInstanceOf [TaskFailedReason] && reason.asInstanceOf [TaskFailedReason] .countTowardsTaskFailures){ アサート(ヌル!= failureReason) //タスクの失敗回数プラス1のnumFailures numFailures(インデックス)+ = 1人の 失敗回数が設定された最大数より大きいかどうか//タスク故障決意、そしてもしそうであれば、出力ログ、および再試行しない IF(numFailures(インデックス)> = maxTaskFailures){ のlogError(「タスクをステージ%s内%dは%の失敗した 「ジョブを中止し、d回。フォーマット( インデックス、タスクセットを。 ID、maxTaskFailures)) ABORT( "タスクステージD %%%でSタイムズD、最新の障害に失敗しました:%S \ nDriverのStackTrace:" .format(インデックス、taskSet.id、maxTaskFailures、failureReason)、たfailureExceptionを) リターンは } } 実行中のタスクが0の場合//、ステップタスク完了 )(maybeFinishTaskSetを }
2。RDDリネージュ系統層のフォールトトレランス
スパークRDD高度に制約分散共有メモリで使用、及び新しいRDDが生成する唯一の他のRDDにバッチ操作によって作成することができ、反復Hadoopのより速い計算RDD系統のコアへのフォールトトレランスに依存20回は、だけでなく、対話的に5〜7秒以内に結核レベルのデータ・セットを照会することができます。
変換RDDに基づいて点火RDDベース系統のフォールトトレランスは、計算チェーン、系統を取り戻すに従って計算することができる失われた時間の計算結果の一部を構成しています。
(1)狭い依存して、サブパーティションは、冗長計算は存在しない、親RDDに対応するデータがすべてのパーティションは、サブデータRDD・パーティションは、親パーティションRDDを再試行する、RDDを失っています。
(2)ワイド依存場合には、各パーティションのRDDは、RDDは、各親が失われていない再計算すべてのデータサブパーティションの損失は、RDDのために使用されるサブパーティションを与え、相当に対応するデータの一部でありますデータが必要なサブRDDのパーティションで失われていない、これは冗長な計算のオーバーヘッドとパフォーマンスの巨大な浪費につながります。
3。フォールトトレランスのチェックポイント層
RDDは系統が長すぎる、スパーク系統は、フォールトトレラントの援助で、ディスクを書くためのチェックポイントにより、スパークチェックポイントから、問題が失われたパーティションノードの後に存在する場合、中段にチェックポイントを行い、その後、耐障害性の高いコストを引き起こすフォールトトレラントますRDDは、リネージュをやり直し、チェックポイントをやって起動オーバーヘッドを削減します。
次の2つの状況のための主なチェックポイント:
(1)系統は、長いDAGに、再計算すると、費用は、ページランク、ALSなどの、高すぎます。
(2)幅のチェックポイントに依存しているために特に適している、系統を再計算する冗長な計算を避けるために、この時間がもたらしました。