在Oozie中编辑YARN的类路径

时间:2016-06-14 18:33:04

标签: hadoop classpath amazon-dynamodb oozie fasterxml

我正试图通过Oozie开展一项hadoop工作。作业将数据上载到AWS中的DynamoDB。因此,我使用AmazonDynamoDBClient。我在reducer中得到以下异常:

2016-06-14 10:30:52,997 FATAL [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering()Z
    at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:458)
    at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:379)
    at com.amazonaws.util.json.Jackson.<clinit>(Jackson.java:32)
    at com.amazonaws.internal.config.InternalConfig.loadfrom(InternalConfig.java:233)
    at com.amazonaws.internal.config.InternalConfig.load(InternalConfig.java:251)
    at com.amazonaws.internal.config.InternalConfig$Factory.<clinit>(InternalConfig.java:308)
    at com.amazonaws.util.VersionInfoUtils.userAgent(VersionInfoUtils.java:139)
    at com.amazonaws.util.VersionInfoUtils.initializeUserAgent(VersionInfoUtils.java:134)
    at com.amazonaws.util.VersionInfoUtils.getUserAgent(VersionInfoUtils.java:95)
    at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:42)
    at com.amazonaws.PredefinedClientConfigurations.dynamoDefault(PredefinedClientConfigurations.java:38)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.<init>(AmazonDynamoDBClient.java:292)
    at com.mypackage.UploadDataToDynamoDBMR$DataUploaderReducer.setup(UploadDataToDynamoDBMR.java:396)
    at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:168)
    at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:627)
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

我使用了一个胖jar,它将所有依赖项打包并将jar复制到Oozie的lib目录。

我还在pom中使用了依赖关系管理来将fastxml jackson依赖关系引入2.4.1(AWS dynamodb SDK使用)。但是,当在reducers上执行时,某些其他版本的fastxml jackson首先出现在类路径上(或者我认为)。

我还从dynamodb和aws sdks中排除了jackson依赖。

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk-dynamodb</artifactId>
  <version>1.10.11</version>
  <exclusions>
    <exclusion>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>*</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk-core</artifactId>
  <version>1.10.11</version>
  <exclusions>
    <exclusion>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>*</artifactId>
    </exclusion>
  </exclusions>
</dependency>

如何确保我的jar是mappers和redurs中类路径中的第一个?我在this page上尝试了这个建议,并将以下属性添加到作业的配置xml中:

<property>
    <name>oozie.launcher.mapreduce.user.classpath.first</name>
    <value>true</value>
</property>

但这没有帮助。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您是否已将jar复制到lib workflow.xml旁边的lib文件夹中或者复制到sharelib?

检查您的Hadoop发行版使用的Jackson版本,并尝试在任何地方使用该版本的Jackson。此外,值得检查的是没有其他杰克逊罐子在类路径上。 从异常看起来,Hadoop试图调用一个方法:

  

com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering

这种方法是在杰克逊version 2.3中引入的,所以可能在某处就有一个更老的杰克逊版本。