如何跟踪 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 的想法!
我有 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 的想法!