Java APIを介してリモートデスクトップからHDFSクラスターを使用する必要があります。書き込みアクセスに関してはすべて問題なく動作します。ファイルを作成しようとすると、アクセス許可の例外が発生します。パスは良好に見えますしかし、例外は私のリモートデスクトップユーザー名を示しています。これはもちろん、必要なHDFSディレクトリにアクセスするために必要なものではありません。
質問は次のとおりです。-Java API)で「単純な」認証を使用して異なるユーザー名を表す方法はありますか?-hadoop/HDFSでの認証/承認スキームの適切な説明を教えてください。 Java APIの例?
はい、シェルエイリアスを使用してこの場合に「whoami」がオーバーロードされる可能性があることはすでに知っていますが、このようなソリューションは避けたいと思います。また、ここでの詳細は、SSHやスクリプトを介したパイプのようないくつかのトリックの使用が嫌いです。 Java APIだけですべてを実行したいのですが。よろしくお願いします。
いくつか勉強した後、私は次の解決策に到達しました:
「偽の認証」とリモート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();
}
}
}
同様の問題を抱えている人のための便利なリファレンス:
更新:
ローカルユーザーを必要とせずにコマンドラインhdfs
またはhadoop
ユーティリティを使用する場合の代替:
HADOOP_USER_NAME=hdfs hdfs fs -put /root/MyHadoop/file1.txt /
実際に行うことは、ローカル権限に従ってローカルファイルを読み取ることですが、ファイルをHDFSに配置するときは、ユーザーhdfs
のように認証されます。
これは、示されているAPIコードと非常によく似たプロパティを持っています。
Sudo
は必要ありません。