2013-05-27 20 views
9

我高興地連接到HDFS和上市我的主目錄:HDFS - 指定用戶

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

什麼,我想現在要做的是,雖然作爲連接特定用戶(而不是域名註冊用戶)。有誰知道你如何指定你連接的用戶?

+0

您好我試過這個代碼連接到遠程HDFS實例,但我得到的異常在線程「主要」 java.lang.UnsupportedOperationException:未經DistributedFileSystem文件系統實現 – AbtPst

+0

實現你知道如何解決此問題? – AbtPst

+0

2年前我問過這個問題。自那時以來,Hadoop已經走過了很長一段路。就確切的實現而言,事情現在很可能以不同的方式完成。 – Kong

回答

22

只要我看到這是通過UserGroupInformation類和PrivilegedActionPrivilegedExceptionAction完成。這裏是示例代碼,以連接到遠程HDFS'喜歡'不同的用戶(在這種情況下'hbase')。希望這會解決你的任務。如果您需要使用身份驗證的完整方案,則需要改進用戶處理。但對於SIMPLE身份驗證方案(實際上沒有身份驗證),它工作得很好。

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

我搜索了hadoop配置參數設置,我沒有得到任何有用的解釋。 hbase是否意味着conf.set中的用戶。我在哪裏可以獲得所有hadoop課程的解釋,而不僅僅是課程。任何鏈接請? –

+1

'org.apache.hadoop.security.UserGroupInformation'是關鍵類,它允許通過'createRemoteUser()'指定'遠程用戶'。因此Hadoop集羣將您視爲您指定的本地用戶nidependent的用戶。當然這隻有在你的Hadoop集羣信任你時纔有效(SIMPLE認證,實際上沒有)。有了Kerberous,你還需要提供證明。 –

+0

我試過這個,但我得到java.lang.UnsupportedOperationException:沒有實現DistributedFileSystem FileSystem實現 – AbtPst

0

如果我得到了正確的答案,那麼只需指定用戶的主目錄,而不是指定whois用戶。

在您的配置文件中,將您的homedir屬性設置爲user/$ {user.name}。確保你有一個名爲user.name的系統屬性

這工作在我的情況。

我希望這是你想要做的,如果沒有添加評論。

+0

我實際上想瀏覽整個HDFS文件系統,就像Hue所做的那樣。即是hdfs用戶。 – Kong