2016-03-10 18 views
6

Herhangi biri, bazı dosya yükleme/indirme işlemleri için, Namenode HA kurulumu ile HDFS'ye başvurmak için java uygulamasını kullanıyorsanız, Bu isteğin ilk önce nerede olduğunu söyleyebilir mi? Yani müşteri hangi adenoidin aktif olduğunu nasıl anlardı? Bazı iş akışı türü şeması veya istek adımlarını ayrıntılı olarak açıklayan bir şey sağlarsanız (baştan sona), bu harika olurdu. Hadoop küme HA ile yapılandırılmışNamenode yüksek kullanılabilirlikli müşteri talebi

cevap

8

, o zaman böyle HDF'ler-site.xml dosyasını içinde namenode kimliğe sahip olur:

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

Hangisi NameNode aktif hale gelecektir ilk başlatılır. Kümeyi, tercih ettiğiniz düğümün ilk önce başlayacak şekilde belirli bir sırayla başlatmayı seçebilirsiniz. Eğer namenode mevcut durumunu belirlemek istiyorsanız

kullanabileceğiniz getServiceStatus() komutu: Sürücü sınıfını yazarken

hdfs haadmin -getServiceState <machine-name> 

Eh, yapılandırma nesnesi aşağıdaki özellikleri ayarlamanız gerekir :

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

talep nameservice1 gidip başka namenode durum (etkin/bekleme) uyarınca Hadoop küme tarafından ele olacaktır.

fazla ayrıntı için, taşıma HDF'ler istemci istekleri kilit kişilerle HDFS High availability

+0

Sanırım sorumu doğru anlamadınız. Ben istek yapmak için java uygulama kullanıyorum .. Benim soruları yapmak hangi sorularım var. Bunun için hangi namonun aktif olduğunu bilmem gerekiyor – user2846382

+0

@ user2846382: yapılandırmayı sürücü sınıfında ayarlamanız gerekiyor. Lütfen güncellenmiş cevaba bakın. –

+0

, Değerli cevabı için çok teşekkürler ... Benim için çalışıyor .. – user2846382

8

kontrol edin Namenode HA mimarisini bakınız.

bu istek ilk sen

HA architecture

? İstemci hangi adının aktif olduğunu nasıl anlardı?

İstemci/sürücü için hangi adenoidin etkin olduğu önemli değil. çünkü adlandırma kimliği yerine adenoid kimliği yerine HDFS ile sorgu yapıyoruz. nameservice, istemci isteklerini otomatik olarak aktif adenode aktarır.

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

Açıklama:

Bu nasıl hdfs://nameservice_id/ çalışır ve işin içinde Confs nelerdir?

dosya hdfs-site.xml yılında

buna bir id ekleyerek nameservice oluşturun

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

Şimdi küme

dfs.ha.namenodes.[$nameservice ID] yılında namenodes belirlemek için namenode kimlikleri belirtmek (burada nameservice_idmycluster olan):

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

Sonra istemciler DFS İstemci hangi NameNode belirlemek için bu sınıf kullanması için Aktif NameNode ulaşmak için kullanmak HDF'ler Java sınıfı belirtmek

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> 

Bundan sonra namenode ana namenode kimlikleri bağlantı şu anda müşteri isteklerine hizmet vermektedir.

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

Son olarak URL bu yapılandırma değişikliklerinden sonra böyle olacak HDF'ler.

hdfs://mycluster/<file_lication_in_hdfs>

Ben birkaç yapılandırma sadece almış sorunuzu cevaplamak için. Lütfen, Namenodes, Journalnodes ve Zookeeper makinelerinin HDFS'de Namenode HA'yı nasıl oluşturduğuna ilişkin detailed documentation'u kontrol edin.

+0

'da bir kod örneğine ihtiyacım var java'yı uygulama olarak kullanıyorum ve HDFS birleşik kümesinde bazı yapılandırma nesnesiyle ilgili kılavuzlara ihtiyacım var. Tüm etkin adlar tüm gelen istemci isteklerini yatay olarak nasıl paylaşabilir? Bunun için java'da bir kod örneğine ihtiyacım var – user2846382