複数のreduce関数で分析する大きなデータセットがあります。
すべてのreduceアルゴリズムは、同じmap関数によって生成された同じデータセットに対して機能します。大きなデータセットを読み取ると、毎回行うにはコストがかかりすぎます。一度だけ読み取ってmappedデータを複数のreduce関数に渡すことをお勧めします。
これをHadoopで実行できますか?例とインターウェブを検索しましたが、解決策は見つかりませんでした。
すべてのリデューサーがまったく同じマッピングされたデータで作業することを期待していますか?ただし、少なくとも "キー"は、どのレデューサーを使用するかを決定するため、異なる必要があります。
マッパーで出力を複数回書き込んで、キーとして出力できます($ iはi番目のレデューサー用で、$ keyは元のキーです)。また、これらのn個のレコードが$ iに基づいてレデューサーに分散されるようにするには、「Partitioner」を追加する必要があります。次に、「GroupingComparator」を使用して、元の$ keyでレコードをグループ化します。
それを行うことは可能ですが、1つのMRでは簡単な方法ではありません。
おそらく、簡単な解決策は、reduce関数を持たないジョブを記述することです。したがって、マッピングされたすべてのデータをジョブの出力に直接渡します。ジョブのレデューサーの数をゼロに設定するだけです。
次に、そのデータを処理するさまざまな削減関数ごとにジョブを記述します。これは、マッピングされたすべてのデータをHDFSに保存することを意味します。
別の方法としては、すべてのリデュース関数を1つのリデューサーに結合し、関数ごとに異なる出力を使用して、複数のファイルに出力することもできます。複数の出力は hadoop 0.19に関するこの記事 で言及されています。この機能は0.20.1でリリースされた新しいmapreduce APIで機能しないと確信していますが、古いmapred APIでも引き続き使用できます。
複合キーを使用できます。たとえば、「R1」と「R2」の2種類の減速機が必要だとします。マッパーのo/pキーにこれらのIDをプレフィックスとして追加します。したがって、マッパーでは、キー「K」は「R1:K」または「R2:K」になります。
次に、レデューサーで、プレフィックスに基づいてR1またはR2の実装に値を渡します。
異なるレデューサーをチェーンで実行したいと思います。 hadoopでは、「複数のレデューサー」とは、同じレデューサーの複数のインスタンスを実行することを意味します。一度に1つのレデューサーを実行し、最初のレデューサーを除くすべてに簡単なマップ機能を提供することをお勧めします。データ転送の時間を最小限に抑えるために、圧縮を使用できます。
私はまだあなたの問題を理解していません、あなたは次のシーケンスを使うことができます:
database-> map-> reduce(要件に応じてcatまたはNoneを使用)して、抽出したデータ表現を保存します。メモリに収まるほど小さいと言っている場合は、ディスクに保存しても問題ありません。
また、特定の問題に対するMapReduceパラダイムの使用は正しくありません。単一のマップ関数と複数の「異なる」リデュース関数を使用しても意味がありません。マップを使用してデータを異なるマシンに渡し、異なることを行っていることを示しています。あなたはそのためにhadoopや他の特別なアーキテクチャを必要としません。
もちろん、複数のレデューサーを定義できます。ジョブ(Hadoop 0.20)の場合は、以下を追加します。
_job.setNumReduceTasks(<number>);
_
だが。インフラストラクチャは複数のレデューサーをサポートする必要があります。つまり、
そしてもちろん、あなたの仕事はいくつかの仕様に一致する必要があります。あなたが正確に何をしたいのかわからない場合、私は幅広いヒントを与えることができます:
job.setPartitionerClass(...)
たとえば、ランダムパーティション設定...各レデューサーに1つずつ、複数の出力ファイルを取得します。ソートされた出力が必要な場合は、すべてのファイルを読み取る別のジョブ(今回は複数のマップタスク)を追加し、1つのレデューサーのみでソートしてそれらを書き込む必要があります...
local ReducerであるCombiner-Classも見てください。つまり、マップによって出力された部分的なデータを介して、すでにメモリ内に集約(削減)できるということです。とてもいい例はWordCount-Exampleです。 Mapは各Wordをキーとして、その数を1:(Word、1)として発行します。 Combinerは、マップから部分的なデータを取得し、ローカルで(、)を出力します。 Reducerもまったく同じですが、一部の(結合された)ワードカウントはすでに> 1です。帯域幅を節約します。