CDH4b2におけるWebHDFSとHttpFsについて
CDH4b2でWebHDFSとHttpFsについていろいろ試しているので、分かっている内容をまとめてみる。なお注意点だが、各々以下のような状況であることに注意。
HttpFsはコードとしてはClouderaオリジナルのHoopのものがベースになっているんだろうし、アーキテクチャ自体も同じ(詳しくは以前のエントリを参照のこと)だけど、細かいところがあちこち異なっているので注意が必要。
またCDH4ベースなのでCDH3ベースのものとは特に性能特性が異なる可能性が高い、が、性能特性についてはまた別に。
HTTP API
WebHDFSのAPIは年初に確認したときから変わっていない。
HttpFsのHTTP APIはHoopとして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は簡単に動いていいなあ、とかは思う。
ところでそろそろ誰か自分以外にも試しませんか。