3

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

cloudera@cloudera-vm:/tmp/translator$ hadoop jar MapReduceJobs.jar 翻译器/输入/Portuguese.txt 翻译器/输出 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 信息 mapred.JobClient:映射 0% 减少 0% 13/06/13 03:37:03 信息 mapred.JobClient:任务 ID:尝试_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:

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

4

2 回答 2

6

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

使用以下命令从(例如)当前目录和lib目录添加所有 jar 依赖项:

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

请记住,当您开始工作时,hadoop jar您还需要通过使用-libjars. 我喜欢使用:

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

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

于 2013-06-14T08:35:42.553 回答
5

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

于 2013-06-14T09:02:54.690 回答