java - 使用rpc连接时获取hdfs namenode的状态?

标签 java hadoop hdfs

我有一个应用程序,它将从namenode获取文件的块位置。我找到了一种通过RPC api连接到namenode的方法,如下所示。

private ClientProtocol namenode;
...
public ClientProtocol connectProxy(InetSocketAddress addr, Configuration conf)
    throws IOException {

    URI nameNodeUri = NameNode.getUri(addr);
    return NameNodeProxies.createProxy(conf, nameNodeUri,
            ClientProtocol.class, new AtomicBoolean(false)).getProxy();
}
通过手动传递名称节点(主机,端口)的InetSocketAddress,我可以成功连接到名称节点并调用getBlockLocations()方法。
这是问题所在,在启用HA的环境中,我需要检查namenode是否处于 Activity 状态,如果不处于 Activity 状态,则需要连接到另一个节点,否则该方法将抛出RemoteException,其内容类似于Operation XXX is not supported in state standby我发现在org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer中存在一种方法getServiceStatus(),但是当我强制转换((NamenodeProtocols) namenode)时抛出以下异常
java.lang.ClassCastException: com.sun.proxy.$Proxy10 cannot be cast to org.apache.hadoop.hdfs.server.protocol.NamenodeProtocols
我被困在这里。有人可以帮忙吗?谢谢。

最佳答案

尽管这不是对这个问题的直接回答,但我找到了解决问题的方法。
对于org.apache.hadoop.hdfs.NameNodeProxies.createProxy,他们在评论中写道

@param nameNodeUri the URI pointing either to a specific NameNode or to a logical nameservice.


在我传递名称节点的特定ip:port作为此参数之前。只要将其更改为hdfs://<mynameservice>,它就会自动连接到 Activity 的,然后一切正常。
缺点是我不知道我要连接到哪个名称节点,将来我可能仍需要一种方法来监视名称节点的状态。
任何附加的评论或建议,将不胜感激。

关于java - 使用rpc连接时获取hdfs namenode的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63804157/

相关文章:

java - Spring JPA 保存 transient 实体

java - 将输入字符串日期时间从不同时区转换为 UTC

Java 匹配单个单词,可以用空格分隔,也可以不用空格分隔

hadoop - 什么会导致 hadoop kill reducer 任务重试

hadoop - 为什么没有 'hadoop fs -head' shell 命令?

csv - 将 CSV 文件读取到 Spark 时出现问题

java - 从java控制台隐藏信息

hadoop - 无法从 apache pig 中的 map 中提取值

postgresql - Pig oozie工作流程不执行UDF

hadoop - 如何使用 BDM(Informatica) 将文件从本地文件系统复制到 hdfs 文件系统?