Hadoop MapReduce、Java実装に関する質問java


Answers

Question

現在、私はApache Hadoopに入っています(MapReduceジョブのJava実装で)。 私はWordCountの例のようないくつかの例を調べました。 私はカスタマイズされたmapreduceアプリを書くことに成功しました(私はCloudera Hadoop Demo VMを使っています)。 私の質問は、実装とランタイムに関するいくつかの質問です。

ジョブクラスのプロトタイプは次のとおりです。

public class WordCount {

  public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
    public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
    // mapping
      }
    }
  }

  public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
    public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
      // reducing
    }
  }

  public static void main(String[] args) throws Exception {
    JobConf conf = new JobConf(WordCount.class);
    conf.setJobName("wordcount");
    // setting map and reduce classes, and various configs
    JobClient.runJob(conf);
  }
}

私はいくつかの質問がある、私はそれらをGoogleにしようとしたが、私はhadoopのドキュメントは非常に(初心者には適していない、大きな参考書のような)正式であることを伝える必要があります。

私の質問:

  • MapクラスとReduceクラスは、Mainクラスの静的な内部クラスでなければならないか、どこからでもかまいません(メインから見えるだけです)。
  • 通常のJava SEアプリケーションのように、Java SEと使用可能なライブラリが提供する必要があるものは何でも使用できますか? つまり、JAXB、Guava、JSONのJacksonなどです
  • 汎用ソリューションを作成するベストプラクティスは何ですか? つまり、大量のログファイルを異なる(しかしやや似たような)方法で処理したいということです。 ログファイルの最後のトークンは、常にいくつかのエントリを持つJSONマップです。 1つの処理は次のようになります。ログ行のカウントとグループ化(keyA、マップからのkeyB)と別の処理:ログ行のカウントとグループ化(keyX、マップからのkeyY) (私はいくつかのconfigfileベースのソリューションを考えています。実際に必要なエントリをプログラムに提供することができます。新しい解決策が必要な場合は、設定を提供してアプリケーションを実行する必要があります)。
  • WordCountの例では、MapクラスとReduceクラスは静的な内部クラスでmain()は影響を受けず、これらのクラスをフレームワークに提供するだけです。 これらのクラスを静的にすることができます。いくつかのフィールドとコンストラクタを提供して、いくつかの現在の値(前述のconfigパラメータのようなもの)でランタイムを変更できますか?

たぶん私は不必要に詳細を掘り下げているのかもしれない。 全体的な質問は:私たちが慣れ親しんでいた通常のJavaSEアプリケーションであるハープマップマップ作成プログラムですか?