2013-05-03 14 views
5

現在、私は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アプリケーションであるハープマップマップ作成プログラムですか?

答えて

5

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

  1. マッパーと減速のクラスはどこにでもパッケージ構造では、別々のJavaクラスであるかのように長いMapTask/ReduceTaskのクラスローダはマッパ/減速のクラスをロードすることができますよう別々のJARファイルにしてもよいことができます。ここで示した例は、Hadoop初心者のための迅速なテストです。

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

  3. これらの方法のいずれかを使用して、設定を構成してマップ/縮小ジョブに渡すことができます。

    3。1 Configurationオブジェクトへのアクセス権を持っていると値がセットされますプログラムを削減/ main()方法

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

でJavaクラス(クライアントプログラムで構成を設定するには、以下のようなマップをorg.apache.hadoop.conf.Configurationオブジェクトを使用します

3.2分散キャッシュを使用して設定を読み込み、Map/Reduceプログラムで使用できるようにします。hereをクリックしてください分散キャッシュ上のテール。この方法がより推奨されます。

4. main()は、Hadoopジョブの設定と送信を担当するクライアントプログラムです。いずれの設定も設定されていない場合は、デフォルト設定が使用されます。例えば用などマッパークラス、減速クラス、入力パス、出力パス、入力フォーマットクラス、減速の数として構成:

また、

ジョブの設定にドキュメント hereを見てはい、マップ/ ReduceプログラムはまだJavaSEプログラムですが、これらはHadoopクラスタ内のマシンに分散されています。たとえば、Hadoopクラスタには100個のノードがあり、単語カウントの例が提示されます。 Hadoopフレームワークでは、これらのMapおよびReduceタスクごとにJavaプロセスが作成され、データが存在するマシンのサブセットに map()/reduce()などのコールバックメソッドが呼び出されます。基本的に、マッパー/レデューサーコードは、データが存在するマシン上で実行されます。私は The Definitive Guide

の第6章を読むことをお勧めします。これは役に立ちます。

+0

ありがとう、非常に有益! – gyorgyabraham

関連する問題