🐘

AWS EMRでHDFSにHTTPアクセス(HttpFS編)

2021/04/17に公開

環境

emr-6.2.0
us-east-1

HDFSとHTTPアクセス

HDFSでは、

を使うことで、クラスター外からもHDFSにHTTPアクセスすることが出来ます。

APIの形式は同じ?(ドキュメントによると「interoperable」)ですが、通信方法に違いがあり、

  • HttpFSはNameNodeを通して通信
  • WebHDFSはNameNodeを通してメタデータを取得後、DataNodeと通信

です(詳しくはtagomorisさんの記事)。

この記事ではHttpFSの方の使用例を紹介します。WebHDFSはこちら
https://zenn.dev/notrogue/articles/fe08d78468622b

準備

クラスタ外からアクセスする時は、セキュリティグループ設定必要です。
(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