HttpFSのコマンド(REST API)のメモ。
|
REST APIなので、コマンド(URI)をブラウザーのURL欄に入力したり、wgetやcurlコマンドを使うことで実行する。
$ 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"}}
コマンドを実行したときに、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での設定で通るようになっているものを指定するのだと思う。
(今は全部「*」にしてあるので、ユーザー名に何を指定しても通る^^;)
コマンドを実行したときに、以下のようなエラーが返る場合、
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でアクセスされると、
という手順を踏んでいるのだと思う。
したがって、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
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 |