10

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

質問は: - Java API で「単純な」認証を使用して別のユーザー名を表す方法はありますか? - Hadoop / HDFS での認証 / 認可スキームについて、Java API の例で望ましい説明を教えてください。

はい、この場合、シェルエイリアスを使用して「whoami」が過負荷になる可能性があることは既に知っていますが、このような解決策は避けたいと思います。また、ここでの詳細は、SSH やスクリプトを介したパイプなどのいくつかのトリックの使用が嫌いであることです。Java API だけを使用してすべてを実行したいと考えています。前もって感謝します。

4

1 に答える 1

15

いくつかの研究の後、私は次の解決策にたどり着きました:

  • 実際には完全な 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 のブログ記事「Hadoop での承認と認証」。短く、Hadoop セキュリティ アプローチの簡単な説明に焦点を当てています。Java API ソリューションに固有の情報はありませんが、問題の基本的な理解には役立ちます。

更新:ローカルユーザーを必要とせずにコマンドラインまたはユーティリティ
を使用する人の代替:hdfshadoop

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

実際に行うことは、ローカルのアクセス許可に従ってローカル ファイルを読み取ることですが、ファイルを HDFS に配置するときは user のように認証されますhdfs

これには、図示されている API コードと非常によく似たプロパティがあります。

  1. 必要ありませんsudo
  2. 実際に適切なローカル ユーザー「hdfs」は必要ありません。
  3. 以前のポイントのため、何もコピーしたり、権限を変更したりする必要はありません。
于 2013-04-11T06:54:05.400 に答える