覆盖类路径中的默认hadoop jar

jay*_*100 17 hadoop jar 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
Run Code Online (Sandbox Code Playgroud)

这些参数中的哪一个是在我的作业配置中设置的正确参数,以便强制映射器和缩减器具有hadoop_classpath在hadoop默认依赖关系罐之前放置用户定义的jar 的类路径?

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

Chr*_*ite 5

因此,假设您使用的是0.20.203,则可以在TaskRunner.java代码中进行如下处理:

  • 您要查找的物业在第94行- mapreduce.user.classpath.first
  • 在第214行进行调用以构建类路径列表,该类路径委托给称为 getClassPaths(..)
  • getClassPaths() 是在第524行上定义的,您应该能够看到配置属性用于决定您的job + dist缓存库还是hadoop库首先进入类路径

对于其他版本的hadoop,最好在所有这是一个“半隐藏配置”之后检查TaskRunner.java类以确认config属性的名称:

static final String MAPREDUCE_USER_CLASSPATH_FIRST =
        "mapreduce.user.classpath.first"; //a semi-hidden config
Run Code Online (Sandbox Code Playgroud)