在类路径中重写默认hadoop JAR
我已经看到了许多使用用户类路径作为hadoop路径的先例的方法。如果m/r作业需要特定版本的库,而hadoop恰好已经使用了旧版本的库(例如jackson的json解析器或commons http等),则通常会执行此操作 无论如何,我看到:在类路径中重写默认hadoop JAR,jar,hadoop,classpath,operator-precedence,Jar,Hadoop,Classpath,Operator Precedence,我已经看到了许多使用用户类路径作为hadoop路径的先例的方法。如果m/r作业需要特定版本的库,而hadoop恰好已经使用了旧版本的库(例如jackson的json解析器或commons http等),则通常会执行此操作 无论如何,我看到: mapreduce.task.classpath.user.precedence mapreduce.task.classpath.first mapreduce.job.user.classpath.first 在我的作业配置中设置哪一个参数是正确的,以
mapreduce.task.classpath.user.precedence
mapreduce.task.classpath.first
mapreduce.job.user.classpath.first
在我的作业配置中设置哪一个参数是正确的,以便强制映射器和还原器具有将我的用户定义的hadoop\u类路径
jars置于hadoop默认依赖项jars之前的类路径
顺便说一下,这与这个问题有关:
我最近发现这是由于jar冲突造成的 因此,假设您使用的是0.20.203,代码中的处理如下:
- 您要查找的属性位于第94行-
mapreduce.user.classpath.first
- 第214行是调用来构建类路径列表的地方,它将委托给一个名为
getclasspath(…)
是在第524行定义的,您应该能够看到configuration属性用于决定您的job+dist缓存库还是hadoop库首先位于类路径上getClassPaths()
我也有同样的问题,在Hadoop版本0.20.2-cdhu03上对我有效的参数是“mapreduce.task.classpath.user.priority” 此设置经测试不适用于CDH3U3,以下答案来自Cloudera团队:
// JobConf job = new JobConf(getConf(), MyJob.class);
// job.setUserClassesTakesPrecedence(true);
在MapR发行版中,属性是“mapreduce.task.classpath.user.preference”
mapreduce.task.classpath.user.priority
真的
如果用户想要设置不同的类路径,则设置为true。(阿夫罗)
jobConf.setUserClassEstakesPreference(true) 与最新的Hadoop版本(2.2+)一样,您应该设置:
conf.setBoolean(MRJobConfig.MAPREDUCE_JOB_USER_CLASSPATH_FIRST, true);
这些设置仅用于在映射器或reducer任务中引用外部JAR类。但是,如果您以自定义的InputFormat等格式使用这些文件,则无法加载该类。在提交作业时导出此设置是确保此设置在任何地方都有效(在MR2中):
export HADOOP_USER_CLASSPATH_FIRST=true
你正在使用/瞄准哪个版本/发行版的hadoop?嗯。。。理想情况下,我想知道这个参数是如何从一个版本更改到另一个版本的,如果它。。。但我相信我们目前的版本是2.0.232.0.23,我猜你的意思是0.20.203?试试:conf.setBoolean(MRJobConfig.MAPREDUCE\u JOB\u USER\u CLASSPATH\u FIRST,true);不幸的是,这个功能不存在于…@Chris,有趣的答案。但为什么这是隐藏的(或半隐藏的)?有什么想法吗?
conf.setBoolean(MRJobConfig.MAPREDUCE_JOB_USER_CLASSPATH_FIRST, true);
export HADOOP_USER_CLASSPATH_FIRST=true