AWS Glue 実践入門:Apache Zeppelinによる Glue scripts(pyspark)の開発環境を構築する

AWS Glueは Apache Zeppelinによるインタラクティブな Glue scripts(pyspark)の開発が可能です。今回はAWS環境の準備とDev Endpointに設定して、Apache Zeppelin(NoteBook Server)を構築する方法をご紹介します。

システム構成

開発者は、ウェブブラウザを利用してVPC内のEC2インスタンスである Zeppelin(Notebook Server)に接続します。VPC内のZeppelinが AWS Glueサービスに対して、インタラクティブにGlue scripts(pyspark)を実行します。

AWS環境の設定

Zeppelinが AWS Glueサービス通信でき、かつセキュリティが保たれるように設定する必要があります。なお、今回は既存の環境に影響を与えないように専用のVPCを作成しています。

VPCのDNSホスト名

VPCのDNSホスト名の「はい」に設定します。

20170920-aws-glue-zeppelin-vpc-dns

S3エンドポイントの設定

VPCはS3エンドポイントの設定して、Zeppelinを配置するサブネットのルーティングに設定してください。また、インターネット経由でZeppelinに接続する場合は、インターネットゲートウェイも設定してください。

20170920-aws-glue-zeppelin-s3-endpoints

セキュリティグループ

AWS Glue と Zeppelinが通信できるように、同じセキュリティグループが設定されているリソース間のすべてのTCPを許可する設定します。

更に、ウェブブラウザからVPC内のEC2インスタンスである Zeppelin(Notebook Server)を接続許可する設定します。

20170920-aws-glue-zeppelin-security-group

IAMロールの設定

Zeppelinが AWS Glueサービスに対して、Glue scripts(pyspark)を実行します。そのため、クローラやジョブの実行と同様にAWS Glue のロール(AWSGlueServiceRoleDefault)が必要です。また、Dev Endpoint経由で、Glueに実行指示するための権限が新たに必要になります。

AWS Glue のロール(AWSGlueServiceRoleDefault)

AWS Glue サービスが利用するロール(AWSGlueServiceRoleDefault)を作成します。このロールは AWS Glue サービスが実行やリソースにアクセスするための権限を指定します。すでにクローラやジョブの実行に作成したロールがあれば、そのロールを利用して構いません。

20170920-aws-glue-zeppelin-AWSGlueServiceRoleDefault

EC2 のロール(AWSGlueForEC2Role)

EC2(Zeppelin)インスタンスが AWS Glueを利用するロール(AWSGlueForEC2Role)を作成します。このロールは AWS Glue サービスが実行やリソースにアクセスするための権限を指定します。

20170920-aws-glue-zeppelin-AWSGlueForEC2Role

Dev Endpointの作成

Dev Endpointは、Glueスクリプトを開発してテストする環境です。Glueコンソールの「Dev endpoints」に移動して、右上の[Add endpoint]ボタンをクリックしてウィザードが起動します。以降、各ステップについて解説します。

Properties

Dev Endpoint名と、作成したAWS Glue サービスが利用するロール(AWSGlueServiceRoleDefault)を指定します。

20170920-aws-glue-zeppelin-setup-dev-endpoints-1

Networking

ここでは、「Choose a VPC,Subnet, and security groups」を選択して、上で設定した内容指定します。

20170920-aws-glue-zeppelin-setup-dev-endpoints-2

SSH public key

development endpointの認証するためのパブリックキーを登録します。今回はパブリックキーを用意していないので、[Create ssh key]ボタンを押して生成します。パブリックキーは画面に設定され、プライベートキー(private-key.pem)は自動的にダウンロードされます。private-key.pemは、SSH経由でREPLコマンドを実行する際に必要となリますので保存しておいてください。

20170920-aws-glue-zeppelin-setup-dev-endpoints-3

Review

設定内容を確認して、[Finish]ボタンを押すと作成開始です。 20170920-aws-glue-zeppelin-setup-dev-endpoints-4

作成開始直後は、Provisioning Status がPROVISIONINGです。15分ほどでREADYになりますのでそれまでお待ち下さい。 20170920-aws-glue-zeppelin-setup-dev-endpoints-provisioning

Zeppelin(Notebook Server)のEC2インスタンス構築

ZeppelinのEC2インスタンスは、CloudFormationによって構築されますので、この操作はCloudFormationの実行できる権限があるIAMユーザーで実施してください。

PROVISIONINGが完了してREADYなったことを確認した後、Zeppelin (Notebook Server)を作成します。作成したいエンドポイント名を選択して、[Action]-[create Notebok server]を選択します。 20170920-aws-glue-zeppelin-action-create

