从eclipse启动mapreduce作业

时间:2012-06-27 23:46:34

标签: eclipse hadoop mapreduce

我用Java编写了一个mapreduce程序,我可以将其提交给以分布式运行的远程集群。目前,我使用以下步骤提交作业:

  1. 将mapreuce作业导出为jar(例如myMRjob.jar
  2. 使用以下shell命令将作业提交到远程群集:hadoop jar myMRjob.jar
  3. 当我尝试运行程序时,我想直接从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作业集成到我的脚本中,这将是非常棒的!

3 个答案:

答案 0 :(得分:8)

如果您从定义作业类的Eclipse项目中提交hadoop作业,那么您很可能遇到类路径问题。

job.setjarByClass(CountRows.class)调用是在构建类路径上找到类文件,而不是在CountRows.jar中找到(可能已经或者可能尚未构建,甚至在类路径上)。

你应该能够通过在调用job.getJar()之后打印出job.setjarByClass(..)的结果来断言这是真的,如果它没有显示jar文件路径,那么就找到了构建类,而不是jar'd类

答案 1 :(得分:2)

对我来说有用的是导出一个可运行的JAR(它和JAR之间的区别在于第一个定义了具有main方法的类)并选择了#34;将所需的包装到JAR"选项(选择"提取..."选项会导致重复错误,它还必须从jar中提取类文件,最终,在我的情况下,导致无法解析未找到的类除外)。

之后,你可以按照Chris White的建议设置jar。对于Windows,它看起来像这样:job.setJar("C:\\\MyJar.jar");

如果它对任何人有帮助,我就我从creating a MapReduce project and running it in Hadoop 2.2.0 in Windows 7 (in Eclipse Luna)

学到的东西做了一个演讲

答案 2 :(得分:1)

我使用以下网站中的这个方法来配置我的Map / Reduce项目以使用Eclipse运行项目(没有将项目导出为JAR) Configuring Eclipse to run Hadoop Map/Reduce project

注意:如果您决定调试程序,则Mapper类和Reducer类将无法调试。

希望它有所帮助。 :)