0

次のデータを含むプレーンテキストファイルがあるとします。

DataSetOne <br />
content <br />
content <br />
content <br />


DataSetTwo <br />
content <br />
content <br />
content <br />
content <br />

...等々...

私がしたいのは、各データセットのコンテンツの数を数えることです。たとえば、結果は次のようになります。

<DataSetOne, 3>, <DataSetTwo, 4>

私はHadoopの初心者ですが、データのチャンク全体をノードにマップする方法があるのではないかと思います。たとえば、すべてのDataSetOneをノード1に設定し、すべてのDataSetTwoをノード2に設定します。

誰かが私にこれをアーカイブする方法のアイデアを与えることができますか?

4

3 に答える 3

2

簡単な方法は、マッパーにロジックを実装することだと思います。ここで、現在のdataSetが何であるかを覚えて、次のようなペアを出力します。

(DataSetOne、content)
(DataSetOne、content)
(DataSetOne、content)

(DataSetTwo、content)
(DataSetTwo、content)

次に、reduceステージでグループをカウントします。

パフォーマンスが問題になる場合は、コンバイナーを検討することをお勧めします。

于 2011-01-15T17:48:26.993 に答える
0

FileInputFormatクラスを拡張し、RecordReaderインターフェイスを実装して(または、新しいAPIを使用している場合は、RecordReader抽象クラスを拡張して)、データの分割方法を定義できます。これは、古いAPIを使用してこれらのクラスを実装する方法の例を示すリンクです。

http://www.questionhub.com/StackOverflow/4235318

于 2011-01-15T17:58:48.983 に答える
0

まず、データセットが別々のファイルにある場合、または構成されたブロックサイズを超えている場合、データセットは複数のマップに分割されます。したがって、128MBのデータセットが1つあり、チャンクサイズが64mbの場合、hadoopはこのファイルを2ブロックし、それぞれに2つのマッパーをセットアップします。
これは、Hadoopチュートリアルの単語数の例のようなものです。Davidが言うように、キーと値のペアをHDFSにマッピングしてから、それらを減らす必要があります。私はそれを次のように実装します:

// field in the mapper class
int groupId = 0;

@Override
protected void map(K key, V value, Context context) throws IOException,
        InterruptedException {
    if(key != groupId)
        groupId = key;
    context.write(groupId, value);
}

@Override
protected void reduce(K key, Iterable<V> values,
        Context context)
        throws IOException, InterruptedException {
    int size = 0;
    for(Value v : values){
        size++;
    }
    context.write(key, size);
}

デビッドが言ったように、あなたはコンバイナーを使うことができます。コンバイナーは単純なレデューサーであり、マップとリデュースフェーズの間でリソースを保存するために使用されます。それらは構成で設定できます。

于 2011-01-15T18:06:00.283 に答える