hadoop - 找不到映射器类

标签 hadoop mapreduce classnotfoundexception

有时我的 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 INFO mapred.JobClient:运行作业:job_201305100422_0043 13/06/13 03:36:58 INFO mapred.JobClient: map 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 文件加载它。 是否有一些最佳实践来解决这类问题。此外,如果我正在使用一些第 3 方库,我是否也必须为它们执行此操作。

最佳答案

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

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

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

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

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

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

关于hadoop - 找不到映射器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17104281/

相关文章:

hadoop - 如何查找创建了最大帖子数的用户的显示名称?

serialization - 将 JAXB 对象加载到 Apache Hive/Impala

hadoop - 修改hadoop conf目录下的xml配置文件后需要重启hadoop吗?

hadoop - 在 Hadoop 中,有没有办法查看发送到 reducer 以执行正在运行的任务的键/值对?

hadoop - WARN mapred.JobClient : No job jar file set. 可能找不到用户类

java - IntelliJ IDEA 中的 Class.forName() 异常

java - ClassNotFoundException 公理-api-1.2.7.jar

java - 运行时出现 ClassNotFoundException 但应用程序编译

eclipse - 用于Hadoop 2的Pig 0.13.0的Ant构建失败

python - 对 Docker 容器的 HTTP 调用将 IP 重定向到 Docker ID