0

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

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

1) この方法で解決策を見つけることは可能ですか? はいの場合、ここで Hadoop で arraylist を作成できなかったので、いくつかのヒントが必要です :-)

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

前向きになれるヒントを教えてください。ありがとうございました

4

2 に答える 2

0

マップ ステップで、すべての数値を 1 つのキーにマップできます。次に、削減ステップで、最大値を取得できます。reduce ステップには、特定のキーの反復可能な値のコレクションが渡されます。独自の ArrayList を作成する必要はありません。

于 2013-02-19T20:00:44.107 に答える
0

このためには、単一のレデューサーを使用することをお勧めします。

すべての数値が同じリデューサーに到達するようにするには、次の 2 つのことを行う必要があります。

  1. マッパーのすべての入力値に対して同じキーを発行する
  2. reduce タスクをゼロに設定します。

map()メソッドは次のようになります。

@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
          context.write(new Text("MyAwesomeKey"), key); // assuming that your number is being read in the key
           }

Reduceクラスにはmax、次のような プロパティがあります。Long max

メソッドはreduce()次のようになります。

@Override
public void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
          context.write(new Text("MyAwesomeKey"), key); // assuming that your number is being read in the key
           }

次に、オーバーライドするときにrun()もオーバーライドしreduce()ます。

 public void run(Context context) throws IOException, InterruptedException {
    setup(context);
    while (context.nextKey()) {
      reduce(context.getCurrentKey(), context.getValues(), context);
    }
    context.write(new LongWritable(max),new Text("")); // write the max value
    cleanup(context);
  }

reduce タスクを 1 つに設定するには、ジョブのrun()で次を実行します。これは上記の とは異なることに注意してrun()ください。

job.setNumReduceTasks(1);

注:上記のコードはすべて新しいmapreduce API に従っています。古いmapred API を使用すると、Reducer の をオーバーライドすることでできるように、Reducer がその仕事を完了した後に単一のフック ポイントを持つことができないと思いますrun()

于 2013-02-19T22:08:27.850 に答える