覆盖类路径中的默认hadoop jar

时间:2012-07-27 10:24:51

标签: jar hadoop classpath operator-precedence

我已经看到许多表示使用用户类路径作为hadoop的先例的方法。通常情况下,如果m / r作业需要一个特定版本的库,其中hadoop巧合地已经使用旧版本(例如jackson的json解析器或公共http等等),那么这就完成了。

无论如何:我见过:

mapreduce.task.classpath.user.precedence
mapreduce.task.classpath.first
mapreduce.job.user.classpath.first

这些参数中的哪一个是 right 在我的作业配置中设置的参数,以便强制mappers和reducer拥有一个类路径,该路径将我的用户定义为hadoop_classpath罐子hadoop默认依赖jars?

顺便说一下,这与这个问题有关: 我最近发现的Dynamodb requestHandler acception是由于jar冲突造成的。

5 个答案:

答案 0 :(得分:5)

因此,假设您使用的是0.20.203,则会在TaskRunner.java代码中处理,如下所示:

  • 您正在寻找的酒店位于第94行 - mapreduce.user.classpath.first
  • 第214行是调用它来构建类路径列表的地方,该列表委托给名为getClassPaths(..)的方法
  • getClassPaths()在第524行定义,您应该能够看到配置属性用于决定您的作业+ dist缓存库,或者hadoop库是否首先进入类路径

对于hadoop的其他版本,最好检查TaskRunner.java类,确认配置属性的名称,所有这些都是“半隐藏配置”

static final String MAPREDUCE_USER_CLASSPATH_FIRST =
        "mapreduce.user.classpath.first"; //a semi-hidden config

答案 1 :(得分:3)

与最新的Hadoop版本(2.2+)一样,您应该设置:

    conf.setBoolean(MRJobConfig.MAPREDUCE_JOB_USER_CLASSPATH_FIRST, true);

答案 2 :(得分:3)

这些设置仅用于在mapper或reducer任务中引用外部jar类。但是,如果您正在使用这些,例如自定义的InputFormat,则无法加载该类。确保在任何地方(在MR2中)都能正常工作的方法是在提交作业时导出此设置:

export HADOOP_USER_CLASSPATH_FIRST=true

答案 3 :(得分:1)

我有同样的问题,在Hadoop版本0.20.2-cdhu03上为我工作的参数是“mapreduce.task.classpath.user.precedence”

此设置在CDH3U3上测试不起作用,以下答案来自Cloudera团队:

// JobConf job = new JobConf(getConf(), MyJob.class);
// job.setUserClassesTakesPrecedence(true);

http://archive.cloudera.com/cdh/3/hadoop/api/org/apache/hadoop/mapred/JobConf.html#setUserClassesTakesPrecedence%28boolean%29

答案 4 :(得分:0)

在MapR发行版中,属性为“mapreduce.task.classpath.user.precedence”
http://www.mapr.com/doc/display/MapR/mapred-site.xml

<property>
    <name>mapreduce.task.classpath.user.precedence</name>
    <value>true</value>
    <description>Set to true if user wants to set different classpath. (AVRO) </description>
</property>

jobConf.setUserClassesTakesPrecedence(真);