我有一个应用程序,可以从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
我被困在这里了。有人能帮忙吗。谢谢。
1条答案
按热度按时间xytpbqjk1#
虽然这不是对这个问题的直接回答,但我找到了解决问题的方法。为了
org.apache.hadoop.hdfs.NameNodeProxies.createProxy
,在他们写的评论里@param namenodeuri指向特定namenode或逻辑nameservice的uri。
在我通过一个特定的
ip:port
作为此参数的namenode。一旦我把它改成hdfs://<mynameservice>
,它会自动连接到活动的,之后一切正常。缺点是我不知道连接到哪个namenode,而且将来可能仍然需要一种方法来监视namenodes的状态。
任何附加意见或建议将不胜感激。