【问题标题】:Mapper class not found未找到映射器类
【发布时间】:2013-06-10 20:30:41
【问题描述】:

有时我的 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 信息 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:212) 在 org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:601)

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

【问题讨论】:

    标签: hadoop mapreduce classnotfoundexception


    【解决方案1】:

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

    使用以下命令从(例如)当前目录和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 需要是 , 分隔的。

    【讨论】:

    • 很抱歉,我没有机器访问权限来执行“hadoop jar -libjars `echo ./lib/*.jar |”如果我将所有外部 jar 捆绑在我的 jar 文件中,我仍然可以使用 job.setJarByClass 还是 hadoop 会负责加载它。
    【解决方案2】:

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

    【讨论】:

    • 同意,但为什么会这样。有时我什至不需要使用 job.setJarByClass。我很想知道它有时是如何自动知道它必须从 jar 文件中加载该类的。
    • 据我所知,它在单节点集群上没有setJarByClass也可以工作,如果你有多个节点,你应该调用这个方法。
    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    相关资源
    最近更新 更多