2016-03-10 5 views
6

誰でも教えてください。Javaアプリケーションを使用して、Namenode HAセットアップを使用してHDFSにファイルのアップロード/ダウンロード操作を要求している場合は、私はクライアントがどのネームノードがアクティブであるかをどのように知っていますか?Namenode高可用性クライアント要求

ワークフロータイプの図やリクエストステップについて詳しく説明しています(開始から終了まで)。

答えて

8

HadoopクラスタはHAで構成されている場合、それはこのようにHDFS-site.xmlで名前ノードIDを持つことになります。最初にアクティブになります開始されたどちらの名前ノード

<property> 
    <name>dfs.ha.namenodes.mycluster</name> 
    <value>namenode1,namenode2</value> 
</property> 

。優先ノードが最初に始まるように、特定の順序でクラスタを起動することを選択できます。

あなたが名前ノードの現在のステータスを確認したい場合は、getServiceStatusを(使用することができます)コマンド:

hdfs haadmin -getServiceState <machine-name> 

まあ、ドライバクラスを書いている間、あなたが設定オブジェクトの次のプロパティを設定する必要があります:

public static void main(String[] args) throws Exception { 
    if (args.length != 2){ 
     System.out.println("Usage: pgm <hdfs:///path/to/copy> </local/path/to/copy/from>"); 
     System.exit(1); 
    } 
    Configuration conf = new Configuration(false); 
    conf.set("fs.defaultFS", "hdfs://nameservice1"); 
    conf.set("fs.default.name", conf.get("fs.defaultFS")); 
    conf.set("dfs.nameservices","nameservice1"); 
    conf.set("dfs.ha.namenodes.nameservice1", "namenode1,namenode2"); 
    conf.set("dfs.namenode.rpc-address.nameservice1.namenode1","hadoopnamenode01:8020"); 
    conf.set("dfs.namenode.rpc-address.nameservice1.namenode2", "hadoopnamenode02:8020"); 
    conf.set("dfs.client.failover.proxy.provider.nameservice1","org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"); 

    FileSystem fs = FileSystem.get(URI.create(args[0]), conf); 
    Path srcPath = new Path(args[1]); 
    Path dstPath = new Path(args[0]); 
    //in case the same file exists on remote location, it will be overwritten 
    fs.copyFromLocalFile(false, true, srcPath, dstPath); 
} 

要求がnameservice1に移動し、さらに名前ノードの状態(アクティブ/スタンバイ)あたりとしてHadoopクラスタによって処理されます。

詳細については、取扱HDFSクライアントの要求でキーエンティティとHDFS High availability

+0

あなたは私の質問を正しく理解していないと思います。 私はJavaアプリケーションを使用してリクエストをしています。私の質問はどのnamenodeにありますか?そのためには、どの名前ノードがアクティブなのかを知る必要があります – user2846382

+0

@ user2846382:ドライバクラスで設定を行う必要があります。更新された回答を参照してください。 –

+0

、あなたの貴重な答えのためにたくさんありがとう..それは私のために働く.. – user2846382

8

ご確認ください名前ノードHAアーキテクチャを参照してください。この要求は、最初に行く

HA architecture

?私はクライアントがどのように知っているのですか? namenodeはアクティブですか?

クライアント/ドライバの場合、アクティブなネームノードは問題ありません。なぜなら我々はnamenodeのホスト名ではなく、ネームサービスIDでHDFSを照会するからです。 ネームサービスは、クライアント要求をアクティブなネームノードに自動的に転送します。

hdfs://nameservice_id/rest/of/the/hdfs/path

説明:

どのようにこのhdfs://nameservice_id/作品とそれに関わる会議通話数は何ですか?hdfs-site.xmlファイルで

<property> 
    <name>dfs.nameservices</name> 
    <value>mycluster</value> 
    <description>Logical name for this new nameservice</description> 
</property> 

今すぐクラスタ

dfs.ha.namenodes.[$nameservice ID]でnamenodesを決定するために、名前ノードIDを指定します(ここでnameservice_idmyclusterである)、それにIDを追加することにより、ネームサービスを作成します。

<property> 
    <name>dfs.ha.namenodes.mycluster</name> 
    <value>nn1,nn2</value> 
    <description>Unique identifiers for each NameNode in the nameservice</description> 
</property> 

はその後、クライアントがDFSクライアントがどの名前ノードを決定するために、このクラスを使用するように、アクティブな名前ノードに連絡するために使用するHDFS Javaクラスを指定

dfs.namenode.rpc-address.[$nameservice ID].[$name node ID]

<property> 
    <name>dfs.namenode.rpc-address.mycluster.nn1</name> 
    <value>machine1.example.com:8020</value> 
</property> 
<property> 
    <name>dfs.namenode.rpc-address.mycluster.nn2</name> 
    <value>machine2.example.com:8020</value> 
</property> 

その後名前ノードのホストと名前ノードIDをリンクします現在クライアント要求を提供しています

<property> 
    <name>dfs.client.failover.proxy.provider.mycluster</name> 
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> 
</property> 

最後に、これらの設定変更後、HDFS URLはこのようになります。

hdfs://mycluster/<file_lication_in_hdfs>

私はいくつかの構成をとっている、あなたの質問に答えます。ネームノード、ジャーナルノード、および動物園のマシンがHDFSにネームノードHAを形成する方法については、detailed documentationを確認してください。

+0

私はアプリケーションとしてjavaを使用しており、HDFSフェデレーテッドクラスタのいくつかの設定オブジェクト関連ガイダンスが必要です。どのようなアクティブなネームノードがすべての受信クライアント要求を水平に共有できるか。このために私はjavaでいくつかのコード例が必要です – user2846382

関連する問題