我用Java编写了一个mapreduce程序,我可以将其提交给以分布式运行的远程集群。目前,我使用以下步骤提交作业:
myMRjob.jar
)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作业集成到我的脚本中,这将是非常棒的!
答案 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
类将无法调试。
希望它有所帮助。 :)