🐘

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

2021/04/17に公開

https://zenn.dev/notrogue/articles/bea1dc777e9419
の続き

環境

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