2012-01-21 9 views
0

Javaアプリケーションからmapreduceジョブを呼び出す必要があります。私はCONFのmapred.job.jobtrackerを設定しない場合 私はjavaアプリケーションからmapreduceジョブを実行しようとしたときにキャッチされた例外

ToolRunner.run(new Validation(), pathsMoveToFinal.toArray(new String[pathsMoveToFinal.size()])); 

を使用し、それは永遠のように実行します。マップタスクは100%に変わり、次に他のパーセンテージに戻ります。私はmapred.job.jobtrackerを設定した場合、それはマッパークラスが見つからない文句:

java.lang.RuntimeException: java.lang.ClassNotFoundException: utils.DataValidationExtractorMapper 
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:809) 
at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:157) 
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:569) 
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305) 
at org.apache.hadoop.mapred.Child.main(Child.java:170) 
Caused by: java.lang.ClassNotFoundException: utils.DataValidationExtractorMapper 
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:247) 
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:762) 
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:807) 
... 4 more 

誰も私にいくつかのヒントを与えてくださいでした。ありがとう、良い週末を過ごす。

+0

これはクラスパスの問題です。 Eclipseを使用している場合は、クラスパスにjarファイルを追加する必要があります –

+0

ありがとうございます。私はクラスパスの瓶を持っています。私はWindows Eclipseから試してみると、Validationのrunメソッドに行くことができます。しかし、私はそれをパッケージ化し、Linuxから実行すると、この例外が発生します。 libフォルダにjarファイルがあります。 –

+0

オールインワンのjarをビルドしていない限り、クラスパスを修正する必要があります。 –

答えて

1

Sovled。それは、メイヴンの事のためではありません。 Javaコードからmapreduceジョブを開始しようとすると、mapreduceジョブをjarファイルにパックする必要があります。 hadoopは別のタスクのjvmsにjarファイルをコピーしようとしていたためです。すべての提案ありがとう!

1

Mavenを使用しているので、私はbaking your dependencies statically into your JARを強くお勧めします。

この理由は、MapperとReducer JREにクライアントのクラスパスに関する既存のコンテキストがないためです。依存関係を焼くことは、将来性があり、安定しているため、HadoopはこのJARで非常にうまく動作するはずです。

1

ここで私の前の回答(および他の回答)を参照してください:

How to make a monolithic jar.file?

が、その後のHadoop jarファイルを実行します。

共有/非所有ボックスでクラスパスを設定することは、すべてのタスクサーバーにjarファイルを複製する必要があるため、大きな問題になる可能性があります。 1台のサーバを追加し、クラスパスを設定するのを忘れてしまいました。私の仕事はいくつかのタスクマシンで壊れますが、他のマシンでは動作します。あなたが100ボックスを持っているときにそれをデバッグしよう!モノリシックなjarは、すべての依存関係を1つの大きな分散可能なjarにカプセル化します。

関連する問題