【问题标题】:How to get the HDFS server metadata information in a java client?如何在 java 客户端中获取 HDFS 服务器元数据信息?
【发布时间】:2012-09-11 09:18:03
【问题描述】:

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

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

【问题讨论】:

    标签: java hadoop connection client hdfs


    【解决方案1】:

    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());
            }
    
        }
    
    }
    

    确保您的客户端应该像您的集群一样使用same Hadoop 版本,否则可能会出现EOFException

    【讨论】:

      【解决方案2】:

      所有 hadoop 节点都公开 JMX 接口,您可以通过 JMX 获得的功能之一是版本。开始的好方法是在 localhost 和 jconsole 上运行 Hadoop 并连接到某个节点并探索接口并复制并粘贴 MBean 的对象名称。不幸的是,几乎没有关于 Hadoop 的 JMX iface 的文档。

      顺便说一句。 NameNode 提供了最有用的信息。

      【讨论】:

      • 这是一个不错的选择。但是,要做到这一点,我需要明确启用 JMX 并从用户那里获得其端口号;要求这种不必要的信息有点过分了。我的要求是测试 HDFS 连接以检查其是否有效,就像检查与数据库服务器的 JDBC 连接一样。测试函数会通过一些额外的元数据信息(如服务器端版本信息)来判断连接是否成功。
      • 默认情况下启用 JMX,但我认为,这对您的用例来说可能有点过头了。您也可以尝试 http://:50070/dfshealth.jsp(也应该默认启用)
      猜你喜欢
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      相关资源
      最近更新 更多