2016-03-10 10 views
6

Czy ktoś proszę mi powiedzieć, że jeśli używam aplikacji java do żądania niektórych operacji wysyłania plików/pobierania do HDFS konfigurację Namenode ha, na których wniosek ten pierwszy? Chodzi mi o to, w jaki sposób klient wiedziałby, który numer jest aktywny?Namenode wysoka dostępność żądanie klienta

Byłoby wspaniale, jeśli podasz jakiś schemat typu workflow lub coś, co wyjaśnia żądania kroki w szczegółach (start na końcu).

Odpowiedz

8

Jeśli klaster Hadoop jest skonfigurowany z HA, to będzie mieć identyfikatory namenode w HDFS-site.xml tak:

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

Niezależnie NameNode rozpoczyna pierwszy staną się aktywne. Możesz uruchomić klaster w określonej kolejności, tak aby preferowany węzeł był uruchamiany jako pierwszy.

Jeżeli chcesz ustalić aktualny status namenode, można użyć getServiceStatus() polecenie:

hdfs haadmin -getServiceState <machine-name> 

Cóż, pisząc klasę sterownika, należy ustawić następujące właściwości w obiekcie konfiguracyjnym :

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

Zapytanie trafi do nameservice1 a dodatkowo obsługiwane przez klaster Hadoop według stanu namenode (aktywny/czuwania).

Aby uzyskać więcej informacji, zapoznaj się proszę sprawdzić Namenode HA architekturę HDFS High availability

+0

Myślę, że nie zrozumiałeś poprawnie mojego pytania. Używam aplikacji java do żądania.Moje pytanie, na którym namenode wykonuję moje żądania. W tym celu muszę wiedzieć, który identyfikator jest aktywny – user2846382

+0

@ user2846382: musisz ustawić konfigurację w klasie sterownika. Odśwież zaktualizowaną odpowiedź. –

+0

, Wielkie dzięki za cenną odpowiedź. To działa dla mnie .. – user2846382

8

z kluczowych podmiotów żądań klienta HDFS obchodzenia.

HA architecture

Jeżeli wniosek ten pierwszy? Chodzi mi o to, w jaki sposób klient wie, który numerenena jest aktywny?

Dla klienta/sterownika nie ma znaczenia, który numer węzłowy jest aktywny. ponieważ kwerendujemy na HDFS z identyfikatorem nameservice zamiast nazwą hosta namenode. nameservice automatycznie przeniesie żądania klientów do aktywnego Namenode.

Przykład: hdfs://nameservice_id/rest/of/the/hdfs/path

Objaśnienie:

jak to hdfs://nameservice_id/ prace i jakie są confs uczestniczące w nim?

W hdfs-site.xml plik

Tworzenie Nazw dodając id do niego (tutaj nameservice_id jest mycluster)

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

Teraz określić identyfikatory namenode celu ustalenia namenodes w klastrze

dfs.ha.namenodes.[$nameservice ID]:

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

następnie połączyć identyfikatory namenode z gospodarzami namenode

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> 

Następnie określ klasy Java że HDFS klienci używają do kontaktu Active NameNode tak, że klient DFS używa tej klasy aby określić, który NameNode aktualnie obsługuje żądania klientów.

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

W końcu adres URL HDFS będzie taki po zmianie konfiguracji.

hdfs://mycluster/<file_lication_in_hdfs>

Aby odpowiedzieć na to pytanie Brałem tylkokilka konfiguracji. sprawdź, czy detailed documentation zawiera informacje o tym, jak maszyny Namenodes, Journalnodes i Zookeeper tworzą Namenode HA w HDFS.

+0

Używam java jako aplikacji i potrzebuję pewnych wskazówek dotyczących obiektów konfiguracyjnych w klastrze stowarzyszonym HDFS. Jak wszystkie aktywne namenody mogą udostępniać wszystkie przychodzące żądania klientów w poziomie. Do tego potrzebuję przykład kodu w java – user2846382