web-dev-qa-db-ja.com

Hadoop 1つのマップと複数の削減

複数のreduce関数で分析する大きなデータセットがあります。

すべてのreduceアルゴリズムは、同じmap関数によって生成された同じデータセットに対して機能します。大きなデータセットを読み取ると、毎回行うにはコストがかかりすぎます。一度だけ読み取ってmappedデータを複数のreduce関数に渡すことをお勧めします。

これをHadoopで実行できますか?例とインターウェブを検索しましたが、解決策は見つかりませんでした。

36
KARASZI István

すべてのリデューサーがまったく同じマッピングされたデータで作業することを期待していますか?ただし、少なくとも "キー"は、どのレデューサーを使用するかを決定するため、異なる必要があります。

マッパーで出力を複数回書き込んで、キーとして出力できます($ iはi番目のレデューサー用で、$ keyは元のキーです)。また、これらのn個のレコードが$ iに基づいてレデューサーに分散されるようにするには、「Partitioner」を追加する必要があります。次に、「GroupingComparator」を使用して、元の$ keyでレコードをグループ化します。

それを行うことは可能ですが、1つのMRでは簡単な方法ではありません。

4
Victor

おそらく、簡単な解決策は、reduce関数を持たないジョブを記述することです。したがって、マッピングされたすべてのデータをジョブの出力に直接渡します。ジョブのレデューサーの数をゼロに設定するだけです。

次に、そのデータを処理するさまざまな削減関数ごとにジョブを記述します。これは、マッピングされたすべてのデータをHDFSに保存することを意味します。

別の方法としては、すべてのリデュース関数を1つのリデューサーに結合し、関数ごとに異なる出力を使用して、複数のファイルに出力することもできます。複数の出力は hadoop 0.19に関するこの記事 で言及されています。この機能は0.20.1でリリースされた新しいmapreduce APIで機能しないと確信していますが、古いmapred APIでも引き続き使用できます。

11
Binary Nerd

複合キーを使用できます。たとえば、「R1」と「R2」の2種類の減速機が必要だとします。マッパーのo/pキーにこれらのIDをプレフィックスとして追加します。したがって、マッパーでは、キー「K」は「R1:K」または「R2:K」になります。

次に、レデューサーで、プレフィックスに基づいてR1またはR2の実装に値を渡します。

3
Sameer Joshi

異なるレデューサーをチェーンで実行したいと思います。 hadoopでは、「複数のレデューサー」とは、同じレデューサーの複数のインスタンスを実行することを意味します。一度に1つのレデューサーを実行し、最初のレデューサーを除くすべてに簡単なマップ機能を提供することをお勧めします。データ転送の時間を最小限に抑えるために、圧縮を使用できます。

1
trebuchet

私はまだあなたの問題を理解していません、あなたは次のシーケンスを使うことができます:

database-> map-> reduce(要件に応じてcatまたはNoneを使用)して、抽出したデータ表現を保存します。メモリに収まるほど小さいと言っている場合は、ディスクに保存しても問題ありません。

また、特定の問題に対するMapReduceパラダイムの使用は正しくありません。単一のマップ関数と複数の「異なる」リデュース関数を使用しても意味がありません。マップを使用してデータを異なるマシンに渡し、異なることを行っていることを示しています。あなたはそのためにhadoopや他の特別なアーキテクチャを必要としません。

0
none

もちろん、複数のレデューサーを定義できます。ジョブ(Hadoop 0.20)の場合は、以下を追加します。

_job.setNumReduceTasks(<number>);
_

だが。インフラストラクチャは複数のレデューサーをサポートする必要があります。つまり、

  1. 複数のCPUを利用できる
  2. mapred-site.xmlのmapred.tasktracker.reduce.tasks.maximumを適宜調整してください

そしてもちろん、あなたの仕事はいくつかの仕様に一致する必要があります。あなたが正確に何をしたいのかわからない場合、私は幅広いヒントを与えることができます:

  • キーマップ出力 %numreducersによって分割可能である必要がありますOR独自のパーティション設定を定義する必要があります:job.setPartitionerClass(...)たとえば、ランダムパーティション設定...
  • データはパーティション形式で縮小可能でなければなりません...(参照が必要ですか?)

各レデューサーに1つずつ、複数の出力ファイルを取得します。ソートされた出力が必要な場合は、すべてのファイルを読み取る別のジョブ(今回は複数のマップタスク)を追加し、1つのレデューサーのみでソートしてそれらを書き込む必要があります...

local ReducerであるCombiner-Classも見てください。つまり、マップによって出力された部分的なデータを介して、すでにメモリ内に集約(削減)できるということです。とてもいい例はWordCount-Exampleです。 Mapは各Wordをキーとして、その数を1:(Word、1)として発行します。 Combinerは、マップから部分的なデータを取得し、ローカルで(、)を出力します。 Reducerもまったく同じですが、一部の(結合された)ワードカウントはすでに> 1です。帯域幅を節約します。

0
Leonidas