質問

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

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に設定します。

誰かが私にこれをアーカイブする方法を教えてもらえますか?

役に立ちましたか?

解決

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

// 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);
}

デビッドが言ったように、コンバイナーを使用できると言った。組み合わせは単純な還元剤であり、マップ間のressourceを保存するために使用され、位相を減らします。構成で設定できます。

他のヒント

簡単な方法は、マッパーにロジックを実装することだと思います。ここでは、現在のデータセットであるものを覚えていて、次のようなペアを発します。

(データセット、コンテンツ)
(データセット、コンテンツ)
(データセット、コンテンツ)

(DataSettwo、コンテンツ)
(DataSettwo、コンテンツ)

そして、削減段階でグループをカウントします。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top