2016-03-10 10 views
6

Kann mir bitte jemand sagen, dass wenn ich Java-Anwendung verwenden, um einige Datei Upload/Download-Operationen auf HDFS mit Namenode HA-Setup, wo diese Anfrage zuerst gehen? Ich meine, wie würde Client wissen, welcher Nameode aktiv ist?Nameode hohe Verfügbarkeit Client-Anfrage

Es wäre großartig, wenn Sie ein Workflow-Diagramm oder etwas bereitstellen, das die Anforderungsschritte im Detail erklärt (von Anfang bis Ende).

Antwort

8

Wenn hadoop Cluster mit HA konfiguriert ist, dann wird es NameNode IDs in hdfs-site.xml wie dieses:

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

Unabhängig davon, welche NameNode gestartet wird zuerst aktiv werden. Sie können den Cluster in einer bestimmten Reihenfolge starten, sodass der bevorzugte Knoten zuerst gestartet wird.

Wenn Sie den aktuellen Status der NameNode bestimmen möchten, können Sie getServiceStatus() verwenden Befehl:

hdfs haadmin -getServiceState <machine-name> 

Nun, während der Fahrer Klasse zu schreiben, können Sie die folgenden Eigenschaften in Konfigurationsobjekt festlegen müssen :

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

Anfrage wird an die nameservice1 gehen und weiter durch Hadoop Cluster gemäß der NameNode Status (aktiv/standby) behandelt.

Weitere Einzelheiten entnehmen Sie bitte den HDFS High availability

+0

Ich denke, du hast meine Frage nicht richtig verstanden. Ich benutze Java-Anwendung, um Anfrage zu stellen .. Meine Frage ist, auf welcher nomenode ich meine Anfragen. Dazu muss ich wissen, welcher namenode aktiv ist – user2846382

+0

@ user2846382: Sie müssen die Konfiguration in der Treiberklasse festlegen. Bitte beachten Sie die aktualisierte Antwort. –

+0

, Vielen Dank für Ihre wertvolle Antwort .. Es funktioniert für mich .. – user2846382

8

Bitte überprüfen NameNode HA-Architektur mit den wichtigsten Einrichtungen in HDFS Client-Anforderungen behandeln.

HA architecture

Wo diese Anforderung zuerst gehen? Ich meine, wie würde Klient wissen, welche Namenkode aktiv ist?

Für den Client/Treiber ist es egal, welcher namenode aktiv ist. weil wir HDFS mit der Nameservice-ID und nicht mit dem Hostnamen von Nomenode abfragen. Nameservice überträgt Clientanforderungen automatisch an den aktiven Namen.

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

Erläuterung:

Wie das hdfs://nameservice_id/ funktioniert und was sind die confs daran beteiligt?

In hdfs-site.xml Datei

ein Name-Service erstellen, indem sie ein id ihm hinzufügen (hier nameservice_id ist mycluster)

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

Jetzt namenodes in Cluster bestimmen

dfs.ha.namenodes.[$nameservice ID] NameNode IDs angeben:

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

verknüpfen Dann NameNode ids mit NameNode Gastgeber

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> 

Danach geben Sie die Java-Klasse, die Clients verwenden, um Kontakt mit den Active NameNode HDFS so dass DFS-Client diese Klasse verwendet , um zu bestimmen, welche NameNode bedient derzeit Kundenanfragen.

Schließlich wird HDFS URL nach diesen Konfigurationsänderungen wie folgt aussehen.

hdfs://mycluster/<file_lication_in_hdfs>

Um Ihre Frage zu beantworten, ich wenige Konfiguration nur genommen haben. Überprüfen Sie bitte die detailed documentation für, wie Nameoden, Journalnodes und Zookeeper-Maschinen NameNode HA in HDFS bilden.

+0

Ich benutze Java als Anwendung und brauche einige Konfigurationsobjekt bezogen Anleitung in HDFS Federated Cluster. Wie alle aktiven Namensknoten alle eingehenden Clientanforderungen horizontal teilen können. Dazu brauche ich ein Code-Beispiel in Java – user2846382