-4

私は最近Hadoopで作業を開始し、Hadoopに関する基本的な理論的知識を学びました。input.txt(1 10 37 5 4 98 100など)などのテキストファイルで入力を指定するタスクを解決しようとしています。

与えられた入力(つまり整数型)で最大の整数を見つける必要があります。最初の整数を残りのすべての整数と比較できるように、配列リストの入力を渡そうとしています(forループを使用)。

プログラムは入力ファイルを読み取り、いくつかの乱数100 20 40 90 70を読み取り、出力は100と表示されます。mapとreduce関数のwordcountの例を使用してコードを変更しようとしました。しかし、私はHadoopでコーディングを始めたばかりなので、どこが間違っているのか理解できませんでした。

1)この方法で解決策を見つけることは可能ですか?はいの場合、ここhadoopで配列リストを作成できず、いくつかのヒントが必要です:-)

2)キーと値のペアの代わりに「キー」のみを出力できますか?もしそうなら、私を助けてください。印刷しないためにreduce関数をコーディングしようとしましたが、エラーが発生します。

私が前進するためのヒントをいくつか教えてください。ありがとうございました

4

1 に答える 1

1

Hadoop Java API を読み、次の関数を記述します。

Map: Identity function

Reduce (or Combine): (K, List<V>) -> (K, max(List<V>))

あなたのコメントに関して、ArrayListsMapReduceにはありません。それらはメモリに収まりません。値のリストは反復子として渡され、オブジェクトはメモリを節約するために再利用されることがよくあります。

マッパー API: http://hadoop.apache.org/docs/r1.1.1/api/org/apache/hadoop/mapreduce/Mapper.html

マッパーの場合、次の関数を作成するか、事前に実装されIdentityMapperた .

public void map(K key, V val, Context context)
throws IOException {
    context.collect(key, val);
}

レデューサー API: http://hadoop.apache.org/docs/r1.1.1/api/org/apache/hadoop/mapreduce/Reducer.html

reduce 関数は ( と仮定してV implements Comparable<V>) になります。簡潔にするために、値には少なくとも 1 つの項目が含まれているとします。

public void reduce(K key, Iterator<V> values, Context context)
throws IOException {
    V max = values.next();
    while( values.hasNext() ) {
        V current = values.next();
        if( current.compareTo(max) > 0 )
            max = current;
    }
    context.collect(key, max);
}
于 2013-02-19T00:02:54.530 に答える