如何在NiFi中跟踪HDFS活动名称节点更改事件?



我有HDFS集群,带有Active和Stanby Namenodes。 有时,当集群重新启动时,Namenode 会交换其角色 - 备用变为活动,反之亦然。

然后我有 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

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

你可以做的两件事:

  • 如果您知道两个名称节点的 IP 地址或主机名,则可以尝试以下操作:连接PutParquet的故障关系并将其连接到任一UpdateAttribute,如果对属性或其他PutParquet处理器使用 NiFi 表达式Directory并使用备用名称节点配置的目录值,则更改目录值。
  • 你可以使用PutHDFS
  • ,但我不确定PutParquet是否比PutHDFS提供更好的性能。

看来我已经解决了我的问题。但这根本不是"问题":)这是解决方案:httpfs 错误 状态待机不支持操作类别读取。

我不必在NiFi中手动跟踪更改活动名称节点的事件,取而代之的是,我只需要使用核心站点正确配置我的Hadoop客户端.xml以强制它自动获取实际的名称节点。

因此,解决方案只是将核心站点中的属性"fs.defaultFS"设置为hdfs-site中的属性"fs.defaultFS".xml.xml(在我的例子中,核心站点中的"fs.defaultFS".xml指向活动名称节点的实际主机 - "first.namenode.host.com:8020"(。

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

稍后我将对其进行测试。

感谢@mattyb的想法!

最新更新