如何在 NiFi 中跟踪 HDFS Active Namenode 更改事件?
Posted
技术标签:
【中文标题】如何在 NiFi 中跟踪 HDFS Active Namenode 更改事件?【英文标题】:How to track HDFS Active Namenode change event in NiFi? 【发布时间】:2018-09-14 08:20:03 【问题描述】:我有带有 Active 和 Stanby Namenodes 的 HDFS 集群。 有时,当集群重新启动时,Namenode 会交换它们的角色 - Standby 变为 Active,反之亦然。
然后我有带有 PutParquet 处理器的 NiFi 流,将一些文件写入这个 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
【问题讨论】:
【参考方案1】:我还没有确认这一点,但我认为使用 HA HDFS(活动和备用 NN),您可以在 *-site.xml 文件(可能是 core-site.xml)中设置 HA 属性并参考到“集群名称”,然后 Hadoop 客户端将解析为 NameNode 列表,然后它将尝试连接到该列表。如果是这种情况,请尝试使用集群名称(请参阅集群上的 core-site.xml 文件)而不是硬编码的 NN 地址。
【讨论】:
【参考方案2】:你可以做的两件事:
如果你知道两个名称节点的IP地址或主机名,你可以试试这个:连接PutParquet
的失败关系,连接到UpdateAttribute
,如果你使用NiFi表达式,更改目录值用于Directory
属性或另一个PutParquet
处理器,其目录值配置为备用名称节点。
您可以使用 PutHDFS,但我不确定 PutParquet 是否提供比 PutHDFS 更好的性能
【讨论】:
PutHDFS 和 PutParquet 都具有 Directory 属性,我认为两者都期望 "hdfs://$namenode/some/path" 作为该属性的值,那么它们之间有什么区别? PutHDFS 的输出格式是什么?如何强制它写 Parquet 文件?我没有看到任何属性... 您应该能够将目录指定为“/some/path”,并且根据 core-site.xml 中为默认文件配置的任何内容,它将位于文件系统的根目录系统。我认为如果您要写入与默认文件系统不同的文件系统,则只需要 hdfs:// 前缀。【参考方案3】:看来我的问题已经解决了。但这根本不是一个“问题”:) 这里是解决方案:httpfs error Operation category READ is not supported in state standby。
我不必在 NiFi 中手动跟踪更改活动名称节点的事件,而不必这样做,我只需使用 core-site.xml 正确配置我的 Hadoop 客户端以强制它自动获取实际的名称节点。
所以解决方案只是将 core-site.xml 中的属性“fs.defaultFS”设置为 hdfs-site.xml 中的属性“dfs.nameservices”的值(在我的情况下,core-中的“fs.defaultFS” site.xml 指向活动名称节点的实际主机 - “first.namenode.host.com:8020”)。
我说“似乎”是因为我还没有测试过这个解决方案。但是使用这种方法,我可以写入 HDFS 集群,而无需在 NiFi 的任何地方设置活动的 hanemode 地址。我只是将它设置为使用一些“名称服务”而不是实际地址,所以我认为如果实际地址发生变化 - 可能这不会影响 NiFi,Hadoop 客户端会处理此事件。
稍后我会测试它。
感谢@mattyb 的建议!
【讨论】:
以上是关于如何在 NiFi 中跟踪 HDFS Active Namenode 更改事件?的主要内容,如果未能解决你的问题,请参考以下文章
将小文件存储在 hdfs 中并在 Nifi Flow 中存档