web-dev-qa-db-ja.com

Java webappに埋め込まれたクライアントのhadoopシステムユーザーを設定する

MapReduceジョブをJava WebアプリケーションからリモートHadoopクラスターに送信したいのですが、ジョブを送信するユーザーを指定できません。システムユーザーを構成して使用したいこれはすべてのMapReduceジョブに使用する必要があります。

現在、クライアントシステムの現在ログインしているユーザーのユーザー名で実行されているhadoopジョブに関係なく、ユーザーを指定できません。これにより、メッセージでエラーが発生します

_Permission denied: user=alice, access=WRITE, inode="staging":hduser:supergroup:rwxr-xr-x
_

...ここで、「alice」は、クライアントマシンにログインしているローカルユーザーです。

私が試してみました

  1. UserGroupInformationインスタンス(プロキシと通常ユーザーの両方)を作成するさまざまな組み合わせ
  2. Javaシステムプロパティを_-Duser.name=hduser_で設定し、USER envarを変更し、ハードコードされたSystem.setProperty("user.name", "hduser")呼び出しとして).

... 無駄に。 1)に関しては、これらのクラスがどのように使用されるかについての手がかりがないことを認めます。また、Javaシステムプロパティを変更することは、Webアプリケーションで使用するための実際のソリューションではないことに注意してください。

Hadoopがリモートシステムへの接続に使用するユーザーを指定する方法を知っている人はいますか?

PS/Hadoopはデフォルトの構成を使用しています。つまり、クラスターへの接続時に認証は使用されず、リモートマシンとの通信にはKerberosは使用されません。

29

最後に私は定数につまずいた

_static final String HADOOP_USER_NAME = "HADOOP_USER_NAME";`
_

_UserGroupInformation class_で。

これを環境変数として、Java起動時のシステムプロパティ(_-D_を使用)またはSystem.setProperty("HADOOP_USER_NAME", "hduser");を使用してプログラムで)を設定すると、Hadoopが任意のユーザー名を使用しますリモートHadoopクラスターに接続します。

45

以下のコードは私と同じように機能します

System.setProperty("HADOOP_USER_NAME", "hduser")
UserGroupInformation ugi = UserGroupInformation.createRemoteUser("hduser"); 
ugi.doAs(new PrivilegedExceptionAction<Void>() {
    public Void run() throws Exception {
        Configuration configuration = new Configuration(); 
        configuration.set("hadoop.job.ugi", "hduser");
        int res = ToolRunner.run(configuration, new YourTool(), args);
        return null; 
    }
});
6
volhv

セキュアな偽装機能を使用して同様の問題を解決できます http://hadoop.Apache.org/docs/stable1/Secure_Impersonation.html

以下はコードスニペットです

UserGroupInformation ugi = UserGroupInformation.createProxyUser("hduser", UserGroupInformation.getLoginUser()); 

ugi.doAs(new PrivilegedExceptionAction() { 
public Void run() throws Exception { 
  Configuration jobconf = new Configuration(); 
  jobconf.set("fs.default.name", "hdfs://server:hdfsport"); 
  jobconf.set("hadoop.job.ugi", "hduser"); 
  jobconf.set("mapred.job.tracker", "server:jobtracker port"); 
  String[] args = new String[] { "data/input", "data/output" }; 
  ToolRunner.run(jobconf, WordCount.class.newInstance(), args); 
  return null; 
} });

上記のURLで述べたように、リモート(私の場合はWindowsデスクトップホスト)ログインユーザーIDをcore-site.xmlに追加する必要があります

2
kiran