3

連続するレデューサーとマッパーの間で値を共有することは可能ですか?

または、最初のリデューサーの出力をメモリに格納し、2 番目のマッパーがメモリからアクセスできるようにすることは可能ですか?

問題は、Map1 -> Reducer1 --> Map2 --> Reducer2 のようなチェーン マップ レデューサーを作成したことです。

Map1 と Map2 は同じ入力ファイルを読み込んでいます。

Reduce1 は、出力として 'X' を想定して値を導出しています。

「X」と Map2 の入力ファイルが必要です。

Reduce1 の出力ファイルを読み込まずにこれを行うにはどうすればよいでしょうか?

Mapper 2 にアクセスするために「X」をメモリに格納することは可能ですか?

4

2 に答える 2

4

各ジョブは互いに独立しているため、出力を中間の場所に保存しないと、ジョブ間でデータを共有することはできません。

参考までに、MapReduce モデルでは、マップ タスクは互いに通信しません。同じことがreduceタスクにも当てはまります。Hadoop で実行されるApache Giraphは、マッパー間の通信なしで同じジョブを何度も実行する必要がある反復アルゴリズムのために、同じジョブ内のマッパー間の通信を使用します。

実装されているアルゴリズムとその理由については不明ですが、すべての MR アルゴリズムはBSPでも実装できます。これは、BSP と MR を比較した論文です。一部のアルゴリズムは、MR と比較して BSP でうまく機能します。Apache Hamaは BSP モデルの実装であり、Apache Hadoop が MR の実装であるのと同様です。

于 2012-10-31T10:52:38.983 に答える
1

Reducer1 によって生成される個別の行の数が少ない場合 (たとえば、10000 (id,price) タプルがある場合)、2 段階の処理を使用することをお勧めします。最初の map/reduce の結果を各 Map2 マッパーのメモリにロードし、入力データをフィルター処理できます。そのため、不要なデータがネットワーク経由で転送されることはなく、すべてのデータがローカルで処理されます。コンバインを使用すると、データ量をさらに減らすことができます。

膨大な量の個別の行がある場合、データを 2 回読み取る必要があるように見えます。

于 2012-10-31T12:04:48.767 に答える