找不到Mapper类

时间:2013-06-14 08:32:16

标签: hadoop mapreduce classnotfoundexception

有时我的MR工作抱怨MyMapper类没有找到。 而且我必须给job.setJarByClass(MyMapper.class);告诉它从我的jar文件中加载它。

cloudera @cloudera-vm:/ tmp / translator $ hadoop jar MapReduceJobs.jar translator / input / Portuguese.txt translator / output 13/06/13 03:36:57 WARN mapred.JobClient:没有工作jar文件集。可能找不到用户类。请参阅JobConf(Class)或JobConf#setJar(String)。 13/06/13 03:36:57 INFO input.FileInputFormat:要处理的总输入路径:1 13/06/13 03:36:57 INFO mapred.JobClient:正在运行的职位:job_201305100422_0043 13/06/13 03:36:58 INFO mapred.JobClient:地图0%减少0% 13/06/13 03:37:03 INFO mapred.JobClient:任务ID:attempt_201305100422_0043_m_000000_0,状态:未通过 java.lang.RuntimeException:java.lang.ClassNotFoundException:com.mapreduce.variousformats.keyvaluetextinputformat.MyMapper     在org.apache.hadoop.conf.Configuration.getClass(Configuration.java:996)     at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:212)     在org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:601)

问题:为什么会这样。为什么不总是告诉我从我的jar文件中加载它。 是否有一些解决这类问题的最佳实践。此外,如果我使用的是第三方图书馆,我也必须为他们这样做。

2 个答案:

答案 0 :(得分:6)

请务必在提交作业后向HADOOP_CLASSPATH-libjars添加任何依赖项,如以下示例所示:

使用以下命令添加(例如)current和lib目录中的所有jar依赖项:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:`echo *.jar`:`echo lib/*.jar | sed 's/ /:/g'`

请记住,通过hadoop jar开始工作时,您还需要使用-libjars将任何依赖项的jar传递给它。我喜欢用:

hadoop jar <jar> <class> -libjars `echo ./lib/*.jar | sed 's/ /,/g'` [args...]

注意: sed命令需要不同的分隔符; HADOOP_CLASSPATH:分开且-libjars需要,分开。

答案 1 :(得分:5)

是的,job.setJarByClass是必要的。所以hadoop会将你的jar复制到任务跟踪器。如果你没有调用job.setJarByClass,hadoop会认为你的jar在任务跟踪器的类路径中,所以它不会复制你的jar。