2012-03-25 15 views
15

main()ToolRunner.run()のmapreduceジョブを呼び出す違いは何ですか?主なクラスがMapReduce extends Configured implements Toolと言うとき、mainメソッドから単純にジョブを実行するだけでは得られない追加の特権は何ですか?ありがとう。ジョブの呼び出しの相違

答えて

23

そこには特別な権限ませんが、あなたのコマンドラインオプションを使用すると、特定の構成プロパティを抽出し、そこから設定オブジェクトを設定できるようになりますGenericOptionsParser、経由して実行します:むしろ、基本的には

http://hadoop.apache.org/common/docs/r0.20.2/api/org/apache/hadoop/util/GenericOptionsParser.html

を解析し、いくつかのこと(リストの引数のインデックスを使用して)コマンドラインから明示的に設定プロパティを設定することができます:

hadoop jar myJar.jar com.Main prop1value prop2value 

public static void main(String args[]) { 
    Configuration conf = new Configuration(); 
    conf.set("prop1", args[0]); 
    conf.set("prop2", args[1]); 

    conf.get("prop1"); // will resolve to "prop1Value" 
    conf.get("prop2"); // will resolve to "prop2Value" 
} 

ToolRunnerと縮合しE:しかし警告の

hadoop jar myJar.jar com.Main -Dprop1=prop1value -Dprop2=prop2value 

public int run(String args[]) { 
    Configuration conf = getConf(); 

    conf.get("prop1"); // will resolve to "prop1Value" 
    conf.get("prop2"); // will resolve to "prop2Value" 
} 

最後にひとつの単語:設定方法getConfを()を使用した場合、最初のジョブオブジェクトを作成し、その設定を抜く - 仕事のコンストラクタはConfigruationオブジェクトのコピーを作成しますあなたが渡された参照に変更を行った場合、あなたの仕事は、これらの変更は表示されませんので、渡された:

public int run(String args[]) { 
    Configuration conf = getConf(); 

    conf.set("prop3", "blah"); 

    Job job = new Job(conf); // job will have a deep copy of conf 

    conf.set("prop4", "dummy"); // here we're amending the original conf 

    job.getConfiguration().get("prop4"); // will resolve to null 
} 
+0

さて、これはコードではうまく説明できませんでした。 Jobオブジェクトを最初に作成してから、その設定を取得するのと同じように、いくつかの点を先に気付かなかったのですが、今は意味があります。 –

11

ToolRunner .RUNを使用することにより)、任意のHadoopのアプリケーションはstandard command line optionsは、Hadoopのでサポートされて処理することができます。 ToolRunnerは内部でGenericOptionsParserを使用します。要するに、コマンドラインで提供されているhadoop固有のオプションが解析され、アプリケーションのConfigurationオブジェクトに設定されます。単にmain()を使うと、これは自動的に起こりません。

例えば、あなたが言う場合:

% hadoop MyHadoopApp -D mapred.reduce.tasks=3 

はその後 ToolRunner.run(new MyHadoopApp(), args)が自動的 Configurationオブジェクト内の3にvalueパラメータ mapred.reduce.tasksを設定します。

私たちが取得する追加の特典はありません。一般的に、人々はハープ・ジョブで単にmain()を使用しません。 .run()を使用するのが標準的な方法です。

+0

@ TejasP- Thanx a lot !! :)はい、私はそのような漠然としたアイデアを念頭に置いていましたが、今はその.. –

関連する問題