java - 使用 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
我被困在这里。有人可以帮忙吗。谢谢。
解决方案
虽然这不是对这个问题的直接回答,但我找到了解决我的问题的方法。因为org.apache.hadoop.hdfs.NameNodeProxies.createProxy
,在他们写的评论中
@param nameNodeUri 指向特定 NameNode 或逻辑名称服务的 URI。
在我将特定ip:port
的名称节点作为此参数传递之前。一旦我将其更改为hdfs://<mynameservice>
,它就会自动连接到活动的,之后一切正常。
缺点是我不知道我要连接到哪个名称节点,并且将来我可能仍然需要一种方法来监视名称节点的状态。
任何附加评论或建议将不胜感激。
推荐阅读
- angular - 在过滤器中搜索数据时,我想在 Angular SlickGrid 中使用空数据集搜索结果时显示“没有要显示的数据”
- vue.js - 如何在 Quasar Vue Google Maps 上修复无法读取 null 的属性“地图”?
- c# - C#如何通过字符串获取对象属性?
- javascript - JQuery动态验证多维数组中的文件大小
- c++ - 如何继承获取类对象c ++的类构造函数
- ios - 如何将日期(以毫秒为单位)设置为日期选择器?
- python - 如何在 3d 空间中找到段中的最近点
- python - 如何在python中处理文件中的单词和数字
- highcharts - 当一个图表与另一个图表重叠时,如何使图表透明?
- laravel - Laravel spatie/laravel-permission @can 指令