2010-12-06 15 views
5

マップ縮小ジョブの連鎖を実行したいので、最も簡単な解決策はjobcontrollerのようです。私はjob1とjob2の2つの仕事があると言います。 job1の後にjob2を実行したい。まあ、それはいくつかの問題に直面した。デバッグの時間後、私はこれらの行にコードを絞り込ん:複数のMapReduceジョブをhadoopで実行しています

JobConf jobConf1 = new JobConf(); 
JobConf jobConf2 = new JobConf(); 
System.out.println("*** Point 1"); 
Job job1 = new Job(jobConf1); 
System.out.println("*** Point 2"); 
Job job2 = new Job(jobConf2); 
System.out.println("*** Point 3"); 

私は、コードを実行するときに、この出力を得続ける:私は推測何

*** Point 1  
10/12/06 17:19:30 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId= 
*** Point 2  
10/12/06 17:19:30 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized 
*** Point 3 

は私の問題は、「に何とか関係していることですJMVを初期化することはできません.... "という行です。それは何ですか? JobControllerに渡すために、どのように複数のジョブをインスタンス化することができますか?

10/12/07 11:28:21 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized 
Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/home/workspace/WikipediaSearch/__TEMP1 
     at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:224) 
     at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:241) 
     at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:885) 
     at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:779) 
     at org.apache.hadoop.mapreduce.Job.submit(Job.java:432) 
     at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:447) 
     at ch.ethz.nis.query.HadoopQuery.run(HadoopQuery.java:353) 
     at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) 
     at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) 
     at ch.ethz.nis.query.HadoopQuery.main(HadoopQuery.java:308) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.apache.hadoop.util.RunJar.main(RunJar.java:156) 

__Temp1は、最初のジョブの出力フォルダで、私は入力になりたい:私は副業を初期化する前に(真)job1.waitForTheCompletionを追加すると

は、それは私に、このエラーが発生しました2番目のもの。私のコードにこのwaitForCompletion行があるにもかかわらず、このパスが存在しないと不平を言っています。

答えて

5

デバッグの2日後に、hadoopの内部ディレクトリ名のルールに問題があることがわかりました。一見、入力または出力のmap-reduceディレクトリの場合、アンダーライン "_"で始まる名前は選択できません。あの愚か! 警告とエラーはまったく役に立たなかった。

+0

Hadoopのドキュメントは完全に完璧ではありません。私はInputSplitのサブクラスがWritableを実装しなければならないことを永遠に知りました。どこかでInputSplitのドキュメンテーションに言及していると思います。私はまだ瓶に梱包せずにハープ・ジョブを正常に実行することはできませんでした。 – dspyz

0

別のジョブが終了していない間にジョブを作成することはできますか?私はhadoop 0.20.2を使用しています(JobConfは廃止されていますが、後方互換性をサポートするためにhadoopが主張していますが、私の経験上、実際にはそうではありません)。 job2を作成する前にjob1.waitForCompletion(true)を追加しても問題は解決しますか?

+0

こんにちは、はい、実際には、これを含むすべてのシナリオをテストしました:for(int i = 0; i <2; i ++){Job job = new Job(getConf()、 "iteration"); InitializeTheJob; job.wait.waitForCompletion(true); }そして、私は同じ警告を受け続けます。何か新しいことが起こった。私はあなたが問題を見ることができるように、主な質問のポストを更新しました。 – narengi

関連する問題