Нифи java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations

Я перехожу по этой ссылке, чтобы настроить Nifi putHDFS для записи в Azure Data Lake. nifi-dataflow.html" rel="nofollow noreferrer">Подключение к Azure Data Lake из потока данных NiFi

Nifi находится в виртуальной машине HDF 3.1, а версия Nifi — 1.5.

Мы получили файлы jar, упомянутые в приведенной выше ссылке, из головного узла HD Insight (v 3.6, который поддерживает Hadoop 2.7), эти jar-файлы:

adls2-oauth2-token-provider-1.0.jar

azure-data-lake-store-sdk-2.1.4.jar

hadoop-azure-datalake.jar

jackson-core-2.2.3.jar

okhttp-2.4.0.jar

okio-1.4.0.jar

И копируются в папку /usr/lib/hdinsight-datalake хоста HDF кластера Nifi (у нас в кластере всего 1 хост). И конфигурация putHDFS (изображение) прикреплена (точно так же, как ссылка выше) атрибуты putHDFS.

Но в журнале нифи мы получаем это:

Вызвано: java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations()V в org.apache.hadoop.fs.adl.AdlConfKeys.addDeprecatedKeys(AdlConfKeys.java:112) в org.apache.hadoop .fs.adl.AdlFileSystem.(AdlFileSystem.java:92) в java.lang.Class.forName0(собственный метод) в java.lang.Class.forName(Class.java:348) в org.apache.nifi.processors. hadoop.AbstractHadoopProcessor$ExtendedConfiguration.getClassByNameOrNull(AbstractHadoopProcessor.java:490) в org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2099) в org.apache.hadoop.conf.Configuration.getClass(Configuration.java: 2193) в org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2654) в org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667) в org.apache.hadoop.fs.FileSystem .get(FileSystem.java:370) в org.apache.hadoop.fs.FileSystem.get(FileSystem.java:172) в org.apache.nifi.processors.hadoop.AbstractHadoopProcessor$1.run(AbstractHadoopProcessor.java:3 22) в org.apache.nifi.processors.hadoop.AbstractHadoopProcessor$1.run(AbstractHadoopProcessor.java:319) в java.security.AccessController.doPrivileged(собственный метод) в javax.security.auth.Subject.doAs(Subject.java :422) в org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698) в org.apache.nifi.processors.hadoop.AbstractHadoopProcessor.getFileSystemAsUser(AbstractHadoopProcessor.java:319) в org.apache.nifi. процессоры.hadoop.AbstractHadoopProcessor.resetHDFSResources(AbstractHadoopProcessor.java:281) в org.apache.nifi.processors.hadoop.AbstractHadoopProcessor.abstractOnScheduled(AbstractHadoopProcessor.java:205) ... 16 общих кадров пропущены

Класс AdlConfKeys взят из приведенного выше файла hadoop-azure-datalake.jar. Из приведенного выше исключения мне кажется, что AdlConfKeys загружает более старую версию класса org.apache.hadoop.conf.Configuration, в котором нет метода reloadExistingConfigurations. Однако мы не можем узнать, откуда загружается этот старый класс. Этот HDF 3.1 имеет hadoop-common-XXXX.jar в нескольких местах, все те, что в версии 2.7, имеют org.apache.hadoop.conf.Configuration, содержащий метод reloadExistingConfigurations, только те, что в версии 2.3, не имеют этого метода. (Я декомпилировал банки 2.7 и 2.3, чтобы узнать)

[root@NifiHost /]# find . -name *hadoop-common*

(вывод намного больше, чем показано ниже, однако я удалил некоторые из них для наглядности, большинство из них в версии 2.7, только 2 из них в версии 2.3):

./var/lib/nifi/work/nar/extensions/nifi-hadoop-libraries-nar-1.5.0.3.1.0.0-564.nar-unpacked/META-INF/bundled-dependencies/hadoop-common-2.7.3.jar

./var/lib/ambari-agent/cred/lib/hadoop-common-2.7.3.jar

