2

こんにちは私は現在MapReduceを学んでいて、hadoop1.0.4で小さなジョブを構築しようとしています。ストップワードのリストとパターンのリストがあります。ファイルをマップする前に、マップなどの効率的なデータ構造にストップワードをロードしたいと思います。また、パターンリストから1つの正規表現パターンを作成したいと思います。これらはシリアルタスクなので、マッピングの前で実行し、すべてのマッパーにコピーを渡します。それらの読み取り/書き込みが可能なオブジェクトへのそれらの。ドライバークラスにgetterを使用して静的変数を設定することを考えましたが、ポインターとしてjava呼び出しオブジェクトを使用すると、これは機能しません。もちろん、渡す前にオブジェクトのクローンを作成することもできますが、これは実際には良い習慣とは思えません。私は分散キャッシュについて何かを読みましたが、それを理解している限り、それはファイルのみであり、オブジェクトではなく、すべてのマッパーにstoppワード/パターンファイルを読み取らせることができました。

助けてくれてありがとう!

4

2 に答える 2

2

Hadoop 分散キャッシュは、一部の参照データをマッパーに渡すためのメカニズムです。パフォーマンスの観点からは、HDFS からロードするよりも優れています。これは、データがタスクごとではなく、ノードごとに 1 回 HDFS からローカル ファイル システムに渡されるためです。
あなたは完全に正しいです-それはファイルと読み取りファイルのみであり、それらをあなたのデータ構造に変換するのはあなたの責任です。
私の理解では、hadoop はオブジェクトの受け渡しをサポートしていません。ただし、これらのファイルで何らかのシリアル化を使用する場合は、要求に近いものになります。

于 2012-11-22T07:25:19.713 に答える
2

考えられる解決策は、ジョブを実行する前に stopwords.txt を HDFS にコピーし、Mapper のsetupメソッドで適切なデータ構造に読み込むことです。例えば:

MyMapper クラス:

...
private Map<String, Object> stopwords = null;

@Override
public void setup(Context context) {
    Configuration conf = context.getConfiguration();
    //hardcoded or set it in the jobrunner class and retrieve via this key
    String location = conf.get("job.stopwords.path");
    if (location != null) {
        BufferedReader br = null;
        try {
            FileSystem fs = FileSystem.get(conf);
            Path path = new Path(location);
            if (fs.exists(path)) {
                stopwords = new HashMap<String, Object>();
                FSDataInputStream fis = fs.open(path);
                br = new BufferedReader(new InputStreamReader(fis));
                String line = null;
                while ((line = br.readLine()) != null && line.trim().length() > 0) {
                    stopwords.put(line, null);
                }
            }
        }
        catch (IOException e) {
            //handle
        } 
        finally {
            IOUtils.closeQuietly(br);
        }
    }
}
...

次に、map メソッドでストップワードを使用できます。

もう 1 つのオプションは、jobrunner クラスでストップワードを使用してマップ オブジェクトを作成し、それを Base64 でエンコードされた文字列にシリアル化し、それを Configuration オブジェクトのキーの値としてマッパーに渡し、setup メソッドで逆シリアル化することです。

最初のオプションを選択したのは、簡単だからというだけでなく、Configuration オブジェクトを介して大量のデータを渡すのは得策ではないからです。

于 2012-11-21T22:20:47.190 に答える