2016-06-30 9 views
0

addinputpath関数を同じパスで2回入力すると、同じファイルの2つのマッパーを生成できますが、毎回そのファイルを少しずつ処理したいと思います。異なるパラメータでファイルを2回読み取る

具体的には、Jobクラス(configuration.set/get)を通過するさまざまなパラメータを毎回使用したいと思います。ファイルが異なる場合は、context/inputsplitクラスを使用してファイルのパス/名前を取得しますが、それらは同じで、区別できません。何かご意見は?

各マッパは異なるマプタマスクですが、私がマプタマスクに関する情報を使用できるかどうかはわかりません。また、私はframeworkがmaptasksにinputsplitsと一致する順序を知らない - 有用かもしれない。

代わりに、私は(別の名前を使用して)ファイルを複製することができ、それが資源

答えて

0

私はinputsplitとinputformatのクラス(便宜上fileinputformatとfilesplit)を上書きしなければなりませんでした。

分割を読み込む時間を区別するために、filesplitに追加のフィールドを追加しました。それはうまくいっています

0

の無駄だろう、私はあなたのマッパーにこのロジックを置くためにあなたをお勧めします。 Hadoopに同じファイルを2回スキャンして処理させるより効率的です。

ので、擬似コードはそのようになります:

map(key, value, context) { 

    //do something with this key/value 
    ... 
    //emit output 1 
    context.write(...) 

    //do something else with this the same key/value 
    ... 
    //emit output 2 
    context.write(...) 
} 

あなたは出力1と2は異なる減速に派遣する必要がある場合、あなたはそうするためにあなたの出力キーを作る必要があります。

+0

問題は、/ *このキー値で何かを行う* /コストが高いため、放出が並行して起こらなければならないということです。実際には、同じファイルの2つの読み込みを区別する別の方法はありませんか? – user3161227

+0

2つのスレッドで実行し、両方が完了するのを待ちますか? Hadoopは同じノード上で複数のマッパーを実行する可能性があるため、実際には大きな違いはありません。 – yurgis

+0

/*このキー値* /で何かを行うとコストがかかると思うなら、最高の並列性を達成するためにもっと多くのマッパーを実行してください。ここでもまた、1つのマッパーが出力1を書いている間、もう1つのマッパーは出力2を書いているかもしれません。上のアプローチは、IOが2回実行されるのを避けるため、最適なパフォーマンスを発揮します。第2に、2つのファイルを区別して、同一のMRジョブで異なるパラメータをとることはできません。 –

関連する問題