2

HDFS への接続をテストするには、ユーティリティ クラスを作成する必要があります。テストでは、HDFS のサーバー側バージョンとその他のメタデータが表示されます。ただし、利用可能なクライアント デモは多数ありますが、サーバー メタデータの抽出に関するものはありません。誰か助けてくれませんか?

私のクライアントはリモート Java クライアントであり、構成を初期化するための Hadoop および HDFS 構成ファイルがないことに注意してください。オンザフライで URL を使用して HDFS ネーム ノード サービスに接続する必要があります。

4

2 に答える 2

1

Hadoop は、使用できる HTTP を介して一部の情報を公開します。Clouderaの記事を参照してください。おそらく最も簡単な方法は、NNUI に接続し、サーバーから返されたコンテンツを解析することです。

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

于 2012-09-12T13:12:02.667 に答える
0

すべての Hadoop ノードは JMX インターフェースを公開しており、JMX を介して取得できる機能の 1 つがバージョンです。開始するには、localhost と jconsole で Hadoop を実行し、いくつかのノードに接続してインターフェイスを調べ、MBean のオブジェクト名をコピー & ペーストします。残念ながら、Hadoop の JMX iface に関するドキュメントはほとんどありません。

ところで。NameNode最も有益な情報を提供します。

于 2012-09-11T19:44:59.037 に答える