gpt4 book ai didi

java - 如何在java客户端获取HDFS服务器的元数据信息?

转载 作者:可可西里 更新时间:2023-11-01 14:59:37 26 4
gpt4 key购买 nike

我需要构建一个实用程序类来测试与 HDFS 的连接。测试应显示 HDFS 的服务器端版本和任何其他元数据。虽然,有很多可用的客户端演示,但没有关于提取服务器元数据的演示。有人可以帮忙吗?

请注意,我的客户端是一个远程 java 客户端,没有 hadoop 和 HDFS 配置文件来初始化配置。我需要通过动态使用其 URL 连接到 HDFS 名称节点服务来完成此操作。

最佳答案

Hadoop 通过 HTTP 公开一些您可以使用的信息。参见 Cloudera的文章。可能最简单的方法是连接到 NN UI 并解析内容服务器返回:

URL url = new URL("http://myhost:50070/dfshealth.jsp");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
...

另一方面,如果您知道 NN 和 JT 的地址,则可以连接到它们使用像这样的简单客户端 (Hadoop 0.20.0-r10​​56497):

import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hdfs.DFSClient;
import org.apache.hadoop.hdfs.protocol.ClientProtocol;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.hdfs.protocol.FSConstants.DatanodeReportType;
import org.apache.hadoop.mapred.ClusterStatus;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.util.VersionInfo;

public class NNConnTest {

private enum NNStats {

STATS_CAPACITY_IDX(0,
"Total storage capacity of the system, in bytes: ");
//... see org.apache.hadoop.hdfs.protocol.ClientProtocol

private int id;
private String desc;

private NNStats(int id, String desc) {
this.id = id;
this.desc = desc;
}

public String getDesc() {
return desc;
}

public int getId() {
return id;
}

}

private enum ClusterStats {

//see org.apache.hadoop.mapred.ClusterStatus API docs
USED_MEM {
@Override
public String getDesc() {
String desc = "Total heap memory used by the JobTracker: ";
return desc + clusterStatus.getUsedMemory();
}
};

private static ClusterStatus clusterStatus;
public static void setClusterStatus(ClusterStatus stat) {
clusterStatus = stat;
}

public abstract String getDesc();
}


public static void main(String[] args) throws Exception {

InetSocketAddress namenodeAddr = new InetSocketAddress("myhost",8020);
InetSocketAddress jobtrackerAddr = new InetSocketAddress("myhost",8021);

Configuration conf = new Configuration();

//query NameNode
DFSClient client = new DFSClient(namenodeAddr, conf);
ClientProtocol namenode = client.namenode;
long[] stats = namenode.getStats();

System.out.println("NameNode info: ");
for (NNStats sf : NNStats.values()) {
System.out.println(sf.getDesc() + stats[sf.getId()]);
}

//query JobTracker
JobClient jobClient = new JobClient(jobtrackerAddr, conf);
ClusterStatus clusterStatus = jobClient.getClusterStatus(true);

System.out.println("\nJobTracker info: ");
System.out.println("State: " +
clusterStatus.getJobTrackerState().toString());

ClusterStats.setClusterStatus(clusterStatus);
for (ClusterStats cs : ClusterStats.values()) {
System.out.println(cs.getDesc());
}

System.out.println("\nHadoop build version: "
+ VersionInfo.getBuildVersion());

//query Datanodes
System.out.println("\nDataNode info: ");
DatanodeInfo[] datanodeReport = namenode.getDatanodeReport(
DatanodeReportType.ALL);
for (DatanodeInfo di : datanodeReport) {
System.out.println("Host: " + di.getHostName());
System.out.println(di.getDatanodeReport());
}

}

}

确保您的客户端应使用与您的集群相同的 Hadoop 版本,否则可能会发生 EOFException

关于java - 如何在java客户端获取HDFS服务器的元数据信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12366482/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com