我正在尝试使用 Hadoop Java 客户端,并且正在使用Consul路由到集群中的当前活动名称节点。我的集群是 cloudera 并使用 HA。当hadoop Consul更改活动名称节点时,也会立即将分辨率更改为新的活动名称节点。我想从 hadoop 集群外部连接到 HDFS。
我正在循环尝试非常简单的代码,没有任何特定的配置。
try {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", activeHdfsNameNodeBehindConsul);
FileSystem fs = FileSystem.get(conf);
Path pathToDirectory = new Path("/user/");
if (!fs.exists(pathToDirectory)) {
System.out.println("HDFS PATH EXIST");
} else{
System.out.println("HDFS PATH NOT EXIST");
}
} catch (IOException e) {
e.printStackTrace()
}
当我开始运行时,我在日志中看到名称节点已正确解析,但是当我进行手动故障转移时,我收到以下错误:
Operation category READ is not supported in state standby. Visit https://s.apache.org/sbnn-error
at org.apache.hadoop.hdfs.server.namenode.ha.StandbyState.checkOperation(StandbyState.java:88)
at org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.checkOperation(NameNode.java:1836)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkOperation(FSNamesystem.java:1433)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:4245)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:897)
at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.getFileInfo(AuthorizationProviderProxyClientProtocol.java:528)
看起来 Hadoop 客户端仍在尝试连接到以前存储的 IP,而不是已经更改为新活动名称节点的 ip。
我看到很多类似的问题,关于 HA 名称节点的一个 URI 问题,但没有任何解决方案。现在我有了解决方案,但需要知道如何清理 hadoop 客户端的 IP 缓存。
有人知道如何禁用 HDFS 客户端的内部缓存 IP 解析,以便每次调用都会查找活动名称节点的 IP?