java - 使用java获取hdfs namenode的状态

标签 java hadoop hdfs

我正在创建一个 java 应用程序,它将读取目录中的文件。现在的问题是如何获取名称节点的状态/状态,因为我收到一条错误消息:

org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby
at org.apache.hadoop.hdfs.server.namenode.ha.StandbyState.checkOperation(StandbyState.java:87)
at org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.checkOperation(NameNode.java:1932)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkOperation(FSNamesystem.java:1313)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:3861)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:1076)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTranslatorPB.java:843)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:969)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2151)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2147)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2145)

请看下面的代码:

Configuration conf = new Configuration();
conf.addResource(new Path("/etc/hadoop/conf/core-site.xml"));
conf.addResource(new Path("/etc/hadoop/conf/hdfs-site.xml"));
conf.addResource(new Path("/etc/hadoop/conf/mapred-site.xml"));

System.out.println("Connecting to active name node: " + aNode);
fs = FileSystem.get(new URI(aNode),conf); 
System.out.println("Successfully connected to active name node: " + aNode);

我想让我的代码更加动态,java 将检查什么是活跃的 Activity 名称节点。

最佳答案

我遇到了同样的问题。我们有一个带有 2 个 hdfs 节点的 hadoop 集群。其中一个处于 Activity 状态,另一个处于待机模式。

他们经常转换角色,我必须使用 java 与他们保持联系。

我是这样解决的:

在/etc/hadoop/conf/core-site.xml 中有一个 fs.defaultFS 属性。 您必须从 fs.defaultFS 值创建新 URI 并将其作为参数传递给 FileSystem.get 函数。

/etc/hadoop/conf/core-site.xml:

<property>
    <name>fs.defaultFS</name>
    <value>hdfs://yourclustername-ns</value>
</property>

代码:

public static FileSystem hdfs;
try {
    Configuration conf = new Configuration();
    conf.addResource(new Path("/etc/hadoop/conf/core-site.xml"));
    conf.addResource(new Path("/etc/hadoop/conf/hdfs-site.xml"));
    hdfs = FileSystem.get(new URI("hdfs://yourcluster-ns"), conf, "your-hdfs-user");
}

通常每个人都会将其中一个hdfs节点的地址传递给FileSystem.get函数。但是节点可以改变角色,他们可以离线/在线。所以需要传递集群ns地址。

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

相关文章:

Java:自动检测输入文件路径

java - 多态性中 Java Lambda 表达式的有趣行为

regex - Hive 正则表达式将字符串拆分为两个不同的字段

java - yarn 异常 : Unauthorized request to start container

hadoop - 删除 DataNode 目录时的 HDFS 行为

java - 将 POJO 转换为 SOLR 查询

java - 如何使用 ExecutorService 跟踪任务执行统计信息?

apache-spark - Spark Streaming 创建许多小文件

hadoop - Spark yarn-cluster 模式 - 读取通过 --files 传递的文件

hadoop - 如何将大文件从HDFS上传到S3