2016-06-27 10 views
0

私は、1つの要件が -MapReduceで失敗した実行を再開するには?

と言っています。 100GBのファイル/データを持っているとします。

b。私はこのデータを特定のロジックで処理するためにMap Reduceジョブを作成しました。

c。私は地図が仕事を減らして解雇、それは私の質問がある50ギガバイト

を読んだ後に失敗しました -

私は地図が第51 GBから仕事を減らして再開することはできますか?

どうすればいいのか分かっていれば教えてください。私は失敗の前に処理したデータを再処理したくありません。事前

答えて

1

短答:いいえ。

そのため、HadoopやMPIなどの大規模なバッチ処理システムでの作業は難しいです。大規模なジョブの再開だけでなく、資源消費の点では効率的ではありませんが、非常に心理的にもうつ病です。だからあなたの主な目標は、単一の仕事の実行時間を数時間以内に減らすことです。多分、ジョブの「一時停止」と「ホット修正」のコードを実装することは可能かもしれませんが、現在私の知る限りサポートされていません。

ソリューション#1。エラーの起こりやすい並列化可能なジョブとエラーのない最終的な並列化不可能なジョブにジョブを分割します。次の例を考えてみましょう。ウェブサーバーから数百ギガバイトのテキストアクセスログがあり、さまざまなブラウザの人気度を印刷するジョブを作成したいとします。単一の巨大なジョブに対して解析と集約(集計)を組み合わせると、実行時間は数日程度になります。また、失敗する可能性は非常に高いです。なぜなら、テキストログは、曖昧性のために解析するのが通常難しいからです。はるかに良いアイデアは、2つの別々のジョブにこの仕事を分割することです:

  1. 最初の仕事は、ログファイルを解析するための責任を負うものとします。ブラウザの文字列だけを出力として出力し、さらに減速機を必要としません。このジョブは、ここでは「ワイルド」データの解析が行われる場所なので、すべてのエラーの99%の場所です。このジョブは、入力をチャンクに分割して各チャンクを別々に処理し、各チャンクを10〜30分で処理できるという意味では並列化が可能です。チャンクでジョブが失敗した場合は、修正して再起動します。 30分は大きな損失ではありません。

  2. 第2ジョブは、最初のジョブのインスタンスからの出力を集約して実行する大規模なジョブです。集約コードは非常に簡単なので、このジョブは失敗する可能性は低いです。


  chunk(20G)->parse-job(20G)->browsers(0.5G) 
      chunk(20G)->parse-job(20G)->browsers(0.5G) 
input(1T)->chunk(20G)->parse-job(20G)->browsers(0.5G)->aggregate-job->output 
       ...   ....    ... 
      chunk(20G)->parse-job(20G)->browsers(0.5G) 

溶液#2。入力データの一部が欠落しても結果に満足することがあります。この場合、オプションmapred.max.map.failures.percentおよび/またはmapred.max.reduce.failures.percentを0以外の値に設定することができます。

0

おかげであなたの全体のジョブが失敗した場合は、あなたが処理されたものは何でも失うので、出力は、クリアされます。ただし、Hadoopはジョブの失敗したタスクを再試行します。したがって、事前構成された試行回数で障害が回復する限り、ジョブは失敗せず、すでに完了したタスクからの出力が失われることはありません。あなたの障害が復旧できない場合は

は、その後、ほとんどの場合、それはあなたのせいで、次の一つ以上必要になることがあります。でも、単純なバグが発生することがあり、あなたのコードを修正し

  • をすべてタスクは、一貫し
  • 使用少ないリソース(使用可能なメモリの例ケア)
  • ベター・パーティションの問題(いくつかのタスクが他よりも多くのデータを供給しているかどうか確認してくださいタスクの入力が小さなチャンクに分割取得されていることを確認)
  • に失敗しますより大きなクラスター容量を持つ。
関連する問題