AWS GlueのNotebook起動した際に Glue Examples
ついている「Join and Relationalize Data in S3」のノートブックを動かすための、前準備のメモです。
Join and Relationalize Data in S3
This sample ETL script shows you how to use AWS Glue to load, transform, and rewrite data in AWS S3 so that it can easily and efficiently be queried and analyzed.
必要なもの確認
1. Crawl our sample datasetの項目を読むと必要なものが書いてありますので、まずはこれを確認します。
元となるデータはS3上で提供されています。
$ aws s3 ls --recursive s3://awsglue-datasets/examples/us-legislators 2017-08-12 10:30:01 777725 examples/us-legislators/all/areas.json 2017-08-12 10:30:01 378833 examples/us-legislators/all/countries.json 2017-08-12 10:30:01 38985 examples/us-legislators/all/events.json 2017-08-12 10:30:01 2718476 examples/us-legislators/all/memberships.json 2017-08-12 10:29:55 157531 examples/us-legislators/all/organizations.json 2017-08-12 10:29:55 7973806 examples/us-legislators/all/persons.json
まず、⇑で提供されているデータに対して、Crawler動かしてGlueのデータカタログに、以下のデータベースとテーブルを準備しておく必要があります。
Database | Tables |
---|---|
legislators | persons_json memberships_json organizations_json events_json areas_json countries_r_json |
ノートブックの中では、集計後のデータをS3に出力するので、自分のS3バケットも作っておきます。
本当はRedshiftも準備しておくと最後のRedshiftへ結果を投入することもできますが、やってないのでここでは書いてません。
設定・構築
では準備始めます。
IAMロール作成
まずIAMロール作成します。
- AWSGlueServiceRole
と以下のようなポリシーアタッチしておきます。先程書いた結果出力用に自分で作ったバケットの情報も入れておいていいかもしれません。
ここではロールの名前を AWSGlueServiceRoleOtomoGlueTest
としましたが、特に何でも良いです。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject" ], "Resource": "arn:aws:s3:::awsglue-datasets/examples/*" }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::otomo-glue-test/*" } ] }
Crawler作成
以下のコマンドで、Crawlerを作成します。上記で作ったIAMロールを指定しています。他に重要なのは、ノートにベタで書かれている DatabaseName
の legislators
と、既にデータ準備されている S3Targets
です。
$ aws glue create-crawler --cli-input-json '{ "Name": "glue-sample-legislators", "Role": "AWSGlueServiceRoleOtomoGlueTest", "DatabaseName": "legislators", "Description": "sample dataset", "Targets": { "S3Targets": [ { "Path": "s3://awsglue-datasets/examples/us-legislators/all/" } ] } }'
Crawler実行・カタログ情報生成
Crawlerの作成は一瞬です、その後、以下のコマンドでCrawlerを開始します。30秒程度で終わると思うので、ステータス確認します。
$ aws glue start-crawler --name glue-sample-legislators $ aws glue get-crawler --name glue-sample-every-politician --query 'Crawler.LastCrawl' { "Status": "SUCCEEDED", "LogGroup": "/aws-glue/crawlers", "LogStream": "glue-sample-every-politician", "MessagePrefix": "34f8a231-0ad5-40b1-8944-bae4fef6e064", "StartTime": 1538832865.0 }
データベース legislators
と、その配下のテーブルができていることを確認します。
$ aws glue get-tables --database-name legislators --query 'TableList[].Name' [ "areas_json", "countries_json", "events_json", "memberships_json", "organizations_json", "persons_json" ]
開発エンドポイント作成
これで準備が完了したので、JupyterノートブックからGlueのインスタンスに繋ぐために開発エンドポイント作成します。
aws glue create-dev-endpoint \ --endpoint-name glue-sample \ --role-arn $(aws iam get-role --role-name AWSGlueServiceRoleOtomoGlueTest --output text --query 'Role.Arn') \ --number-of-nodes 2
数分後に開発エンドポイントができるので、 アクション
> Create DageMaker notebook
でSegeMakerのNotebook Instance作成します。
パラメータ入れて作成。
インスタンスがGlueの画面でReadyになったら、 Open notebook
で Jupyterノートブックを開きます。
ノートブック実行
Glue Examples
> Joining, Filtering, and Loading Relational Data with AWS Glue.ipynb
が今回実行するサンプルのノートブックの内容です。
※S3のバケット名は s3://glue-sample-target
から修正が必要なので注意してください。
内容的にはこのMarkdownにもそれぞれの処理の結果が書いてあったりもします。
aws-glue-samples/join_and_relationalize.md at master · aws-samples/aws-glue-samples · GitHub
他のサンプルも実行できます
同じような流れで以下の2つのサンプルも実行することができます。
This sample ETL script shows you how to take advantage of both Spark and AWS Glue features to clean and transform data for efficient analysis.
This sample explores all four of the ways you can resolve choice types in a dataset using DynamicFrame's resolveChoice method.
動かすためには提供されているS3のCSVデータからpayments
データベースと medicare
テーブルのデータカタログを作っておく必要があります。
# Crawler作成 $ aws glue create-crawler --cli-input-json '{ "Name": "glue-sample-payments", "Role": "AWSGlueServiceRoleOtomoGlueTest", "DatabaseName": "payments", "Description": "sample dataset", "Targets": { "S3Targets": [ { "Path": "s3://awsglue-datasets/examples/medicare" } ] } }' # Crawler起動 $ aws glue start-crawler --name glue-sample-payments # クロールが終わったら内容確認 $ aws glue get-tables --database-name payments --query 'TableList[].Name' [ "medicare" ]
後は色々動かしながら理解を深めていきます。