2013-05-27 17 views
9

Sono felicemente la connessione a HDFS e messa in vendita la mia home directory:HDFS da Java - Indicazione degli utenti

Configuration conf = new Configuration(); 
conf.set("fs.defaultFS", "hdfs://hadoop:8020"); 
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem"); 
FileSystem fs = FileSystem.get(conf); 
RemoteIterator<LocatedFileStatus> ri = fs.listFiles(fs.getHomeDirectory(), false); 
while (ri.hasNext()) { 
    LocatedFileStatus lfs = ri.next(); 
    log.debug(lfs.getPath().toString()); 
} 
fs.close(); 

Quello che sto volendo fare ora però è collegare come utente specifico (non l'utente whois). Qualcuno sa come si specifica quale utente si connette?

+0

ciao ho provato questo codice per connettersi a un'istanza HDFS remota ma ottengo Exception in thread java.lang.UnsupportedOperationException "principale": non implementato dalla realizzazione DistributedFileSystem FileSystem – AbtPst

+0

fai a sapere come risolvere questo? – AbtPst

+0

Ho fatto questa domanda più di 2 anni fa. Da allora Hadoop ha fatto grandi passi avanti. Per quanto riguarda le esatte implementazioni, le cose sono probabilmente fatte in un modo diverso ora. – Kong

risposta

22

Non appena vedo questa operazione viene effettuata tramite la classe UserGroupInformation e PrivilegedAction o PrivilegedExceptionAction. Ecco un codice di esempio per connettersi a HDFS remoto "come" utente diverso ("hbase" in questo caso). Spero che questo risolva il tuo compito. Nel caso in cui sia necessario uno schema completo con autenticazione, è necessario migliorare la gestione degli utenti. Ma per lo schema di autenticazione SIMPLE (in realtà nessuna autenticazione) funziona perfettamente.

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

Ho cercato le impostazioni dei parametri di configurazione hadoop e non ho alcuna spiegazione utile. Hbase significa utente in conf.set. Dove posso ottenere tutte le spiegazioni sulle classi hadoop non solo le classi di avail. Qualche link per favore? –

+1

'org.apache.hadoop.security.UserGroupInformation' è la classe chiave qui e consente di specificare 'utente remoto' tramite' createRemoteUser() '. Quindi il cluster Hadoop ti vede come utente che hai specificato nidependent dell'utente locale. Ovviamente questo funziona solo se il tuo cluster Hadoop si fida di te (autenticazione SEMPLICE, in realtà nessuna). Con Kerberous è inoltre necessario fornire prove. –

+0

ho provato questo, ma ottengo java.lang.UnsupportedOperationException: Non implementato dall'implementazione FileSystem DistributedFileSystem – AbtPst

0

Se ti ho corretto, tutto quello che vuoi è ottenere la directory home dell'utente se specificato e non l'utente whois.

Nel file di configurazione, impostare la proprietà homedir su user/$ {user.name}. Assicurati di avere una proprietà di sistema denominata user.name

Questo ha funzionato nel mio caso.

Spero che questo sia quello che vuoi fare, Se non aggiungi un commento.

+0

In realtà sto cercando di sfogliare l'intero file system HDFS, come fa Hue. essere l'utente di hdfs. – Kong

Problemi correlati