我有hdfs集群和活动和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
3条答案
按热度按时间ycggw6v21#
你可以做两件事:
如果您知道这两个名称节点的ip地址或主机名,您可以尝试这样做:connect the failure relationship of
PutParquet
并将其连接到UpdateAttribute
如果使用nifi表达式Directory
财产或其他PutParquet
使用备用名称节点配置目录值的处理器。您可以使用puthdfs,但我不确定puthdfs是否比puthdfs提供更好的性能
qaxu7uf22#
我还没有证实这一点,但我认为使用ha hdfs(active和standby nns),您应该在*-site.xml文件(可能是core site.xml)中设置ha属性,并引用“集群名称”,然后hadoop客户端将其解析为namenodes列表,然后尝试连接到该列表。如果是这样,请尝试使用集群名称(请参阅集群上的core-site.xml文件),而不是硬编码的nn地址。
9rygscc13#
看来我已经解决了我的问题。但这根本不是一个“问题:)下面是解决方案:httpfs error operation category read在state standby中不受支持。
我不必跟踪nifi中手动更改活动namenode的事件,相反,我只需使用core-site.xml正确配置hadoop客户机,强制它自动获取实际namenode。
因此,解决方案只是将core-site.xml中的属性“fs.defaultfs”设置为hdfs-site.xml中的属性“dfs.nameservices”的值(在我的示例中,core-site.xml中的“fs.defaultfs”指向活动namenode的实际主机-“first.namenode.host”)。com:8020").
我说“似乎”是因为我还没有测试这个解决方案。但是使用这种方法,我可以写入hdfs集群,而不必在nifi的任何地方设置活动hanemode地址。我只是将其设置为使用一些“nameservice”,而不是实际地址,所以我认为如果实际地址发生更改-可能这不会影响nifi,hadoop客户机会处理此事件。
稍后我将测试它。
感谢@mattyb的创意!