30

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

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

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

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

私が試してみました

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

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

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

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

4

3 に答える 3

47

最後に、私は定数に出くわしました

static final String HADOOP_USER_NAME = "HADOOP_USER_NAME";`

UserGroupInformation class

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

于 2012-06-16T10:08:24.923 に答える
6

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

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; 
    }
});
于 2013-03-21T11:57:59.077 に答える
2

安全な偽装機能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 に追加する必要があります。

于 2012-06-26T17:30:17.200 に答える