2013-04-11 14 views
10

È necessario utilizzare il cluster HDFS dal desktop remoto tramite l'API Java. Tutto funziona OK fino a quando non si tratta di accedere in scrittura. Se sto cercando di creare qualsiasi file, ricevo un'eccezione di permesso di accesso. Il percorso sembra buono ma l'eccezione indica il mio nome utente del desktop remoto, che ovviamente non è quello di cui ho bisogno per accedere alla directory HDFS necessaria.Accesso HDFS da host remoto tramite API Java, autenticazione utente

La domanda è: - Esiste un modo per rappresentare un nome utente diverso utilizzando l'autenticazione "semplice" nell'API Java? - Potrebbe per favore indicare alcune buone spiegazioni degli schemi di autenticazione/autorizzazione in hadoop/HDFS preferibili con esempi di API Java?

Sì, so già che "whoami" potrebbe essere sovraccaricato in questo caso usando l'alias di shell ma preferisco evitare soluzioni come questa. Inoltre, in questo caso non sono d'accordo con alcuni trucchi come pipe attraverso SSH e script. Mi piacerebbe eseguire tutto utilizzando solo l'API Java. Grazie in anticipo.

risposta

14

Dopo qualche studio sono giunto alla seguente soluzione:

  • io in realtà non hanno bisogno di una soluzione completa di Kerberos, è sufficiente momento che i clienti possono eseguire le richieste di HDFS da qualsiasi utente. L'ambiente stesso è considerato sicuro.
  • Questo mi dà una soluzione basata sulla classe UserGroupInformation hadoop. In futuro potrò estenderlo per supportare Kerberos.

Codice di esempio probabilmente utile per le persone sia per 'falsa autenticazione' e l'accesso HDFS remoto:

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

riferimento utile per coloro che hanno un problema simile:

  • Cloudera post sul blog " Authorization and Authentication In Hadoop ". Breve, incentrato sulla semplice spiegazione degli approcci di sicurezza hadoop. Nessuna informazione specifica per la soluzione API Java ma utile per la comprensione di base del problema.

UPDATE:
alternativa per chi usa riga di comando hdfs o hadoop utilità senza utente locale necessaria:

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

che lei esprime è di leggere file locale in conformità con le autorizzazioni locali, ma quando posizionando il file su HDFS sei autenticato come utente hdfs.

Questo è abbastanza proprietà simili al codice API illustrato:

  1. Non è necessario sudo.
  2. Non è necessario l'utente locale effettivamente appropriato 'hdf'.
  3. Non è necessario copiare nulla o modificare le autorizzazioni a causa di punti precedenti.
+0

Mi sono imbattuto nello stesso problema del tuo. Sto cercando di inviare un lavoro Hadoop da un client remoto al cluster che lo eseguirà. Nel mio caso il problema è che ** Cloudera's Hadoop 2.0.0 (Hadoop 2.0.0-cdh4.3.1) non fornisce la classe UserGroupInformation ** che hai usato.Sembra che le corrispondenti versioni di Apache Hadoop non le forniscano neanche. C'è solo un enum chiamato UserGroupInformation - [link] (http://archive.cloudera.com/cdh4/cdh/4/hadoop/api/org/apache/hadoop/security/UserGroupInformation.AuthenticationMethod.html). Come potrebbe essere fatto in tal caso allora, secondo lei? – falconepl

+0

È lì, solo che non è cloudera. Sto usando il client hadoop 2.0.0-cdh4.3.1 in questo momento. –

+0

Cosa intendi dicendo che è lì? Ho controllato l'API Apache Hadoop 2.0.6 [[link] (http://hadoop.apache.org/docs/r2.0.6-alpha/api/index.html)] e l'API 2.1.0 [[link ] (http://hadoop.apache.org/docs/r2.1.0-beta/api/index.html)] (quei Javadoc che Apache fornisce sul loro sito web) e sfortunatamente non esiste una classe 'UserGroupInformation', solo l'enum questo non aiuta molto. E a proposito, non è '2.0.0-cdh4.3.1' Hadoop che tu abbia menzionato una distribuzione Hadoop di Cloudera? – falconepl