客户端提交作业时发生的一个常见错误
2011-12-25 18:34
369 查看
很多朋友在刚开始学习Hadoop的时候,都会以类似于下面的一个例子来开始自己的hadoop学习之旅:
public class MyHadoopCounter {
public static class MyHadoopMapper extends Mapper<LongWritable, Text, Text, Text> {
@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
类的静态代码中加入了
另外,在JobConf类的静态代码中也加入了
也就是说,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中配置
<property>
<name>maprd.jar</name>
<value>MyHadoopCounter所在jar包的绝对路径</value>
</property>
public class MyHadoopCounter {
public static class MyHadoopMapper extends Mapper<LongWritable, Text, Text, Text> {
@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
类的静态代码中加入了
另外,在JobConf类的静态代码中也加入了
也就是说,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中配置
<property>
<name>maprd.jar</name>
<value>MyHadoopCounter所在jar包的绝对路径</value>
</property>
相关文章推荐
- hadoop客户端提交作业错误:java.lang.RuntimeException: java.lang.ClassNotFoundException: Job$Mappe
- cocos2d-x 不能debug时 发生了一个错误。
- c语言中两种常见代码编写错误,“写入位置 0x00000000 时发生访问冲突”和“语法错误 : 缺少“;”(在“{”的前面)”
- 一个常见的错误
- Maven for Myeclipse的一个常见错误 Project configuration is not up-to-date with pom.xml
- OBJC中声明字符串常量的一个常见错误
- ASP.NET MVC4(ASPX)通过文本编辑器提交报从客户端中检测到有潜在危险的 Request.Form 值的错误
- UITableView 的一个常见错误'unable to dequeue a cell with identifier Cell - must register a nib or a class f
- 发生了一个 Oracle 错误,但无法从 Oracle 中检索错误信息"----解决方法
- 发生了一个Oracle错误,但无法从Oracle中检索错误信息的处理
- MMC检测到此管理单元发生一个错误,建议你关闭并重新启动MMC
- Android Studio上使用git 提交项目到远程仓库发生错误解决方案
- Java执行一个SQL查询未提交,遇到1205错误。
- mysql安装常见问题(系统找不到指定的文件、发生系统错误 1067 进程意外终止)
- svn提交、更新常见错误
- 一个以前用的提交hadoop作业的shell脚本
- 页面提交和显示发布内容发生的错误
- Flink运行时之客户端提交作业图-上
- 连接共享文件夹时报错:发生系统错误 1219:不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接
- eclipse没有找到添加到 项目目录下的 jar 包(新手可能发生的一个错误)