6

多数の小さなファイル (それぞれ平均 30 ~ 40 MB) で形成されたデータセットがあります。MapReduce で分析を実行したかったのですが、ジョブごとにマッパーがファイルを再度読み取るため、I/O パフォーマンス (オーバーヘッドなど) に大きな負荷がかかります。

マッパーを一度使用して、さまざまなレデューサーに対してさまざまな異なる出力を発行できるかどうかを知りたいですか? 調べてみると、複数のレデューサーは使用できないことがわかりましたが、可能なのはジョブチェーンだけです。ただし、これらのジョブはすべて同じデータセットを入力として使用し、異なる分析を実行するため、これらのジョブは順次ではなく並行して実行したいと考えています。要約すると、私が欲しいのは以下のようなものです:

        Reducer = Analytics1
      /

Mapper - Reducer = Analytics2

      \
        Reducer = Analytics3 
               ...

これは可能ですか?または、回避策の提案はありますか? アイデアを教えてください。これらの小さなファイルを何度も読み取ると、分析のオーバーヘッドとパフォーマンスが大幅に低下します。

前もって感謝します!

編集: YARN で Hadoop v2.1.0-beta を使用していることを忘れていました。

4

2 に答える 2

3

あなたはできる:

  1. レデューサーにすべての分析 (1 ~ 3) を同じパス/ジョブで実行させます。編集:あなたのコメントから、この代替手段は役に立たないことがわかりますが、場合によってはこれを行うことができるため、将来の参考のためにここに残します。
  2. MapReduce よりも一般化されたモデルを使用します。たとえば、Apache Tez (まだインキュベーター プロジェクト) をユース ケースに使用できます。

Apache Tez に関する参考資料:

編集: 代替案 1 に関して以下を追加しました。

出力先の分析プロセスを示すキーをマッパーに生成させることもできます。Hadoop は、このキーによってレコードを自動的にグループ化し、それらすべてを同じレデューサーに送信します。マッパーによって生成される値は、形式のタプルになります<k,v>。ここで、キー ( k) は、生成する予定の元のキーです。したがって、マッパーは<k_analytics, <k,v>>レコードを生成します。レデューサーには、キーを読み取るレデューサー メソッドがあり、キーに応じて (レデューサー クラス内で) 適切な分析メソッドを呼び出します。このアプローチは機能しますが、レデューサーが大量のデータを処理する必要がない場合に限ります。これは、分析プロセスを実行している間 (リストまたはハッシュテーブルで) データをメモリに保持する必要がある可能性が高いためです (<k,v>タプルはキーでソートされません)。これがレデューサーで処理できない場合は、@praveen-sripati によって提案されたカスタム パーティショナーを検討するオプションになる可能性があります。

編集: @judge-mental で提案されているように、代替案 1 は、マッパーに issue を発行させることでさらに改善できます<<k_analytics, k>, value>。つまり、分析タイプ内のキーを値ではなくキーの一部にすることで、リデューサーがグループ化された 1 つの分析ジョブのすべてのキーを受け取り、値を保持することなく値に対してストリーミング操作を実行できるようにします。羊。

于 2013-10-10T15:38:58.403 に答える