1. ホーム
  2. hadoop

[解決済み] Hadoopで複数のMapReduceジョブを連鎖させる

2022-07-31 23:43:44

質問

MapReduceを適用する多くの現実の場面で、最終的なアルゴリズムはいくつかのMapReduceのステップで終わっています。

すなわち、Map1 , Reduce1 , Map2 , Reduce2 ,...といった具合です。

つまり、次のMapの入力として必要な最後のReduceからの出力があるわけです。

中間データは、パイプラインが正常に終了した後は、(一般的には)保持したくないものです。また、この中間データは一般的に何らかのデータ構造(「マップ」や「セット」など)であるため、これらのキーと値のペアを書いたり読んだりすることにあまり労力を費やしたくありません。

Hadoopでそれを行うには、どのような方法が推奨されますか?

この中間データを、その後のクリーンアップも含めて正しい方法で処理する方法を示す(簡単な)例はありますか?

どのように解決するのですか?

Yahoo's developer networkにあるこのチュートリアルが役に立つと思います。 ジョブの連鎖

ジョブチェーンには JobClient.runJob() . 最初のジョブからのデータの出力パスは、2番目のジョブの入力パスになります。これらを解析し、ジョブのパラメータを設定するための適切なコードで、ジョブの引数として渡す必要があります。

上記の方法は、現在では古いmapred APIが行っていた方法かもしれませんが、それでも動作するはずです。新しいmapreduce APIにも似たような方法があるでしょうが、それが何であるかはわかりません。

ジョブが終了した後に中間データを削除することに関しては、あなたのコードでこれを行うことができます。私が以前それをした方法は、次のようなものを使用しています。

FileSystem.delete(Path f, boolean recursive);

ここで、pathはデータのHDFS上の場所です。他のジョブがこのデータを必要としなくなったら、このデータのみを削除することを確認する必要があります。