2013-05-27 13 views
9

Ich verbinde glücklich zu HDFS und Auflisten meinem Home-Verzeichnis:HDFS von Java - Angabe der Benutzer

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

Was ich will, obwohl tun jetzt als einen bestimmten Benutzer eine Verbindung (nicht die Whois-Benutzer). Weiß jemand, wie Sie angeben, mit welchem ​​Benutzer Sie sich verbinden?

+0

hallo habe ich versucht, diesen Code zu einem entfernten hdfs Instanz zu verbinden, aber ich Exception in thread „main“ java.lang.UnsupportedOperationException bekommen: Nicht durch die Umsetzung Distributed Filefilesystem implementiert – AbtPst

+0

wissen Sie, wie dieses Problem zu lösen? – AbtPst

+0

Ich habe diese Frage vor mehr als 2 Jahren gestellt. Hadoop hat seither einen langen Weg zurückgelegt. Soweit genaue Implementierungen gehen, sind die Dinge jetzt möglicherweise auf andere Weise gemacht. – Kong

Antwort

22

Sobald ich sehe, wird dies durch UserGroupInformation Klasse und PrivilegedAction oder PrivilegedExceptionAction getan. Hier ist ein Beispielcode, um eine Verbindung zu Remote-HDFS herzustellen, die "wie" einem anderen Benutzer ähnelt (in diesem Fall "hbase"). Hoffe das wird deine Aufgabe lösen. Wenn Sie ein vollständiges Schema mit Authentifizierung benötigen, müssen Sie die Benutzerbehandlung verbessern. Aber für SIMPLE Authentifizierungsschema (eigentlich keine Authentifizierung) funktioniert es gut.

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

Ich suchte nach Hadoop Konfigurationsparametereinstellungen und ich bekomme keine sinnvollen Erklärungen. Bedeutet hbase Benutzer in conf.set. Wo kann ich alle Erklärungen der Hadoop-Klasse bekommen nicht nur Klassen. Irgendwelche Links bitte? –

+1

'org.apache.hadoop.security.UserGroupInformation' ist hier eine Schlüsselklasse und erlaubt die Angabe von 'remote user' über' createRemoteUser() '. Daher sieht der Hadoop-Cluster Sie als Benutzer, den Sie unabhängig von Ihrem lokalen Benutzer angegeben haben. Dies funktioniert natürlich nur, wenn Ihr Hadoop-Cluster Ihnen vertraut (SIMPLE-Authentifizierung, eigentlich keine). Mit Kerberous müssen Sie zusätzlich Beweise vorlegen. –

+0

Ich habe dies versucht, aber ich bekomme java.lang.UnsupportedOperationException: Nicht durch die Implementierung von DistributedFileSystem FileSystem implementiert – AbtPst

0

Wenn ich Sie richtig verstanden habe, wollen Sie nur das Home-Verzeichnis des Benutzers, wenn angegeben, und nicht den Whois-Benutzer.

Setzen Sie in Ihrer Konfigurationsdatei Ihre homedir-Eigenschaft auf user/$ {user.name}. Stellen Sie sicher, dass Sie eine Systemeigenschaft namens user.name haben

Das funktionierte in meinem Fall.

Ich hoffe, das ist, was Sie tun möchten, wenn Sie nicht einen Kommentar hinzufügen.

+0

Ich möchte tatsächlich das gesamte HDFS-Dateisystem durchsuchen, wie was Hue tut. d. h. der hdfs-Benutzer sein. – Kong

Verwandte Themen