私はhadoopに非常に慣れていません。hadoopマップ/リデュースで悪いレコードをスキップする方法について簡単なプログラムを教えてもらえますか?
前もって感謝します
破損したレコードを処理する最善の方法は、マッパーまたはリデューサー コードです。不良レコードを検出して無視するか、例外をスローしてジョブを中止することができます。また、カウンターを使用してジョブ内の不良レコードの総数をカウントし、問題がどの程度広がっているかを確認することもできます。ただし、まれに、マッパーまたはリデューサーで回避できないサードパーティのライブラリにバグがあるため、問題を処理できないことがあります。このような場合、Hadoop のオプションのスキップ モードを使用して、不良レコードを自動的にスキップできます。スキップ モードが有効になっている場合、タスクは処理中のレコードを tasktracker に報告します。タスクが失敗すると、タスクトラッカーはタスクを再試行し、失敗の原因となったレコードをスキップします。失敗したレコードの範囲を維持するための余分なネットワーク トラフィックと簿記のため、
したがって、不良レコードで一貫して失敗するタスクの場合、タスクトラッカーは次のタスクの試行を実行し、これらの結果が得られます。
タスクは失敗します。
タスクは失敗します。
スキップモードが有効です。タスクは失敗しますが、失敗したレコードは tasktracker によって保存されます。
スキップ モードは引き続き有効です。前回の試行で失敗した不良レコードをスキップすることで、タスクは成功します。
スキップ モードはデフォルトでオフになっています。
SkipBadRecords
クラスを使用してマップおよびリデュース タスクに対して個別に有効にします。スキップ モードでは、タスクの試行ごとに 1 つの不良レコードしか検出できないことに注意することが重要です。そのため、このメカニズムは、偶発的な不良レコード (たとえば、タスクごとに少数) を検出する場合にのみ適しています。入力分割内のすべての不良レコードを検出してスキップするのに十分なスキップ モードの試行を行うには、(mapred.map.max.attempts
および を使用して) タスク試行の最大数を増やす必要がある場合があります。mapred.reduce.max.attempts
Hadoop によって検出された不良レコードは、サブディレクトリの下のジョブの出力ディレクトリにシーケンス ファイルとして保存されます_logs/skip
。これらは、ジョブの完了後に診断目的で検査できます (hadoop fs -text
たとえば、 を使用)。
Tom White 著「 Hadoop: The Definitive Guide 」のテキスト