5

現在、私は 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 アプリのままですか?

4

1 に答える 1

5

ここにあなたの答えがあります。

  1. MapTask/ReduceTask のクラス ローダーがマッパー/リデューサー クラスをロードできる限り、マッパー クラスとリデューサー クラスは、パッケージ構造内の任意の場所に個別の Java クラスに配置することも、個別の jar ファイルに配置することもできます。あなたが示した例は、Hadoop 初心者向けの簡単なテスト用です。

  2. はい、任意の Java ライブラリを使用できます。-filesこれらのサードパーティの jar は、コマンドのオプションhadoop jarまたは Hadoop API を使用して、MapTask/ReduceTask で使用できるようにする必要があります。Map/Reduce クラスパスへのサードパーティ ライブラリの追加の詳細については、このリンクを参照してください

  3. はい、これらのアプローチのいずれかを使用して、構成を構成し、構成を Map/Reduce ジョブに渡すことができます。

    3.1以下のようにオブジェクトを使用して、クライアントプログラム(メソッドorg.apache.hadoop.conf.Configurationを持つJavaクラス)に構成を設定しますmain()

    Configuration conf = new Configuration(); conf.set("config1", "value1"); Job job = new Job(conf, "Whole File input");

Map/Reduce プログラムは Configuration オブジェクトにアクセスし、get()メソッドを使用してプロパティに設定された値を取得します。このアプローチは、構成設定が小さい場合に推奨されます。

3.2 分散キャッシュを使用して構成をロードし、Map/Reduce プログラムで使用できるようにします。分散キャッシュの詳細については、ここをクリックしてください。このアプローチはよりお勧めです。

4.main()これは、Hadoop ジョブの構成と送信を担当するクライアント プログラムです。構成が設定されていない場合は、デフォルト設定が使用されます。Mapper クラス、Reducer クラス、入力パス、出力パス、入力形式クラス、Reducer の数などの構成。

さらに、ジョブ構成に関するこちらのドキュメントを参照してください

はい、Map/Reduce プログラムは依然として JavaSE プログラムですが、これらは Hadoop クラスター内の複数のマシンに分散されています。Hadoop クラスターに 100 個のノードがあり、ワード カウントの例を提出したとします。map()/reduce()Hadoop フレームワークは、これらの Map および Reduce タスクごとに Java プロセスを作成し、データが存在するマシンのサブセットなどでコールバック メソッドを呼び出します。基本的に、マッパー/リデューサー コードは、データが存在するマシン上で実行されます。The Definitive Guideの第6章を読むことをお勧めします

これが役立つことを願っています。

于 2013-05-03T21:12:36.453 に答える