首页 > 解决方案 > 使用 rpc 连接时获取 hdfs namenode 的状态?

问题描述

我有一个应用程序,它将从 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();
}

通过手动传递namenode的(host,port)的InetSocketAddress,我可以成功连接到namenode并调用该getBlockLocations()方法。这就是问题所在,在启用了 HA 的环境中,我需要检查 namenode 是否处于活动状态,如果不是,我需要连接到另一个,否则该方法将抛出 RemoteException 说 sth likeOperation 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

我被困在这里。有人可以帮忙吗。谢谢。

标签: javahadoophdfs

解决方案


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

@param nameNodeUri 指向特定 NameNode 或逻辑名称服务的 URI。

在我将特定ip:port的名称节点作为此参数传递之前。一旦我将其更改为hdfs://<mynameservice>,它就会自动连接到活动的,之后一切正常。

缺点是我不知道我要连接到哪个名称节点,并且将来我可能仍然需要一种方法来监视名称节点的状态。

任何附加评论或建议将不胜感激。


推荐阅读