2017-03-21 22 views
1

タスクが失敗した場合、永続化されたRDD(StorageLevel.MEMORY_ONLY_SER)をクリアしてから、タスクを最初から開始しようと再計算します。または、キャッシュされたRDDが追加されます。スパークノードに保存されているRDDデータの消去

永続化されたRDDのタスクが失敗した場合、重複したレコードが表示されます。どんな助けもありがとう。

+0

理想的には、タスクの失敗のためにキャッシュされたRDDがメモリに存在しない場合、SparkはRDDを再計算します。これが起こっているかどうかは、DAGをチェックするか、またはアキュムレータを前の段階に置くことで確認できます.RAGがDAGを再処理して計算された場合、カウンタは2xになります。 –

+0

「永続化されたRDDのタスクが失敗した場合に重複レコードが表示されています」という問題を詳しく説明できますか? –

答えて

0

タスクは、RDDパーティションを計算するために起動される最小単位の実行単位です。 タスクが失敗した場合、メソッドはTaskContextImplにタスクが失敗したことを通知します.RunはMemoryStoreに(ON_HEAPおよびOFF_HEAPメモリモードの両方の)このタスクのアンロールメモリを解放するよう要求し、ContextCleanerはアプリケーション全体のクリーンアップ

私たちが知っているように、RDDは弾力性があります。つまり、RDD系列のグラフの助けを借りてフォールトトレラントであり、ノードの障害によって欠落したパーティションや破損したパーティションを再計算することができます。

キャッシングは、その系統(依存関係)を追跡しながら、メモリ内のRDDを計算し、実体化します。キャッシュがRDDの系統を記憶しているため、Sparkはノード障害の場合に損失パーティションを再計算できます。最後に、キャッシュされたRDDは実行中のアプリケーションのコンテキスト内に存在し、アプリケーションが終了するとキャッシュされたRDDも削除されます。 スパークのキャッシュはフォールトトレラントです.RDDのパーティションが失われた場合、それを最初に作成した変換を使用して自動的に再計算されます。

RDDがメモリ内に存続した場合、タスク失敗実行者のJVMプロセスも失敗し、メモリが解放されます。 RDDは、タスク上で、ディスク上の永続 場合は

rdd.unpersist() 

がキャッシュされたRDDをクリアするために呼び出すことができるスパークシャットダウンフックがちょうど一時ファイル

0

を払拭できません。

関連する問題