🐘
AWS EMRでHDFSにHTTPアクセス(HttpFS編)
環境
emr-6.2.0
us-east-1
HDFSとHTTPアクセス
HDFSでは、
を使うことで、クラスター外からもHDFSにHTTPアクセスすることが出来ます。
APIの形式は同じ?(ドキュメントによると「interoperable」)ですが、通信方法に違いがあり、
- HttpFSはNameNodeを通して通信
- WebHDFSはNameNodeを通してメタデータを取得後、DataNodeと通信
です(詳しくはtagomorisさんの記事)。
この記事ではHttpFSの方の使用例を紹介します。WebHDFSはこちら
準備
クラスタ外からアクセスする時は、セキュリティグループ設定必要です。
(NameNodeへの14000ingress許可)
使ってみる(ls)
# マスタノードからアクセスする時
[hadoop@ip-172-31-0-137 ~]$ curl "http://127.0.0.1:14000/webhdfs/v1/?user.name=hadoop&op=LISTSTATUS" | jq .
# 外部からアクセスする時
$ curl "http://[マスターパブリック DNS]:14000/webhdfs/v1/?user.name=hadoop&op=LISTSTATUS" | jq .
{
"FileStatuses": {
"FileStatus": [
{
"pathSuffix": "apps",
"type": "DIRECTORY",
"length": 0,
"owner": "hdfs",
"group": "hadoop",
"permission": "755",
"accessTime": 0,
"modificationTime": 1618619419577,
"blockSize": 0,
"replication": 0,
"childrenNum": 1,
"fileId": 16386,
"storagePolicy": 0
},
{
"pathSuffix": "tmp",
"type": "DIRECTORY",
"length": 0,
"owner": "hdfs",
"group": "hadoop",
"permission": "1777",
"accessTime": 0,
"modificationTime": 1618619573048,
"blockSize": 0,
"replication": 0,
"childrenNum": 3,
"fileId": 16388,
"storagePolicy": 0
},
{
"pathSuffix": "user",
"type": "DIRECTORY",
"length": 0,
"owner": "hdfs",
"group": "hadoop",
"permission": "755",
"accessTime": 0,
"modificationTime": 1618619419860,
"blockSize": 0,
"replication": 0,
"childrenNum": 6,
"fileId": 16395,
"storagePolicy": 0
},
{
"pathSuffix": "var",
"type": "DIRECTORY",
"length": 0,
"owner": "hdfs",
"group": "hadoop",
"permission": "755",
"accessTime": 0,
"modificationTime": 1618619419869,
"blockSize": 0,
"replication": 0,
"childrenNum": 1,
"fileId": 16403,
"storagePolicy": 0
}
]
}
}
使ってみる(アップロード)
- Content-Typeヘッダー( -H "Content-Type: application/octet-stream" )
- -Lオプション
- ステータスコードが30xの時、リダイレクトに従うオプション
を指定する必要がありそうです。
echo hoge > hoge
curl -L -i -XPUT -T hoge -H "Content-Type: application/octet-stream" "http://[マスターパブリック DNS]:14000/webhdfs/v1/user/hadoop/hoge?user.name=hadoop&op=CREATE"
HTTP/1.1 100 Continue
HTTP/1.1 307 Temporary Redirect
Date: Sat, 17 Apr 2021 05:11:17 GMT
Cache-Control: no-cache
Expires: Sat, 17 Apr 2021 05:11:17 GMT
Date: Sat, 17 Apr 2021 05:11:17 GMT
Pragma: no-cache
Content-Type: application/json;charset=utf-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Set-Cookie: hadoop.auth="u=hadoop&p=hadoop&t=simple-dt&e=1618672277382&s=/me3wbECk6VZDCDjRu6lqtklNeCxSER8fC21zgqbv1U="; Path=/; HttpOnly
Location: http://[マスターパブリック DNS]:14000/webhdfs/v1/user/hadoop/hoge?op=CREATE&data=true&user.name=hadoop
Content-Length: 0
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Date: Sat, 17 Apr 2021 05:11:18 GMT
Cache-Control: no-cache
Expires: Sat, 17 Apr 2021 05:11:18 GMT
Date: Sat, 17 Apr 2021 05:11:18 GMT
Pragma: no-cache
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Set-Cookie: hadoop.auth="u=hadoop&p=hadoop&t=simple-dt&e=1618672278167&s=gsnNYqxPwZbVMp5Dk0ZlitkdwEnJkIMHzO2PsvWK1Uo="; Path=/; HttpOnly
Location: http://[マスターパブリック DNS]:14000/webhdfs/v1/user/hadoop/hoge
Transfer-Encoding: chunked
{"Location":"http://[マスターパブリック DNS]:14000/webhdfs/v1/user/hadoop/hoge"}⏎
念の為HDFSのデータを確認
[hadoop@ip-172-31-0-137 ~]$ hadoop fs -cat /user/hadoop/hoge
hoge
使ってみる(取得)
curl -L "http://[マスターパブリック DNS]:14000/webhdfs/v1/user/hadoop/hoge?user.name=hadoop&op=OPEN"
hoge
Discussion