以下のダイアログにEC2インスタンス起動に必要な情報を入力して、[Create]ボタンを押すとECインスタンスの起動が開始します。

20170920-aws-glue-zeppelin-ec2-create

EC2インスタンスの構築の進行状況はCloudFormationの画面で確認します。画面上部にCloudFormationのリンクをクリックするとCloudFormationの画面に遷移します。 20170920-aws-glue-zeppelin-cfn-link

無事にEC2インスタンスの構築が完了したことが確認できました。 20170920-aws-glue-zeppelin-cfn-success

※ 今回は開発者がZeppelinにインターネット経由で接続するので、EC2インスタンスにEIPを設定しています。

Zeppelin(Notebook Server)の接続と実行

接続情報については、Development endpoints cm-glue-develop の Endpoint details から参照できます。 20170920-aws-glue-zeppelin-dev-endpoint-description-2

ZeppelinへSSHのログイン

Endpoint details の SSH to EC2 server command を貼り付けて実行します。SSHのログインはログ(zeppelin/logs/)の参照等に利用します。

ssh -i <ec2-private-key.pem> ec2-user@ec2-XX-XXX-XXX-X.compute-1.amazonaws.com

Zeppelinへウェブのログイン

Endpoint details の Notebook Server URL に接続します。

https://ec2-XX-XXX-XXX-X.compute-1.amazonaws.com:443

notebookのusernameとpasswordを入力してログインします。 20170920-aws-glue-zeppelin-web-login

最初にnoteを作成します。Default Interpreterは spark を選択します。 20170920-aws-glue-zeppelin-create-note

Glue scripts(pyspark)の実行

以下のコードを入力して実行します。56秒後に結果が得られ、正しく動作していることが確認できました。

from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.transforms import SelectFields
glueContext = GlueContext(spark.sparkContext)
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "flightsdb", table_name = "flightsparquet", transformation_ctx = "datasource0")
datasource0.printSchema()
df = datasource0.toDF()
df.show()

20170920-aws-glue-zeppelin-run-code

[注意] 開発終了時のリソース削除

Zeppelin(EC2インスタンス)とDev Endpointは利用時間に応じて料金が発生しますので、開発終了時のリソースを削除してください。

Zeppelin(EC2インスタンス)のスタックの削除

ZeppelinはCloudFormationでEC2インスタンスが作成されていますので、CloudFormationの画面からZeppelin(EC2インスタンス)を選択して、スタックの削除してください。

20170920-aws-glue-zeppelin-delete-cfn-stack

Dev Endpointの削除

Endpont名を選択して、Delete Enadpointを押すと削除されます。

20170920-aws-glue-zeppelin-delete-cfn-endpoint

Dev Endpoint の利用費

Development endpoints are optional, and billing applies only if you choose to interactively develop your ETL code. Development endpoints are charged based on the Data Processing Unit hours used for the time your development endpoints are provisioned. A Glue development endpoint requires a minimum of 2 DPUs. By default, AWS Glue allocates 5 DPUs to each development endpoint. You are billed $0.44 per DPU-Hour in increments of 1 minute, rounded up to the nearest minute, with a 10-minute minimum duration for each provisioned development endpoint.

引用:AWS Glue Pricing - ETL jobs

Development endpointはオプションで、ETLコードをインタラクティブに開発することを選択した場合にのみ課金が適用されます。Development endpointは、開発エンドポイントのプロビジョニングに使用されたData Processing Unit(DPU)の時間に基づいて請求されます。Glue Development endpointには最低2DPUが必要です。デフォルトでは、AWS Glueは5DPUを各Development endpointに割り当てます。Development endpoint毎にプロビジョニングされてから1DPUあたり0.44ドル/時、最低10分とし、分単位で切り上げ請求となります。

例えば、Development endpointには5DPUがプロビジョニングされている場合、Development endpointを24分または2/5時間稼働させると、5DPU * 2/5時間(DPU-Hourあたり0.44ドル)となりますので、0.88ドル請求されます。

最後に

AWS GlueとZeppelinの連携によって、Glue scripts(pyspark)のコードを Step-By-Step で実行できる様になりました。今後、開発の効率化やデータの可視化(Visualization)に期待が持てそうです。この機会にPythonやApache Sparkに興味がある方にも使っていただきたいです。

執筆時点では、公式ドキュメントは日本語化されていませんので、英語版をご覧ください。

公式ドキュメント(英語) - Tutorial: Set Up a Development Endpoint and Notebook to Author ETL Scripts Interactively

AWS Glue実践入門 | シリーズ | Developers.IO