我已经看到许多表示使用用户类路径作为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冲突造成的。
答案 0 :(得分:5)
因此,假设您使用的是0.20.203,则会在TaskRunner.java代码中处理,如下所示:
mapreduce.user.classpath.first
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);
答案 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(真);