2013-04-11 45 views
10
Java API aracılığıyla uzaktan masaüstü HDF'ler küme kullanmak gerekir

. Her şey yazmaya gelene kadar işe yarıyor. Herhangi bir dosya oluşturmaya çalışırsam erişim izni istisnası alıyorum. Yol iyi görünüyor ama istisna, uzak masaüstü kullanıcı ismimi gösteriyor ki bu da gerekli HDFS dizinine erişmem gereken şey değil.HDF'ler erişimi, kullanıcı kimlik doğrulama

soru şudur: - Java API 'basit' kimlik doğrulaması kullanarak farklı bir kullanıcı adı temsil etmek bir yolu var mı? - Java API örnekleriyle tercih edilen hadoop/HDFS'de kimlik doğrulama/yetkilendirme şemalarının iyi bir açıklamasını işaret edebilir misiniz?

Evet, zaten 'whoami' biliyorum kabuk takma adını kullanarak bu durumda aşırı ama böyle çözümler önlemek için tercih edilebilir. Ayrıca burada belirtmek gerekirse, SSH ve betik yoluyla borular gibi bazı hilelerin kullanımını sevmiyorum. Sadece Java API kullanarak her şeyi yapmak istiyorum. Önceden teşekkür ederiz. Aşağıdaki çözüm geldi okuyan bazı sonra

cevap

14

:

  • Ben aslında istemciler herhangi kullanıcıdan HDF'ler isteklerini çalıştırabilirsiniz şu anda yeterlidir, tam Kerberos çözüm gerekmez. Ortamın kendisi güvenli kabul edilir.
  • Bu Hadoop UserGroupInformation sınıfına dayanan bana çözümü verir. Gelecekte Kerberos'u desteklemek için genişletebilirim. Benzer bir sorunu olanlar için

    package org.myorg; 
    
    import java.security.PrivilegedExceptionAction; 
    
    import org.apache.hadoop.conf.*; 
    import org.apache.hadoop.security.UserGroupInformation; 
    import org.apache.hadoop.fs.Path; 
    import org.apache.hadoop.fs.FileSystem; 
    import org.apache.hadoop.fs.FileStatus; 
    
    public class HdfsTest { 
    
        public static void main(String args[]) { 
    
         try { 
          UserGroupInformation ugi 
           = UserGroupInformation.createRemoteUser("hbase"); 
    
          ugi.doAs(new PrivilegedExceptionAction<Void>() { 
    
           public Void run() throws Exception { 
    
            Configuration conf = new Configuration(); 
            conf.set("fs.defaultFS", "hdfs://1.2.3.4:8020/user/hbase"); 
            conf.set("hadoop.job.ugi", "hbase"); 
    
            FileSystem fs = FileSystem.get(conf); 
    
            fs.createNewFile(new Path("/user/hbase/test")); 
    
            FileStatus[] status = fs.listStatus(new Path("/user/hbase")); 
            for(int i=0;i<status.length;i++){ 
             System.out.println(status[i].getPath()); 
            } 
            return null; 
           } 
          }); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
    } 
    

    Faydalı referans:

    • Cloudera blog yazısı " 'sahte kimlik doğrulaması' ve uzak HDF'ler erişim için hem insanlar için

    Örnek kod muhtemelen yararlı Authorization and Authentication In Hadoop ". Kısa, hadoop güvenlik yaklaşımlarının basit açıklamalarına odaklandı. Java API çözümüne özgü hiçbir bilgi yoktur, ancak sorunun temel olarak anlaşılması için iyidir.

GÜNCELLEME: olanlar için
Alternatif yerel gerekli kullanıcı olmadan komut satırı hdfs veya hadoop programı kullanır:

HADOOP_USER_NAME=hdfs hdfs fs -put /root/MyHadoop/file1.txt/

aslında yerel izinlere uygun olarak yerel dosyayı okumak olduğunu ne yapıyoruz ama HDFS'ye dosya yerleştirdiğinizde, kullanıcı hdfs gibi doğrulanmışsınız.

oldukça API koduna benzer özellikler resimli Bu etti: Sen sudo gerekmez

  1. .
  2. Aslında uygun yerel kullanıcı 'HDF'ler' gerekmez.
  3. Önceki öğelerden dolayı herhangi bir şeyi kopyalamanıza veya değiştirmenize gerek yoktur.
+0

Ben sizinkiyle aynı sorun tökezledi. Hadoop işini uzak bir istemciden yürütecek kümeye göndermeye çalışıyorum. Benim durumumda, sorun, ** Cloudera'nın Hadoop 2.0.0'ının (Hadoop 2.0.0-cdh4.3.1) kullanmış olduğunuz UserGroupInformation sınıfını ** sağlamadığıdır.Apache Hadoop versiyonlarının buna uygun olmadığı anlaşılıyor. UserGroupInformation adında bir numara var - [link] (http://archive.cloudera.com/cdh4/cdh/4/hadoop/api/org/apache/hadoop/security/UserGroupInformation.AuthenticationMethod.html). Bu durumda böyle bir durumda nasıl yapılabilir? – falconepl

+0

İşte orada, sadece cloudera değil. Şu anda 2.0.0-cdh4.3.1 hadoop istemcisini kullanıyorum. –

+0

Orada olduğunu söyleyerek ne demek istiyorsun? Apache Hadoop 2.0.6 API'sini [[link] (http://hadoop.apache.org/docs/r2.0.6-alpha/api/index.html)] ve 2.1.0 API'sini [[link] kontrol ettim ] (http://hadoop.apache.org/docs/r2.1.0-beta/api/index.html)] (Apache'nin kendi web sitesinde sunduğu Javadocs'lar) ve ne yazık ki "UserGroupInformation" sınıfı yok, sadece enum Bu fazla yardımcı olmaz. Ve bu arada, 2.0.0-cdh4.3.1 'Hadoop, bir Cloudera'nın Hadoop dağıtımından bahsettiniz değil mi? – falconepl

İlgili konular