2013-04-11 34 views
10

我需要通過Java API從遠程桌面使用HDFS集羣。一切正常,直到寫入訪問。如果我試圖創建任何文件,我會收到訪問權限異常。路徑看起來不錯,但異常表明我的遠程桌面用戶名當然不是我需要訪問所需的HDFS目錄。通過Java API從遠程主機進行HDFS訪問,用戶認證

現在的問題是: - 有沒有什麼方法可以在Java API中使用'簡單'認證來表示不同的用戶名? - 您能否在使用Java API示例時更好地解釋hadoop/HDFS中的認證/授權方案?

是的,我已經知道'whoami'可能在這種情況下使用shell別名重載,但我更喜歡避免這樣的解決方案。這裏還有一些細節是我不喜歡使用一些技巧,比如通過SSH和腳本進行管道操作。我想用Java API來執行所有的事情。 預先感謝您。

回答

14

經過一番學習我來到了以下解決方案:

  • 我實際上並不需要完整的解決方案的Kerberos,這是不夠目前客戶端可以運行任何用戶HDFS請求。環境本身被認爲是安全的。
  • 這給了我基於hadoop UserGroupInformation類的解決方案。將來我可以擴展它以支持Kerberos。

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

    有用的參考那些誰也有類似的問題:

    • Cloudera的博客文章「

    示例代碼可能爲人們既爲「假認證」和遠程HDFS訪問有用Authorization and Authentication In Hadoop「。簡而言之,重點介紹hadoop安全方法的簡單解釋。沒有特定於Java API解決方案的信息,但對基本理解問題很有幫助。

UPDATE:
替代那些誰使用命令行hdfshadoop公用程序,而不需要本地用戶:

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

你真正要做的就是你讀按照本地文件到您的本地權限,但是當將文件放置在HDFS上,您可以像用戶hdfs那樣進行身份驗證。

這已經非常相似性質的API代碼所示:

  1. 你不需要sudo
  2. 您不需要實際適當的本地用戶'hdfs'。
  3. 由於以前的觀點,您不需要複製任何內容或更改權限。
+0

我已經偶然發現了和你一樣的問題。我試圖將Hadoop作業從遠程客戶端發送到將執行它的集羣。在我的情況下,問題是** Cloudera的Hadoop 2.0.0(Hadoop 2.0.0-cdh4.3.1)不提供您使用的UserGroupInformation類**。看來相應的Apache Hadoop版本也不提供它。只有一個名爲UserGroupInformation的枚舉 - [link](http://archive.cloudera.com/cdh4/cdh/4/hadoop/api/org/apache/hadoop/security/UserGroupInformation.AuthenticationMethod.html)。在你看來,這樣的情況下怎麼可能呢? – falconepl 2013-09-05 11:39:20

+0

它在那裏,只是它不是cloudera。我現在使用2.0.0-cdh4.3.1 hadoop客戶端。 – 2013-09-05 15:26:46

+0

你說什麼在那裏意味着什麼?我已經檢查了Apache Hadoop 2.0.6 API [[link](http://hadoop.apache.org/docs/r2.0.6-alpha/api/index.html)]以及2.1.0 API [[link ](http://hadoop.apache.org/docs/r2.1.0-beta/api/index.html)](Apache在他們的網站上提供的那些Javadocs),不幸的是沒有UserGroupInformation類,只是enum這並沒有多大幫助。順便說一下,您提到Cloudera的Hadoop發行版不是'2.0.0-cdh4.3.1' Hadoop嗎? – falconepl 2013-09-05 15:57:01

相關問題