2017-03-02 73 views
0

我有一个简单的MapReduce程序,我想在远程集群上运行它。我可以简单地运行如何从远程集群上的本地IDE运行MapReduce程序

hadoop jar myjar.jar input output 

命令行做到这一点,但是当我想从我的IDE它调用MR工作在我的JUnit TestCase类运行的函数,我得到以下警告:

WARN org.apache.hadoop.mapreduce.JobSubmitter - No job jar file set. User classes may not be found. See Job or Job#setJar(String). 
INFO org.apache.hadoop.mapred.YARNRunner - Job jar is not present. Not adding any jar to the list of resources. 

虽然我有这条线设置,提交MR作业之前:

job.setJarByClass(MyJob.class); 

,因此,它不能找到合适的课程作业失败(如MyMapKey这是映射重点班),邻perate。

Error: java.io.IOException: Initialization of all the collectors failed. Error in last collector was :java.lang.RuntimeException: java.lang.ClassNotFoundException: Class MyMapKey not found 
at org.apache.hadoop.mapred.MapTask.createSortingCollector(MapTask.java:414) 
at org.apache.hadoop.mapred.MapTask.access$100(MapTask.java:81) 
at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:698) 
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:770) 
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) 
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:422) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1709) 
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 

对此有何看法?

+0

你确定你有一个jar文件,而不是只编译一堆'* .class's吗? – gudok

+0

我确信,作为一种替代方法,当我在我的测试函数中使用RunJar.main(...)并给出通过命令行成功提交的相同jar的位置时,我得到了相同的错误。 – Ehsan

+0

我想你正在使用MRUNIT进行测试。 您能否提供您开发的任何代码示例。 如果您使用了MRUNIT开发,那么您可以简单地将测试类作为JUnit类运行。参考:https://cwiki.apache.org/confluence/display/MRUNIT/MRUnit+Tutorial –

回答

0

首先,您应该将远程Hadoop集群配置文件(即core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml,ssl-client.xml)作为资源添加到您的Configuration目的。然后按照上述链接中的步骤查看应该如何手动将作业jar添加到远程集群上的类路径。