有时我的 MR 工作会抱怨找不到 MyMapper 类。
我必须给 job.setJarByClass(MyMapper.class);告诉它从我的 jar 文件加载它。
cloudera@cloudera-vm:/tmp/translator$ hadoop jar MapReduceJobs.jar 转换器/输入/Portuguese.txt 转换器/输出
13/06/13 03:36:57 警告 mapred.JobClient:未设置作业 jar 文件。可能找不到用户类别。请参阅 JobConf(Class) 或 JobConf#setJar(String)。
13/06/13 03:36:57 INFO input.FileInputFormat:要处理的总输入路径:1
13/06/13 03:36:57 信息 mapred.JobClient:正在运行的作业:job_201305100422_0043
13/06/13 03:36:58 信息 mapred.JobClient:映射 0% 减少 0%
13/06/13 03:37:03 信息 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)
在 org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:212)
在 org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:601)
问题:为什么会发生这种情况。为什么它不总是告诉我从我的 jar 文件加载它。
是否有一些解决此类问题的最佳实践?另外,如果我使用一些第三方库,我也必须为他们这样做吗?
请务必将任何依赖项添加到HADOOP_CLASSPATH
and -libjars
提交作业后,如下例所示:
使用以下命令添加(例如)当前和lib
目录:
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:`echo *.jar`:`echo lib/*.jar | sed 's/ /:/g'`
请记住,当通过以下方式开始工作时hadoop jar
您还需要通过使用将任何依赖项的 jar 传递给它-libjars
。我喜欢用:
hadoop jar <jar> <class> -libjars `echo ./lib/*.jar | sed 's/ /,/g'` [args...]
NOTE: The sed
命令需要不同的分隔符;这HADOOP_CLASSPATH
is :
分开并且-libjars
需要,
分开了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)