我按照此链接设置 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)头节点获取了上面链接中提到的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主机的文件夹/usr/lib/hdinsight-datalake中(我们集群中只有1台主机)。 putHDFS 配置(图片)如附件所示(与上面的链接完全相同)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$1.run(AbstractHadoopProcessor.java:322) at org.apache.nifi.processors.hadoop.AbstractHadoopProcessor$1.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 类来自上面的 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 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文件或其他包含Configuration类但没有方法reloadExistingConfigurations()的文件。我们也没有将任何自定义的 Nar 文件部署到 Nifi,一切都几乎是 Nifi 上 HDF 3.1 的默认设置。
请指教。我已经花了一整天的时间来解决这个问题,但无法解决问题。感谢您的帮助。
最佳答案
我认为您使用的 Azure JAR 需要比 NiFi 使用的 2.7.3 版本更新的 hadoop-common 版本。
如果你查看 2.7.3 中的 Configuration 类,就会发现没有“reloadExistingConfiguration”方法:
它似乎是在 2.8.x 期间引入的:
关于azure - Nifi java.lang.NoSuchMethodError : org. apache.hadoop.conf.Configuration.reloadExistingConfigurations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49059136/