現在、私はApache Hadoop(MapReduceジョブのJava実装)に入っています。私はWordCountの例のようないくつかの例を調べました。私はカスタマイズされたmapreduceアプリを書くことに成功しました(私はCloudera Hadoop Demo VMを使っています)。私の質問は、実装とランタイムに関するいくつかの質問です。Hadoop MapReduce、Java実装の質問
次のようにジョブ・クラスのプロトタイプは次のとおりです。
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);
}
}
私は、私はそれらをグーグルしようとしたが、Hadoopのは非常にフォーマルである上、私は(大きな参考書のように)そのドキュメントを伝える必要があり、いくつかの質問を持っています初心者には適していません。
私の質問:
- は地図を行い、クラスは メインクラスの静的内部クラスでなければならない、または、彼らはどこにでも(メインからちょうど見える?)することができ削減
- あなたが何かを使用することができますJava SEと利用可能なライブラリは、通常のJava SEアプリケーションのように提供する必要がありますか? JAXB、Guava、JSONのJacksonなど
- ジェネリックソリューションを作成するベストプラクティスは何ですか?つまり、大量のログファイルを異なる(ただしやや似たような)方法で処理したいということです。ログファイルの最後のトークンは、常にいくつかのエントリを持つJSONマップです。 1つの処理は次のようになります。ログ行のカウントとグループ化(keyA、マップからのkeyB)と別の処理:ログ行のカウントとグループ化(keyX、マップからのkeyY) (私はいくつかのconfigfileベースのソリューションを考えています。実際に必要なエントリをプログラムに提供することができます。新しい解決策が必要な場合は、設定を提供してアプリケーションを実行する必要があります)。
- とすることができます:WordCountの例では、MapクラスとReduceクラスは静的な内部クラスであり、main()は影響を受けません。これらのクラスをフレームワークに提供するだけです。これらのクラスを静的にすることができます。いくつかのフィールドとコンストラクタを提供して、いくつかの現在の値(前述のconfigパラメータのようなもの)でランタイムを変更できますか?
多分私は不必要に詳細を掘り下げています。全体的な質問は:私たちが慣れ親しんでいた通常のJavaSEアプリケーションであるハープマップマップ作成プログラムですか?
ありがとう、非常に有益! – gyorgyabraham