我需要构建一个实用类来测试与hdfs的连接。测试应该显示hdfs的服务器端版本和任何其他元数据。尽管有很多客户机演示,但是没有关于提取服务器元数据的内容。有人能帮忙吗?请注意,我的客户端是一个远程java客户端,没有hadoop和hdfs配置文件来初始化配置。我需要通过动态使用hdfs name node服务的url连接到它。
l0oc07j21#
所有hadoop节点都公开jmx接口,通过jmx可以获得的特性之一就是版本。开始的好方法是在localhost和jconsole上运行hadoop,连接到某个节点,浏览接口并复制mbean的对象名。不幸的是,几乎没有关于hadoop的jmxiface的文档。顺便说一句。 NameNode 提供最有用的信息。
NameNode
4ioopgfo2#
hadoop通过http公开了一些您可以使用的信息。参见cloudera的文章。可能最简单的方法就是连接到 NN ui并解析服务器返回的内容:
NN
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 hadoop版本与您的集群不同 EOFException 可能发生。
same
EOFException
2条答案
按热度按时间l0oc07j21#
所有hadoop节点都公开jmx接口,通过jmx可以获得的特性之一就是版本。开始的好方法是在localhost和jconsole上运行hadoop,连接到某个节点,浏览接口并复制mbean的对象名。不幸的是,几乎没有关于hadoop的jmxiface的文档。
顺便说一句。
NameNode
提供最有用的信息。4ioopgfo2#
hadoop通过http公开了一些您可以使用的信息。参见cloudera的文章。可能最简单的方法就是连接到
NN
ui并解析服务器返回的内容:另一方面,如果您知道nn和jt的地址,您可以使用这样一个简单的客户端(hadoop 0.20.0-r1056497)连接到它们:
确保你的客户应该使用
same
hadoop版本与您的集群不同EOFException
可能发生。