S-JIS[2012-09-29] 変更履歴

HttpFS REST API

HttpFSのコマンド(REST API)のメモ。


使い方

REST APIなので、コマンド(URI)をブラウザーのURL欄に入力したり、wgetcurlコマンドを使うことで実行する。

$ wget "http://サーバー:14000/webhdfs/v1〜"
$ curl "http://サーバー:14000/webhdfs/v1〜"

wgetを使うとファイルが作られる。
URIを元にファイル名が決まるので、ファイル名に「?」や「&」が含まれてしまう。「-O」オプションで出力ファイル名を指定した方が良さそう。

curlだとボディー部のみが画面に出力される。
「-i」オプションを付けるとヘッダー情報も表示される。
また、APIによってはHTTPのGETメソッドでなくPUTやDELETEを使うことがある。curlなら「-X」で指定できる。


URIに「http://サーバー:14000」だけ指定すると、以下のようなメッセージが返ってくる。

HttpFs service, service base URL at /webhdfs/v1.

URIに「ベースURLとして/webhdfs/v1という文字列を含めろ」という意味。

HttpFSのAPIはWebHDFSと互換性があるように設計されているらしい。
APIのURIに「webhdfs/v1」という文字列が入ってくるのはその為だと思われる。


URIに「http://サーバー:14000/webhdfs/v1」だけ指定すると、以下のようなメッセージが返ってくる。

{"RemoteException":{"message":"Missing Operation parameter [op]","exception":"IllegalArgumentException","javaClassName":"java.lang.IllegalArgumentException"}}

HttpFSのAPIでは「op=命令」でどのような操作をするのか指定する必要がある。

認識できない命令を指定すると、以下のようなエラーになる。

"http://サーバー:14000/webhdfs/v1?op=gethomedir"
↓
{"RemoteException":{"message":"java.lang.IllegalArgumentException: No enum const class org.apache.hadoop.fs.http.client.HttpFSFileSystem$Operation.GETHOMEDIR","exception":"QueryParamException","javaClassName":"com.sun.jersey.api.ParamException$QueryParamException"}}

401エラー

コマンドを実行したときに、HTTPレスポンスコード401が返ってくることがある。

タイトル HTTPステータス 401 - org.apache.hadoop.security.authentication.client.AuthenticationException: Anonymous requests are disallowed
type ステータスレポート
メッセージ org.apache.hadoop.security.authentication.client.AuthenticationException: Anonymous requests are disallowed
説明 This request requires HTTP authentication (org.apache.hadoop.security.authentication.client.AuthenticationException: Anonymous requests are disallowed).

HTTPのユーザー認証が必要だということらしい。


