Изменить путь к классам YARN в Oozie

Я пытаюсь запустить работу Hadoop через Oozie. Задание загружает данные в DynamoDB в AWS. Поэтому я использую AmazonDynamoDBClient. Я получаю следующее исключение в редьюсерах:

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)

Я использовал толстую банку, которая упаковывает все зависимости, и скопировал банку в каталог Oozie lib.

Я также использовал управление зависимостями в pom, чтобы привязать зависимость fastxml jackson к 2.4.1 (которая используется AWS dynamodb SDK). Однако, когда выполнение происходит на редукторах, каким-то образом другая версия fastxml jackson появляется первой в пути к классам (по крайней мере, я так думаю).

Я также исключил зависимость jackson от Dynamodb и aws sdks.

<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>

Как я могу убедиться, что моя банка является первой в пути к классам в мапперах и редюсерах? Я попробовал предложение на эту страницу и добавил следующее свойство в XML-файл конфигурации задания:

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

Но это не помогло.

Какие-либо предложения?


person Nik    schedule 14.06.2016    source источник


Ответы (1)


Вы скопировали свою банку в папку lib рядом с lib workflow.xml или в sharelib?

Проверьте, какую версию Jackson использует ваш дистрибутив Hadoop, и попробуйте везде использовать эту версию Jackson. Кроме того, возможно, стоит проверить, что в пути к классам нет других jar-файлов Jackson. Из исключения видно, что Hadoop пытается вызвать метод:

com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering

Этот метод был представлен в Jackson версия 2.3, так что, вероятно, где-то там есть еще более старая версия Джексона.

person gezapeti    schedule 15.06.2016
comment
Да, банка находится в /lib. Узи может правильно начать работу. Проблема возникает при доступе к AmazonDynamoDBClient. Внутри используется библиотека Джексона, которая вызывает этот метод requiresPropertyOrdering. Я посмотрю, может ли помочь версия Джексона дистрибутива Hadoop. - person Nik; 15.06.2016
comment
На самом деле, просто чтобы быть уверенным, я также скопировал банку Джексона в /lib. Тем не менее это не помогло. Похоже, что jar-файлы в /lib не ставятся первыми в пути к классам на узлах картографа и редуктора. - person Nik; 15.06.2016
comment
Подтвержденный. Сработало изменение версии jackson в pom на версию, используемую дистрибутивом hadoop. - person Nik; 15.06.2016