たごもりすメモ

コードとかその他の話とか。

CDH4b2におけるWebHDFSとHttpFsについて

CDH4b2でWebHDFSとHttpFsについていろいろ試しているので、分かっている内容をまとめてみる。なお注意点だが、各々以下のような状況であることに注意。

WebHDFS
たぶんHadoop 1.0ベース
HttpFs
たぶんHadoop 0.23ベース(あるいは 2.0 alpha ベース) でHoopとは別物

HttpFsはコードとしてはClouderaオリジナルのHoopのものがベースになっているんだろうし、アーキテクチャ自体も同じ(詳しくは以前のエントリを参照のこと)だけど、細かいところがあちこち異なっているので注意が必要。
またCDH4ベースなのでCDH3ベースのものとは特に性能特性が異なる可能性が高い、が、性能特性についてはまた別に。

HTTP API

WebHDFSのAPIは年初に確認したときから変わっていない。

HttpFsのHTTP APIHoopとしてClouderaが公開したものからは大きく変わっている。
というか、もっと言うと、ほとんど WebHDFS のAPIに準拠するようになっている。パスの先頭には /webhdfs/v1 とつき、またHTTPリクエストメソッドでHoopとWebHDFSで違いがあった部分はほとんど(すべて?)WebHDFSのものに合わせる形で変更されている。
で、それが実際どう変更されたかはHTTP REST APIリファレンスを見ればよい、と思うんだが、それが公開されていない。どこにもない。こまった。今のところは手探りでリクエストを発行してみて確認するしかない。

また、実際にデータの転送が起きるリクエスト(ファイルの作成、データのappend)において、アクセスパターンに以下のように変更がある。

Hoop
リクエストが受け付けられ、ファイルが作成/追記され、201/200が返る
HttpFs
リクエストに対してリダイレクトがレスポンスとして返り、Locationで指定されたURLに対して改めてリクエストすることでファイルが作成/追記され、201/200が返る

HttpFsの挙動、まるでWebHDFSみたい……。が Location が返るURLをちゃんと見ると、リクエストパラメータに data=true というものが加わっているだけだった。新設されたパラメータらしい。これを最初からつけてリクエストを送ると一発で 201/200 が返るようになったので、そのようなものだと理解しておけばいいのかもしれない。*1

好意的に見ておけば、WebHDFS用のクライアントライブラリとHttpFs用のクライアントライブラリは全く同じものを使えるようにこうなっている、のかもしれない。細かいパラメータの一致までは見られていないが、もしきちんと一致がとれているのであれば可能になる。現状見た限りでは、可能になっていそうな雰囲気を感じる。

セットアップ

WebHDFS

WebHDFSは NameNode/DataNode で元々動いているWebサーバ(Webコンソールとか出すやつね)がそのまま処理するため、使うには設定をひとつ有効にするだけでいい。

<!-- in hdfs-site.xml -->
<configuration>
  ...
  <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
  </property>
</configuration>

これを変更して NameNode および DataNode を再起動すると有効になる。アクセス先のポートは(CDHのデフォルトなら) NameNode の 50070。

HttpFs

HttpFsは独自のサーバプロセスを起動することになる。それ自体は Hadoop Core のパッケージ*2に含まれている。設定はHadoop側とHttpFs用のものとでいくつか必要。

まずHadoopクラスタ側の core-site.xml でHttpFsがアクセスするユーザの設定。めんどくさいのでとりあえず全通し。

<!-- core-site.xml -->
<configuration>
  ...
  <property>
    <name>hadoop.proxyuser.USERNAME.hosts</name>
    <value>*</value>
  </property>
  <property>
    <name>hadoop.proxyuser.USERNAME.groups</name>
    <value>*</value>
  </property>
</configuration>

それからHttpFsがHadoopクラスタの情報を参照するための設定を、HttpFs側の httpfs-site.xml で行う。これはHoopのときは直接NameNodeのアドレスを指定する設定項目だったが、HttpFsでは HADOOP_CONF_DIR を指定しておけばHttpFs側で読んでくれるようになった。

<!-- httpfs-site.xml -->
<configuration>
  <property>
    <name>httpfs.hadoop.config.dir</name>
    <value>/path/to/hadoop/conf/dir</value>
  </property>
</configuration>

これを指定したら以下のコマンドで起動する。起動後はそのサーバのポート 14000 にアクセスすれば使える。

$ sbin/httpfs.sh start

雑感

まあ、まだどうなるかよくわからんすね。WebHDFSは簡単に動いていいなあ、とかは思う。
ところでそろそろ誰か自分以外にも試しませんか。

*1:これは実はやってはいけない操作だという可能性もある、が、リファレンスが出ないことにはなんともわからん。

*2:CDH4b2の場合は hadoop パッケージ