🐘
AWS EMRでHDFSにHTTPアクセス(WebHDFS編)
の続き
環境
emr-6.2.0
us-east-1
準備
セキュリティグループ
- NameNodeへの9870 ingress
- DataNodeへの9864 ingress
を許可します。
ファイル
適当にHDFSにファイルおいておきます
# マスタノードから
echo hoge > hoge
hadoop fs -put hoge /user/hadoop/hoge
使ってみる(ls)
マスタノードからのアクセス
curl -i -L -H "Content-Type: application/octet-stream" "http://[マスターパブリック DNS]:9870/webhdfs/v1/user/hadoop/hoge?user.name=hadoop&op=OPEN"
HTTP/1.1 307 Temporary Redirect
Date: Sat, 17 Apr 2021 09:37:28 GMT
Cache-Control: no-cache
Expires: Sat, 17 Apr 2021 09:37:28 GMT
Date: Sat, 17 Apr 2021 09:37:28 GMT
Pragma: no-cache
X-Content-Type-Options: nosniff
X-FRAME-OPTIONS: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Set-Cookie: hadoop.auth="u=hadoop&p=hadoop&t=simple&e=1618688248799&s=fQnBDkvI20pwGBmv5kdWY4V5FpN79P3qZSUhNT250kU="; Path=/; HttpOnly
Location: http://ip-172-31-0-218.ec2.internal:9864/webhdfs/v1/user/hadoop/hoge?op=OPEN&user.name=hadoop&namenoderpcaddress=ip-172-31-0-137.ec2.internal:8020&offset=0
Content-Type: application/octet-stream
Content-Length: 0
HTTP/1.1 200 OK
Access-Control-Allow-Methods: GET
Access-Control-Allow-Origin: *
Content-Type: application/octet-stream
Connection: close
Content-Length: 5
hoge
ちなみに、マスターパブリックDNS名ではなく、127.0.0.1を指定するとエラーになります。
VPC外からのアクセス
先程のコマンドのリダイレクト先は、「http://ip-172-31-0-218.ec2.internal」になっています。
このため、VPC外から同じコマンドを実行しても、リダイレクト先の名前解決が出来ずにエラーとなります。
curl -i -L -H "Content-Type: application/octet-stream" "http://マスターパブリック DNS]:9870/webhdfs/v1/user/hadoop/hoge?user.name=hadoop&op=OPEN"
HTTP/1.1 307 Temporary Redirect
Date: Sat, 17 Apr 2021 09:37:19 GMT
Cache-Control: no-cache
Expires: Sat, 17 Apr 2021 09:37:19 GMT
Date: Sat, 17 Apr 2021 09:37:19 GMT
Pragma: no-cache
X-Content-Type-Options: nosniff
X-FRAME-OPTIONS: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Set-Cookie: hadoop.auth="u=hadoop&p=hadoop&t=simple&e=1618688239198&s=wOnS1DCO1eo6JJ5sRHkMlJd+/DF7oGnCi9iIa3H5MT4="; Path=/; HttpOnly
Location: http://ip-172-31-0-218.ec2.internal:9864/webhdfs/v1/user/hadoop/hoge?op=OPEN&user.name=hadoop&namenoderpcaddress=ip-172-31-0-137.ec2.internal:8020&offset=0
Content-Type: application/octet-stream
Content-Length: 0
curl: (6) Could not resolve host: ip-172-31-0-218.ec2.internal
リダイレクト先を、指定されたDataNodeに対応するパブリックDNS名に置き換えてcurlすると、実行できます。
curl -i -L -H "Content-Type: application/octet-stream" "http://[DataNodeにのパブリックDNS名]:9864/webhdfs/v1/user/hadoop/hoge?user.name=hadoop&op=OPEN&namenoderpcaddress=[リダイレクト指示に含まれる値]:8020&offset=0"
HTTP/1.1 200 OK
Access-Control-Allow-Methods: GET
Access-Control-Allow-Origin: *
Content-Type: application/octet-stream
Connection: close
Content-Length: 5
hoge
VPC内からのアクセス
VPC内のインスタンス(※)からはプライベートDNS名が解決できるので、マスタノードと同様のcurlを実行できます。
※ EMRクラスタ以外でも可
curl -i -L -H "Content-Type: application/octet-stream" "http://[マスターパブリック DNS]:9870/webhdfs/v1/user/hadoop/hoge?user.name=hadoop&op=OPEN"
HTTP/1.1 307 Temporary Redirect
Date: Sat, 17 Apr 2021 09:47:44 GMT
Cache-Control: no-cache
Expires: Sat, 17 Apr 2021 09:47:44 GMT
Date: Sat, 17 Apr 2021 09:47:44 GMT
Pragma: no-cache
X-Content-Type-Options: nosniff
X-FRAME-OPTIONS: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Set-Cookie: hadoop.auth="u=hadoop&p=hadoop&t=simple&e=1618688864675&s=R5/v/BXIQiwWOrs6XdzUenixck3o2He284wTXO6IqRE="; Path=/; HttpOnly
Location: http://ip-172-31-0-218.ec2.internal:9864/webhdfs/v1/user/hadoop/hoge?op=OPEN&user.name=hadoop&namenoderpcaddress=ip-172-31-0-137.ec2.internal:8020&offset=0
Content-Type: application/octet-stream
Content-Length: 0
HTTP/1.1 200 OK
Access-Control-Allow-Methods: GET
Access-Control-Allow-Origin: *
Content-Type: application/octet-stream
Connection: close
Content-Length: 5
hoge
HttpFSに比べて何がいいの?
ここまでの説明だけだとHttpFSに比べて面倒なだけに見えます。
しかし、WebHDFSではデータのやりとりにNameNodeを経由しないため、NameNodeがボトルネックになりにくく、データ量やリクエストが多い時に優位そうです。
VPC外からリダイレクトに対応できるようにしたい
調査中。
- WebHDFSでパブリックDNS名を返すようにする
- AWS APIなどで、頑張ってプライベートDNS名をパブリックDNS名などに変換する
とかかなーと思っています。
Discussion