Hadoop と対話する Web アプリケーションがあります。(Cloudera cdh3u6) 特定のユーザー操作により、クラスター内で新しい Map Reduce ジョブが起動される必要があります。
クラスターは安全なクラスターではありませんが、単純なグループ認証を使用しているため、自分で SSH 接続すると、コマンド ラインから MR ジョブを起動できます。
Web アプリケーションでは、 を使用しToolRunner
てジョブを実行しています。
MyMapReduceWrapperClass mr = new MyMapReduceWrapperClass();
ToolRunner.run(mr, null);
// inside the run implementation of my wrapper class :
Job job = new Job(conf, "job title");
//set up stuff removed
job.submit();
現在、このジョブは、Web アプリケーション サーバー (Tomcat) プロセスを起動したユーザーとして送信されます。このユーザーは、ジョブをクラスターに送信する権限を持たないこの Web サーバー上の特別なローカル アカウントです。
理想的には、ユーザーからある種の ID を取得してそれを渡すことができるようにしたいと考えています。これにより、さまざまなユーザーが Web アプリ/サービスと対話しているときに、誰がどのジョブを呼び出しているかを確認できます。これらの資格情報サービスを実際に調整する方法の問題をスキップすると、それがどこに行くのかさえはっきりしません。
Job
オプションがあることがわかりましたgetCredentials()
が、そこにあるトークン/ Kerberosのものについて読んだところ、これはセキュアなクラスター用であるという印象を受けました(私たちはそうではないと思います)-言うまでもなく、私のWebサーバーはそうではないと思いますKerberos がインストールされています。しかし、それは修正される可能性があります。しかし、意図されたユースケースは、実行中に他のサービスにアクセスするために map reduce ジョブが必要とする可能性のあるシークレットを追加することであるようにも思えます。ジョブを他の誰かとして実行することではありません。
また、(古い?)JobConf
クラスでsetUser(String name)
は、パスワードなどが必要な場所がわからないにもかかわらず、有望と思われる機能があることもわかりますが、その機能に関する多くの情報やドキュメントを見つけることができません。試してみましたが、影響はありませんでした。ジョブは引き続き Tomcat ユーザーとして送信されました。
探求または調査する他の方法はありますか? Google へのキーワードが不足しています。「Tomcat ユーザーにクラスターのアクセス許可を与えるだけ」というオプションがないようにしたいと思います。私はその資産を管理しておらず、その要求が飛ぶとは思っていません。ただし、文字通りそれが私の唯一の選択肢である場合、その理由を理解したいので、正しい情報を持って必要性を主張できます。