我有一个应用程序,它将从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,他们在评论中写道

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

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

10-16 16:53