![](/img/trans.png)
[英]How a Java client upload/download a file to/from remote HDFS server?
[英]How to get the HDFS server metadata information in a java client?
我需要构建一个实用程序类来测试与HDFS的连接。 测试应显示HDFS的服务器端版本和任何其他元数据。 虽然,有很多客户端演示可用,但是提取服务器元数据方面没有任何帮助。 有人可以帮忙吗?
请注意,我的客户端是一个远程Java客户端,并且没有hadoop和HDFS配置文件来初始化配置。 我需要通过使用其URL动态连接到HDFS名称节点服务来做到这一点。
所有hadoop节点都公开JMX接口,并且可以通过JMX获得的功能之一就是版本。 一个好的开始方法是在本地主机和jconsole上运行Hadoop并连接到某个节点并浏览接口,然后复制并粘贴MBean的对象名称。 不幸的是,几乎没有关于Hadoop JMX iface的文档。
顺便说一句 NameNode
提供最有用的信息。
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-r1056497)连接到它们:
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());
}
}
}
确保您的客户端应使用same
群集same
Hadoop版本,否则可能发生EOFException
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.