読者です 読者をやめる 読者になる 読者になる

Hadoop管理画面のリバースプロキシ設定

Hadoopの管理画面はそれぞれデフォルトでは以下のポートで動きますが、それぞれのポートを開けるのが面倒だったり、
リンクで使われるのが内部ネットワークでのホスト名になっているため、外向けのホスト名と違う場合はリンクを押しても繋がらなかったりします。

  • NameNode
    • 50070
  • DataNode
    • 50075
  • JobTracker
    • 50030
  • TaskTracker
    • 50060

そのためApache等でリバースプロキシの設定をして一つのサーバからアクセス出来るようにしたいところですが、結構苦労したのでまとめておきます。正直微妙なところもあるので、もっといい方法があれば教えて下さい。

それぞれ以下のようなURLでアクセス出来るようにしたいと思います。

  • NameNode
    • http//リバースプロキシのホスト名/hadoop/name/NameNodeのホスト名/
  • DataNode
    • http//リバースプロキシのホスト名/hadoop/data/DataNodeのホスト名/
  • JobTracker
    • http//リバースプロキシのホスト名/hadoop/job/JobTrackerのホスト名/
  • TaskTracker
    • http//リバースプロキシのホスト名/hadoop/task/TaskTrackerのホスト名/

リバースプロキシの設定(mod_rewrite)

mod_rewriteが入っていれば以下のように設定するだけです。

RewriteEngine On
RewriteRule ^/hadoop/name/([^/]*)/(.*)$ http://$1:50070/$2 [P,L,QSA]
RewriteRule ^/hadoop/data/([^/]*)/(.*)$ http://$1:50075/$2 [P,L,QSA]
RewriteRule ^/hadoop/job/([^/]*)/(.*)$ http://$1:50030/$2 [P,L,QSA]
RewriteRule ^/hadoop/task/([^/]*)/(.*)$ http://$1:50060/$2 [P,L,QSA]

リダイレクト対策

ステータス302を使ったリダイレクトで内部のホスト名・ポートを指定されている場合があります。
ProxyPassReverseを使えば書き換えできるのですが、正規表現が使えないようだったのでmod_headersで書き換えます。

Header edit Location ^http://([^:]*):50070/(.*)$ /hadoop/name/$1/$2
Header edit Location ^http://([^:]*):50075/(.*)$ /hadoop/data/$1/$2
Header edit Location ^http://([^:]*):50030/(.*)$ /hadoop/job/$1/$2
Header edit Location ^http://([^:]*):50060/(.*)$ /hadoop/task/$1/$2

リンク対策(ホスト名からの絶対パス)

JobTrackerからTaskTrackerへのリンクなどでは別ホストになっているため、リンクの中身がホスト名から記述されています。
これを書き換えるのにmod_proxy_htmlを使用します。標準では入っていないと思うので設定の前にインストールが必要です。インストール方法は公式サイト参照。

ProxyHTMLEnable On
ProxyHTMLURLMap ^http://([^:]*):50070/(.*)$ /hadoop/name/$1/$2 [R,x,l,e,c]
ProxyHTMLURLMap ^http://([^:]*):50075/(.*)$ /hadoop/data/$1/$2 [R,x,l,e,c]
ProxyHTMLURLMap ^http://([^:]*):50030/(.*)$ /hadoop/job/$1/$2 [R,x,l,e,c]
ProxyHTMLURLMap ^http://([^:]*):50060/(.*)$ /hadoop/task/$1/$2 [R,x,l,e,c]

リンク対策(/からの絶対パス)

/からの絶対パスで書かれたリンクも書き換えてやる必要があります。
LocationMatchで書き換えようと思ったのですが、これは正規表現で一致した文字列を後で$1のように使うことが出来ないようでした。
なのでとりあえず絶対パスをディレクトリの深さに応じて相対パスに書き換えるようにしてみました。


ProxyHTMLURLMap / ../


ProxyHTMLURLMap / ./

とりあえず/の下は今のところ一階層しかディレクトリを使っていないようなのでこれで済むと思いますが、
二階層のディレクトリに対応する場合は以下のように増やしてやる必要があります。
パラメータをREST風に渡すようになったらもう無理ですw


ProxyHTMLURLMap / ../../

以上の設定をすると、リバースプロキシになっているホストさえ見えていれば管理画面の機能に一通りアクセス出来ると思います。
ちなみになぜかchromeだとhttp//リバースプロキシのホスト名/hadoop/name/NameNodeのホスト名/とかhttp//リバースプロキシのホスト名/hadoop/name/NameNodeのホスト名/index.htmlにアクセスするとエラーになります。http//リバースプロキシのホスト名/hadoop/name/NameNodeのホスト名/dfshealth.jspは大丈夫なんですが…。
FirefoxやInternetExplorerは前者でも大丈夫なのに謎です。