web-dev-qa-db-ja.com

Java API、ユーザー認証を介したリモートホストからのHDFSアクセス

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

質問は次のとおりです。-Java API)で「単純な」認証を使用して異なるユーザー名を表す方法はありますか?-hadoop/HDFSでの認証/承認スキームの適切な説明を教えてください。 Java APIの例?

はい、シェルエイリアスを使用してこの場合に「whoami」がオーバーロードされる可能性があることはすでに知っていますが、このようなソリューションは避けたいと思います。また、ここでの詳細は、SSHやスクリプトを介したパイプのようないくつかのトリックの使用が嫌いです。 Java APIだけですべてを実行したいのですが。よろしくお願いします。

10

いくつか勉強した後、私は次の解決策に到達しました:

  • 実際には完全なKerberosソリューションは必要ありません。現在、クライアントは任意のユーザーからHDFS要求を実行できれば十分です。環境自体は安全であると見なされます。
  • これにより、hadoopUserGroupInformationクラスに基づくソリューションが得られます。将来的には、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ソリューションに固有の情報はありませんが、問題の基本的な理解には役立ちます。

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

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

実際に行うことは、ローカル権限に従ってローカルファイルを読み取ることですが、ファイルをHDFSに配置するときは、ユーザーhdfsのように認証されます。

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

  1. Sudoは必要ありません。
  2. 実際に適切なローカルユーザー「hdfs」は必要ありません。
  3. 以前のポイントのために、何かをコピーしたり、権限を変更したりする必要はありません。
15