8

私はJavaでmapreduceプログラムを作成しました。これは、分散モードで実行されているリモートクラスターに送信できます。現在、次の手順でジョブを送信しています。

  1. mapreuceジョブをjarとしてエクスポートします(例myMRjob.jar
  2. 次のシェルコマンドを使用して、リモートクラスターにジョブを送信します。hadoop jar myMRjob.jar

プログラムを実行しようとしたときに、Eclipseから直接ジョブを送信したいと思います。これどうやってするの?

私は現在CDH3を使用していますが、私のconfの要約版は次のとおりです。

conf.set("hbase.zookeeper.quorum", getZookeeperServers());
conf.set("fs.default.name","hdfs://namenode/");
conf.set("mapred.job.tracker", "jobtracker:jtPort");
Job job = new Job(conf, "COUNT ROWS");
job.setJarByClass(CountRows.class);

// Set up Mapper
TableMapReduceUtil.initTableMapperJob(inputTable, scan, 
    CountRows.MyMapper.class, ImmutableBytesWritable.class,  
    ImmutableBytesWritable.class, job);  

// Set up Reducer
job.setReducerClass(CountRows.MyReducer.class);
job.setNumReduceTasks(16);

// Setup Overall Output
job.setOutputFormatClass(MultiTableOutputFormat.class);

job.submit();

これをEclipseから直接実行すると、ジョブは起動されますが、Hadoopはマッパー/リデューサーを見つけることができません。次のエラーが発生します。

12/06/27 23:23:29 INFO mapred.JobClient:  map 0% reduce 0%  
12/06/27 23:23:37 INFO mapred.JobClient: Task Id :   attempt_201206152147_0645_m_000000_0, Status : FAILED  
java.lang.RuntimeException: java.lang.ClassNotFoundException:   com.mypkg.mapreduce.CountRows$MyMapper  
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:996)  
    at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:212)  
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:602)  
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:323)   
    at org.apache.hadoop.mapred.Child$4.run(Child.java:270)  
    at java.security.AccessController.doPrivileged(Native Method)  
    at javax.security.auth.Subject.doAs(Subject.java:396)  
    at   org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127)  
    at org.apache.hadoop.mapred.Child.main(Child.java:264)  
...

誰かがこれらのエラーを乗り越える方法を知っていますか?これを修正できれば、より多くのMRジョブをスクリプトに統合できます。

4

3 に答える 3

8

ジョブのクラスを定義する Eclipse プロジェクト内から Hadoop ジョブを送信している場合は、おそらくクラスパスに問題があります。

呼び出しは、job.setjarByClass(CountRows.class)CountRows.jar (まだビルドされている場合とされていない場合、またはクラスパス上にある場合もあります) ではなく、ビルド クラスパスでクラス ファイルを検索しています。

job.getJar()を呼び出した後の結果を出力することで、これが真であると断言できるはずjob.setjarByClass(..)です.jarファイルパスが表示されない場合は、jar'dクラスではなくビルドクラスが見つかりました

于 2012-06-28T16:19:29.170 に答える
1

次の Web サイトのこの方法を使用して、私の Map/Reduce プロジェクトを構成し、Eclipse を使用してプロジェクトを実行しました (プロジェクトを JAR としてエクスポートすることはありません) Hadoop Map/Reduce プロジェクトを実行するように Eclipse を構成する

注: プログラムをデバッグすることにした場合、MapperクラスとReducerクラスはデバッグできなくなります。

それが役に立てば幸い。:)

于 2012-09-18T04:57:49.937 に答える