いくつかの研究の後、私は次の解決策にたどり着きました:
- 実際には完全な 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 ソリューションに固有の情報はありませんが、問題の基本的な理解には役立ちます。
更新:ローカルユーザーを必要とせずにコマンドラインまたはユーティリティ
を使用する人の代替:hdfs
hadoop
HADOOP_USER_NAME=hdfs hdfs fs -put /root/MyHadoop/file1.txt /
実際に行うことは、ローカルのアクセス許可に従ってローカル ファイルを読み取ることですが、ファイルを HDFS に配置するときは user のように認証されますhdfs
。
これには、図示されている API コードと非常によく似たプロパティがあります。
- 必要ありません
sudo
。
- 実際に適切なローカル ユーザー「hdfs」は必要ありません。
- 以前のポイントのため、何もコピーしたり、権限を変更したりする必要はありません。