找不到Mapper类

S K*_* Kr 3 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:map 0%reduce 0%13/06/13 03:37:03 INFO mapred.JobClient:Task Id:attempt_201305100422_0043_m_000000_0,Status:FAILED java.lang.RuntimeException:java.lang.ClassNotFoundException:com.mapreduce .variousformats.keyvaluetextinputformat.MyMapper at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:996)org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:

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

Que*_*atl 6

务必将依赖同时添加到HADOOP_CLASSPATH-libjars提交后想在下面的示例工作:

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

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:`echo *.jar`:`echo lib/*.jar | sed 's/ /:/g'`
Run Code Online (Sandbox Code Playgroud)

请记住,在开始工作时,hadoop jar您还需要通过使用传递任何依赖的罐子-libjars.我喜欢用:

hadoop jar <jar> <class> -libjars `echo ./lib/*.jar | sed 's/ /,/g'` [args...]
Run Code Online (Sandbox Code Playgroud)

注:sed命令需要不同的分隔符; 将HADOOP_CLASSPATH:分离,-libjars将需要,分开.


zsx*_*ing 5

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