2013-04-11 11 views
10

Potrzebuję użyć klastra HDFS ze zdalnego pulpitu za pomocą Java API. Wszystko działa poprawnie, dopóki nie dojdzie do zapisu. Jeśli próbuję utworzyć dowolny plik, otrzymam wyjątek uprawnień dostępu. Ścieżka wygląda dobrze, ale wyjątek wskazuje moją nazwę użytkownika zdalnego pulpitu, co oczywiście nie jest tym, czego potrzebuję, aby uzyskać dostęp do wymaganego katalogu HDFS.Dostęp HDFS ze zdalnego hosta poprzez Java API, uwierzytelnianie użytkownika

Pytanie brzmi: - Czy istnieje sposób na reprezentowanie innej nazwy użytkownika za pomocą "prostego" uwierzytelniania w języku Java API? - Czy możesz wskazać dobre objaśnienia schematów uwierzytelniania/autoryzacji w hadoop/HDFS z przykładami Java API?

Tak, już wiem, że "whoami" może być przeciążone w tym przypadku przy użyciu aliasu powłoki, ale wolę unikać takich rozwiązań. Poza tym nie podoba mi się użycie niektórych sztuczek, takich jak rury, przez SSH i skrypty. Chciałbym wykonać wszystko za pomocą tylko Java API. Z góry dziękuję.

Odpowiedz

14

Po niektóre studia doszedłem do następującego rozwiązania:

  • ja właściwie nie potrzebują pełnego rozwiązania Kerberos, to wystarczy, że obecnie klienci mogą uruchomić HDFS żądania od każdego użytkownika. Samo środowisko uważa się za bezpieczne.
  • To daje mi rozwiązanie oparte na klasie hadoop UserGroupInformation. W przyszłości mogę go rozszerzyć, aby obsługiwał Kerberos.

Przykładowy kod prawdopodobnie użyteczna dla ludzi zarówno dla 'fałszywej autoryzacji' i zdalnego dostępu HDFS:

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

Przydatne odniesienia dla tych, którzy mają podobny problem:

  • Cloudera blogu " Authorization and Authentication In Hadoop ". Krótki, skupiony na prostym objaśnieniu podejść bezpieczeństwa hadoopów. Brak informacji specyficznych dla rozwiązania Java API, ale dobre dla podstawowego zrozumienia problemu.

UPDATE:
alternatywą dla tych, którzy korzysta z linii poleceń hdfs lub hadoop narzędzia bez lokalnego użytkownika potrzebne:

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

Co faktycznie zrobić, to przeczytać plik lokalny zgodnie z lokalnymi uprawnieniami, ale kiedy umieszczanie pliku na HDFS jesteś uwierzytelniony jak użytkownik hdfs.

jest to bardzo podobne właściwości do kodu API ilustrowany:

  1. Nie trzeba sudo.
  2. Nie potrzebujesz właściwie lokalnego użytkownika "hdfs".
  3. Nie musisz niczego kopiować ani zmieniać uprawnień z powodu poprzednich punktów.
+0

Natknąłem się na ten sam problem, co twój. Próbuję wysłać zadanie Hadoop ze zdalnego klienta do klastra, który go uruchomi. W moim przypadku problem polega na tym, że ** Cloudera's Hadoop 2.0.0 (Hadoop 2.0.0-cdh4.3.1) nie zapewnia klasy UserGroupInformation **, której użyłeś.Wygląda na to, że odpowiednie wersje Apache Hadoop tego nie zapewniają. Istnieje tylko nazwa użytkownika o nazwie UserGroupInformation - [link] (http://archive.cloudera.com/cdh4/cdh/4/hadoop/api/org/apache/hadoop/security/UserGroupInformation.AuthenticationMethod.html). Jak w takim razie mógłbyś zrobić w takim przypadku? – falconepl

+0

Jest tam, po prostu nie jest cloudera. Używam teraz klienta hadoop 2.0.0-cdh4.3.1. –

+0

Co masz na myśli mówiąc, że tam jest? Sprawdziłem API Apache Hadoop 2.0.6 [[link] (http://hadoop.apache.org/docs/r2.0.6-alpha/api/index.html)] oraz interfejs API 2.1.0 [[link ] (http://hadoop.apache.org/docs/r2.1.0-beta/api/index.html)] (te Javadocs, które Apache dostarcza na ich stronie internetowej) i niestety nie ma klasy "UserGroupInformation", tylko enum to niewiele pomaga. A przy okazji, czyż nie jest "Hadoop 2.0.0-cdh4.3.1", o którym wspominałeś o dystrybucji Hadoop Cloudera? – falconepl

Powiązane problemy