作业打卡显示服务器错误什么原因,Hadoop:客户端提交作业时发生的一个常见错误...

很多朋友在刚开始学习Hadoop的时候,都会以类似于下面的一个例子来开始自己的hadoop学习之旅:

public class MyHadoopCounter {

public static class MyHadoopMapper extends Mapper {

@Override

protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

System.out.println(" ===== " + value);

context.write(new Text("Info"), value);

}

}

public static void main(String[] args) throws Exception {

Configuration conf = new Configuration();

conf.addResource("core-site.xml");

Job myJob = new Job(conf, "MyJob");

myJob.setJarByClass(MyHadoopCounter.class);

myJob.setMapperClass(MyHadoopMapper.class);

FileInputFormat.addInputPath(myJob, new Path("data"));

FileOutputFormat.setOutputPath(myJob, new Path("out1"));

System.exit(myJob.waitForCompletion(true) ? 0 : 1);

}

}

(注:这个例子是我拷贝一位网友的)

然后,系统抛出了异常:

2011-12-17 17:17:37,912 INFO org.apache.hadoop.mapred.TaskInProgress: Error from attempt_201112171704_0004_m_000000_0: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.xkq.hadoop.counter.MyHadoopCounter$MyHadoopMapper

at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:866)

at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:199)

at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:719)

at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)

at org.apache.hadoop.mapred.Child$4.run(Child.java:261)

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:1059)

at org.apache.hadoop.mapred.Child.main(Child.java:255)

Caused by: java.lang.ClassNotFoundException: com.xkq.hadoop.counter.MyHadoopCounter$MyHadoopMapper

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:819)

at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:864)

... 8 more

2011-12-17 17:17:40,921 INFO org.apache.hadoop.mapred.JobTracker: Removing task 'attempt_201112171704_0004_m_000000_0'

2011-12-17 17:17:41,122 INFO org.apache.hadoop.mapred.JobInProgress: Choosing a failed task task_201112171704_0004_m_000000

我可以肯定这个异常绝大多数初学者都遇到过,所以我想说,你们遇到这个尴尬的问题是因为你们不懂Hadoop的源码。下面我来好好分析这个问题。

首先我想先说一个这个配置文件的加载,其实这位网友的conf.addResource("core-site.xml")在Configuration conf = new Configuration()之后根本就是多此一举,因为为在Configuration类的静态代码中加入了

120219115163131.gif

另外,在JobConf类的静态代码中也加入了

120219115163132.gif

也就是说,Job的配置文件已经会默认包含core-default.xml、core-site.xml、mapred-default.xml、mapred-site.xml,这里还要特别注意的是,如果你不想要这些默认的配置文件,当你创建时应该这样

//false表示忽略默认的配置文件,true表示加载默认的配置文件,默认情况下是true

Configuration conf = new Configuration(false);

好,现在就来看看出现上面异常的原因,这个问题主要出在myJob.setJarByClass(MyHadoopCounter.class)这条语句的本质是想获取MyHadoopCounter所在的jar包绝对路径,然后把这个绝对路径配置到作业的maprd.jar项,如果当前project中没有MyHadoopCounter所在的jar包的话,作业的配置文件中就没有maprd.jar项,当TaskTracker在执行该作业的任务时就找不到MyHadoopCounter类了,因此也就出现了上面的异常。

解决办法:

1.将上面的而是代码打成一个jar包,并将其引入加到当前工程中。

2.在客户端的配置文件mapred.site.xml中配置

maprd.jar

MyHadoopCounter所在jar包的绝对路径

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值