現在、私は 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 クラスの静的な内部クラスである必要がありますか、それともどこでもかまいません (Main から見えるだけですか?)
- 通常のJava SEアプリのように、Java SEと利用可能なライブラリが提供するものは何でも使用できますか? つまり、JAXB、Guava、Jackson for JSON などのように
- 一般的なソリューションを作成するためのベスト プラクティスは何ですか? つまり、大量のログ ファイルをさまざまな (ただし少し似た) 方法で処理したいということです。ログ ファイルの最後のトークンは常に、いくつかのエントリを含む JSON マップです。1 つの処理として、(マップからの keyA、keyB) のログ行によるカウントとグループ化、および (マップからの keyX, keyY) 上のログ行によるカウントとグループ化が考えられます。(実際に必要なエントリをプログラムに提供できるconfigfileベースのソリューションを考えています。新しい解決策が必要な場合は、構成を提供してアプリを実行するだけです)。
- 関連する可能性があります。WordCount の例では、Map および Reduce クラスは静的内部クラスであり、main() はそれらにまったく影響を与えず、これらのクラスをフレームワークに提供するだけです。これらのクラスを非静的にし、いくつかのフィールドとコンストラクターを提供して、いくつかの現在の値でランタイムを変更できますか (前述の構成パラメーターなど)。
無駄に詳細を掘り下げているのかもしれません。全体的な質問は次のとおりです。Hadoop の mapreduce プログラムは、私たちが慣れ親しんだ通常の JavaSE アプリのままですか?