2013-04-11 10 views
10

リモートデスクトップからJava APIを介してHDFSクラスタを使用する必要があります。書き込みアクセスになるまで、すべてが正常に機能します。ファイルを作成しようとしている場合、私はアクセス許可の例外を受け取ります。パスはうまく見えますが、例外は私のリモートデスクトップのユーザー名を示しています。もちろん、必要なHDFSディレクトリにアクセスする必要はありません。リモートホストからJava APIを介したHDFSアクセス、ユーザ認証

質問: - Java APIで「単純」認証を使用して別のユーザー名を表す方法はありますか? - Java APIの例では、hadoop/HDFSの認証/認可スキームの良い説明をお勧めしますか?

はい、私は既に、このケースではシェルエイリアスを使用して 'whoami'がオーバーロードされる可能性があることを知っていますが、このようなソリューションは避けたいと考えています。またここでは、SSHとスクリプトを通してパイプのようなトリックの使い方を嫌っています。私はすべてのJava APIを使用して実行したいと思います。 ありがとうございます。

答えて

14

私は次の解決策に来て、いくつかは学んだ後:

  • 私は実際に完全なKerberosのソリューションを必要としない、それは、クライアントが任意のユーザからHDFSの要求を実行することができ、現在は十分です。環境そのものは安全だと考えられています。
  • これは、私がhadoop UserGroupInformationクラスに基づいた解決策を提供します。将来、Kerberosをサポートするように拡張することができます。

両方の「偽の認証」とリモートHDFSへのアクセスのための人々のために、おそらく便利なサンプルコード:

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のブログ記事 " Authorization and Authentication In Hadoop "。短い、ハープのセキュリティアプローチの簡単な説明に焦点を当てた。 Java APIソリューションに固有の情報はありませんが、問題の基本的な理解には役立ちます。

UPDATE:必要なローカルユーザーせずに、コマンドラインhdfsまたはhadoopユーティリティを使用する人のため
オルタナティブ:

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

あなたが実際に行うことは、あなたの地元の権限に応じたローカルファイルの読み込みですが、ユーザーがhdfsのように認証されたHDFS上にファイルを置く。

これは、APIコードにかなり類似した性質を持っているが示さ:

  1. をあなたがsudoは必要ありません。
  2. 実際には適切なローカルユーザー 'hdfs'は必要ありません。
  3. 以前の点が原因で、何もコピーしたりパーミッションを変更する必要はありません。
+0

私はあなたと同じ問題を偶然見つけました。リモートクライアントからHadoopジョブを実行するクラスタに、Hadoopジョブを送信しようとしています。私の場合、問題は** ClouderaのHadoop 2.0.0(Hadoop 2.0.0-cdh4.3.1)は、あなたが使ったUserGroupInformationクラス**を提供していないということです。それに対応するApache Hadoopのバージョンは、それを提供していないようです。 UserGroupInformation - [リンク](http://archive.cloudera.com/cdh4/cdh/4/hadoop/api/org/apache/hadoop/security/UserGroupInformation.AuthenticationMethod.html)という名前の列挙体があります。そのような場合には、あなたの意見でどうすればできますか? – falconepl

+0

それはそこにあります、ただそれはクロウデラではありません。私は現在、2.0.0-cdh4.3.1のhadoopクライアントを使用しています。 –

+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がWebサイトで提供するJavadoc)、残念ながら 'UserGroupInformation'クラスはなく、列挙型それはあまり役に立たない。ところで、あなたがClouderaのHadoopディストリビューションを言及した '2.0.0-cdh4.3.1' Hadoopではありませんか? – falconepl

関連する問題