./var/lib/ambari-server/resources.backup/views/work/WORKFLOW_MANAGER{1.0.0}/WEB-INF/lib/hadoop-common-2.7.3.2.6.2.0-205.jar

./var/lib/ambari-server/resources.backup/views/work/HUETOAMBARI_MIGRATION{1.0.0}/WEB-INF/lib/hadoop-common-2.3.0.jar

./var/lib/ambari-server/resources/views/work/HUETOAMBARI_MIGRATION{1.0.0}/WEB-INF/lib/hadoop-common-2.3.0.jar

./var/lib/ambari-server/resources/views/work/HIVE{1.5.0}/WEB-INF/lib/hadoop-common-2.7.3.2.6.4.0-91.jar

./var/lib/ambari-server/resources/views/work/CAPACITY-SCHEDULER{1.0.0}/WEB-INF/lib/hadoop-common-2.7.3.2.6.4.0-91.jar

./var/lib/ambari-server/resources/views/work/TEZ{0.7.0.2.6.2.0-205}/WEB-INF/lib/hadoop-common-2.7.3.2.6.2.0-205.jar

./usr/lib/ambari-server/hadoop-common-2.7.2.jar

./usr/hdf/3.1.0.0-564/nifi/ext/ranger/install/lib/hadoop-common-2.7.3.jar

./usr/hdf/3.0.2.0-76/nifi/ext/ranger/install/lib/hadoop-common-2.7.3.jar

Поэтому я действительно не знаю, как Нифи удалось найти общий файл jar для хаупа или что-то еще, содержащее класс конфигурации, не имеющий метода reloadExistingConfigurations(). У нас также нет никаких настраиваемых файлов Nar, развернутых в Nifi, все в значительной степени по умолчанию из того, что есть в HDF 3.1 на Nifi.

Пожалуйста, порекомендуйте. Я потратил целый день на это, но не могу решить проблему. Ценю твою помощь.


person user3096482    schedule 01.03.2018    source источник


Ответы (1)


Я думаю, что для Azure JAR, которые вы используете, требуется более новая версия hadoop-common, чем версия 2.7.3, которую использует NiFi.

Если вы посмотрите на класс конфигурации из 2.7.3, там нет метода «reloadExistingConfiguration»:

https://github.com/apache/hadoop/blob/release-2.7.3-RC2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java

Кажется, он был представлен где-то в 2.8.x:

https://github.com/apache/hadoop/blob/release-2.8.3-RC0/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java

person Bryan Bende    schedule 02.03.2018
comment
Брайан ценю ваш быстрый ответ! Ты прав. Причина, по которой я столкнулся с этим, заключается в том, что я случайно скопировал jar-файл hadoop-common версии 3.0 (и открыл/декомпилировал, чтобы найти, что он содержит этот метод) и подумал, что это версия 2.7, которую я получил из HDF! Позвольте мне попробовать включить версию 2.8 в наш список jar и посмотреть, что произойдет. Будет обновляться. - person user3096482; 02.03.2018
comment
Без проблем. Это будет сложно, потому что процессоры NiFi включают 2.7.3, поэтому даже если вы поместите 2.8.x в свой каталог, скорее всего, не будет определено, из какого JAR он найдет класс конфигурации. В конечном итоге вам может понадобиться создать свою собственную версию NAR NiFi Hadoop, установив для hadoop.version в корневом каталоге NiFI значение 2.8.3, но я понятия не имею, создает ли это какие-либо другие проблемы. - person Bryan Bende; 02.03.2018
comment
Еще раз спасибо Брайан за дальнейшее объяснение! Да, я попытал счастья, зная, что это может не сработать... добавив hadoop-common-3.0.jar в папку nifi lib/bootstrap, это не сработало; затем попробуйте объединить эту банку с файлами jar Azure, тоже не сработало. Я предполагаю, что это связано с тем, как Nifi загружает классы, он попросит загрузчик родительского класса сначала найти класс, что в этом случае родительский класс предоставит более старую версию класса конфигурации, которая есть в его пути загрузки класса. ... - person user3096482; 02.03.2018