HttpFSの設定でKerberos認証するようにしていない場合は、URIにuser.nameを指定する。
(参考: grokbaseのhttpfs not able to find NN though /etc/hadoop/conf has it

curl "http://サーバー:14000/webhdfs/v1?op=gethomedirectory&user.name=hishidama"
curl "http://サーバー:14000/webhdfs/v1?user.name=hishidama&op=gethomedirectory"

ユーザー名は、hadoop.proxyuserでの設定で通るようになっているものを指定するのだと思う。
(今は全部「*」にしてあるので、ユーザー名に何を指定しても通る^^;)


impersonateエラー

コマンドを実行したときに、以下のようなエラーが返る場合、

curl "http://サーバー:14000/webhdfs/v1?op=gethomedirectory&user.name=hishidama"
↓
{"RemoteException":{"message":"User: hdfs is not allowed to impersonate hishidama","exception":"RemoteException","javaClassName":"org.apache.hadoop.ipc.RemoteException"}}

HttpFSがhdfsユーザーで起動していて、core-site.xmlの設定hishidamaがアクセス許可されない状態になっている。
impersonateというのは、「演じる」「他人を装う」「なりすます」という単語らしい。hdfsがhishidamaの代行を出来ないという意味か?


たぶん、REST APIでアクセスされると、

  1. HttpFSを起動したユーザーを確認する。(今回はhdfs
  2. core-site.xmlのhadoop.proxyuser.hdfs.groupsやhadoop.proxyuser.hdfs.hostsを見て、APIで指定されたhishidamaユーザーがアクセスできるかどうかチェックする。

という手順を踏んでいるのだと思う。
したがって、hadoop.proxyuserのプロパティー名がHttpFS起動時のユーザー名と異なっていると、このエラーになる。

core-site.xmlを修正するか、HttpFSを別ユーザーで起動し直すことになるだろう。
core-site.xmlを修正した場合は、Hadoopを再起動する必要がある。(自分はNameNode上にHttpFSをインストールしたので、namenodeデーモンだけ再起動すれば大丈夫だった)

# /etc/init.d/hadoop-0.20-namenode restart
# su - 当初のユーザー
$ /usr/lib/hadoop-hdfs-httpfs-0.20.2-cdh3u5-SNAPSHOT/sbin/httpfs.sh stop
$ exit
# su - hdfs
$ /usr/lib/hadoop-hdfs-httpfs-0.20.2-cdh3u5-SNAPSHOT/sbin/httpfs.sh start

REST API

APIのコマンド(「op=」で指定するもの)は、大文字でも小文字でも大丈夫なようだ。
コマンドによってはオプション(引数)があるので、APIドキュメントを参照。

コマンドの実行結果はJSON形式で返ってくる。

主な操作
操作 HTTP 返り値 hadoop相当
GETHOMEDIRECTORY
ホームディレクトリー取得
GET curl "http://host:14000/webhdfs/v1/?op=gethomedirectory" {"Path":"\/user\/hishidama"}  
LISTSTATUS
ファイル一覧取得
GET curl "http://host:14000/webhdfs/v1/user/hishidama?op=liststatus" ファイル・ディレクトリー情報の一覧
pathSuffixがファイルやディレクトリー名
hadoop fs -ls /user/hishidama
GETFILESTATUS
ファイル情報取得
GET curl "http://host:14000/webhdfs/v1/user/hishidama/test.txt?op=getfilestatus" ファイル情報 hadoop fs -ls /user/hishidama/test.txt
OPEN
ファイル読み込み
GET curl "http://host:14000/webhdfs/v1/user/hishidama/test.txt?op=open" ファイルの内容 hadoop fs -cat /user/hishidama/test.txt
CREATE
ファイル作成
PUT curl -X PUT "http://host:14000/webhdfs/v1/user/hishidama/aaa.txt?op=create&data=true" -T a.txt --header "content-type: application/octet-stream" JSONオブジェクトは無し hadoop fs -put a.txt /user/hishidama/aaa.txt
curl -X PUT "http://host:14000/webhdfs/v1/user/hishidama/aaa.txt?op=create&data=true" --data-binary @a.txt --header "content-type: application/octet-stream"
MKDIRS
ディレクトリー作成
PUT curl -X PUT "http://host:14000/webhdfs/v1/user/hishidama/zzz?op=mkdirs" {"boolean":true} hadoop fs -mkdir /user/hishidama/zzz
RENAME
改名
PUT curl -X PUT "http://host:14000/webhdfs/v1/user/hishidama/zzz?op=rename&destination=/user/hishidama/zzz2" {"boolean":true} hadoop fs -mv /user/hishidama/zzz /user/hishidama/zzz2
DELETE
削除
DELETE curl -X DELETE "http://host:14000/webhdfs/v1/user/hishidama/test.txt?op=delete" {"boolean":true} hadoop fs -rm /user/hishidama/test.txt
curl -X DELETE "http://host:14000/webhdfs/v1/user/hishidama/zzz2?op=delete&recursive=true" {"boolean":true} hadoop fs -rmr /user/hishidama/zzz2

HttpFSへ戻る / Hadoopへ戻る / 技術メモへ戻る
メールの送信先:ひしだま