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

9q78igpj  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(345)

我有一个应用程序,可以从namenode获取文件的块位置。我找到了一种通过rpcapi连接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的inetsocketaddress(host,port),我可以成功地连接到namenode并调用 getBlockLocations() 方法。问题是,在启用ha的环境中,我需要检查namenode是否处于活动状态,如果不是,我需要连接到另一个namenode,否则该方法将抛出一个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

我被困在这里了。有人能帮忙吗。谢谢。
xytpbqjk

xytpbqjk1#

虽然这不是对这个问题的直接回答,但我找到了解决问题的方法。为了 org.apache.hadoop.hdfs.NameNodeProxies.createProxy ,在他们写的评论里
@param namenodeuri指向特定namenode或逻辑nameservice的uri。
在我通过一个特定的 ip:port 作为此参数的namenode。一旦我把它改成 hdfs://<mynameservice> ,它会自动连接到活动的,之后一切正常。
缺点是我不知道连接到哪个namenode,而且将来可能仍然需要一种方法来监视namenodes的状态。
任何附加意见或建议将不胜感激。

相关问题