如何跟踪 NiFi 中的 HDFS Active Namenode 更改事件?

How to track HDFS Active Namenode change event in NiFi?

我有 HDFS 集群,其中包含 Active 和 Stanby Namenodes。 有时当集群重新启动时,Namenodes 交换它们的角色 - Standby 变为 Active,反之亦然。

然后我让 NiFi 流和 PutParquet 处理器将一些文件写入这个 HDFS 集群。 处理器配置目录 属性 为 "hdfs://${namenode}/some/path",其中 ${namenode} 变量值类似于 "first.namenode.host.com:8020".

现在,当集群重新启动并且实际的 Namenode 更改为 "second.namenode.host.com:8020" 时,NiFi 中的配置没有更新,处理器仍然尝试使用旧的 namenode 地址,因此抛出一些异常(我不记住实际的错误文本,但我认为这对我的问题无关紧要)。

现在的问题是:如何在 NiFi 中跟踪此事件,以便在 HDFS 配置更改时自动更新 PutParqet 处理器配置?

NiFi版本为1.6.0,HDFS版本为2.6.0-cdh5.8.3

您可以做两件事:

  • 如果你知道两个名称节点的 IP 地址或主机名,你可以试试这个:连接失败关系 PutParquet 并将其连接到 UpdateAttribute 并更改目录值,如果您正在为 Directory 属性 或另一个 PutParquet 处理器使用 NiFi 表达式,其目录值配置了备用名称节点。
  • 您可以使用 PutHDFS,但我不确定 PutParquet 是否提供比 PutHDFS 更好的性能

我还没有证实这一点,但我认为对于 HA HDFS(活动和备用 NN),您会在 *-site.xml 文件中设置 HA 属性(可能是 core-site.xml) 并引用 "cluster name",Hadoop 客户端随后将其解析为 NameNode 列表,然后尝试连接到该列表。如果是这种情况,请尝试使用集群名称(请参阅集群上的 core-site.xml 文件)而不是硬编码的 NN 地址。

看来我的问题已经解决了。但这根本不是 "problem" :) 这是解决方案:

我不必在 NiFi 中手动跟踪更改活动名称节点的事件,相反,我只需要使用 core-site.xml 正确配置我的 Hadoop 客户端以强制它自动获取实际的名称节点。

所以解决方案就是将core-site.xml中的属性"fs.defaultFS"设置为hdfs-[=30中的属性"dfs.nameservices"的值=](在我的例子中 "fs.defaultFS" in core-site.xml 指向活动名称节点的实际主机 - "first.namenode.host.com:8020")。

我说 "seems" 因为我还没有测试过这个解决方案。但是使用这种方法,我可以写入 HDFS 集群,而无需在 NiFi 的任何地方设置活动 hanemode 地址。我只是将它设置为使用一些 "nameservice" 而不是实际地址,所以我认为如果实际地址发生变化 - 可能这不会影响 NiFi,并且 Hadoop 客户端会处理此事件。

待会儿我去测试一下

感谢@mattyb 的想法!