Nifi java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations

Nifi java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations

我正在按照此 link 设置 Nifi putHDFS 以写入 Azure Data Lake。Connecting to Azure Data Lake from a NiFi dataflow

Nifi在HDF 3.1 VM中,Nifi版本为1.5。

我们从一个 HD Insight(v 3.6, 支持 hadoop 2.7) head node 中得到了上面link中提到的 jar 文件,这些 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

并将它们复制到 HDF 集群 Nifi 主机(我们集群中只有 1 台主机)的文件夹 /usr/lib/hdinsight-datalake。 putHDFS配置(图片)如附件(与上面的link完全一样)putHDFS attributes.

但是在 nifi 日志中我们得到这个:

Caused by: java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations()V at org.apache.hadoop.fs.adl.AdlConfKeys.addDeprecatedKeys(AdlConfKeys.java:112) at org.apache.hadoop.fs.adl.AdlFileSystem.(AdlFileSystem.java:92) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.apache.nifi.processors.hadoop.AbstractHadoopProcessor$ExtendedConfiguration.getClassByNameOrNull(AbstractHadoopProcessor.java:490) at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2099) at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2193) at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2654) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:172) at org.apache.nifi.processors.hadoop.AbstractHadoopProcessor.run(AbstractHadoopProcessor.java:322) at org.apache.nifi.processors.hadoop.AbstractHadoopProcessor.run(AbstractHadoopProcessor.java:319) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698) at org.apache.nifi.processors.hadoop.AbstractHadoopProcessor.getFileSystemAsUser(AbstractHadoopProcessor.java:319) at org.apache.nifi.processors.hadoop.AbstractHadoopProcessor.resetHDFSResources(AbstractHadoopProcessor.java:281) at org.apache.nifi.processors.hadoop.AbstractHadoopProcessor.abstractOnScheduled(AbstractHadoopProcessor.java:205) ... 16 common frames omitted

AdlConfKeys class 来自上面的 hadoop-azure-datalake.jar 文件。从上面的异常来看,在我看来,这个 AdlConfKeys 正在加载 org.apache.hadoop.conf.Configuration class 的旧版本,它没有 reloadExistingConfigurations 方法。然而,我们无法找出这个较旧的 class 是从哪里加载的。这个 HDF 3.1 在多个位置都有 hadoop-common-XXXX.jar,所有 2.7 版的都有 org.apache.hadoop.conf.Configuration 包含方法 reloadExistingConfigurations,只有 2.3 版没有这个方法。(我反编译 2.7 和 2.3 jar 以找出答案)

[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

所以我真的不知道 Nifi 是如何设法找到一个 hadoop-common jar 文件或其他包含配置的东西 class 没有方法 reloadExistingConfigurations()。我们也没有将任何自定义的 Nar 文件部署到 Nifi,所有内容几乎都是 Nifi 上 HDF 3.1 的默认设置。

请指教。我已经在这上面花了一整天,但无法解决问题。感谢您的帮助。

我认为您使用的 Azure JAR 需要 hadoop-common 比 NiFi 使用的 2.7.3 版本更新的版本。

如果您从 2.7.3 查看配置 class,则没有 "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