【AWS Glue】aws-glue-samplesを動かすまでの前準備の作業メモ

AWS GlueのNotebook起動した際に Glue Examples ついている「Join and Relationalize Data in S3」のノートブックを動かすための、前準備のメモです。

f:id:yomon8:20181008095107p:plain

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バケットも作っておきます。

https://github.com/aws-samples/aws-glue-samples/blob/master/examples/join_and_relationalize.md#5-filtering

本当は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ロールを指定しています。他に重要なのは、ノートにベタで書かれている DatabaseNamelegislators と、既にデータ準備されている 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作成します。

f:id:yomon8:20181007002532p:plain

パラメータ入れて作成。

f:id:yomon8:20181007002541p:plain

インスタンスがGlueの画面でReadyになったら、 Open notebook で Jupyterノートブックを開きます。

f:id:yomon8:20181007010359p:plain

ノートブック実行

Glue Examples > Joining, Filtering, and Loading Relational Data with AWS Glue.ipynb が今回実行するサンプルのノートブックの内容です。 ※S3のバケット名は s3://glue-sample-target から修正が必要なので注意してください。

f:id:yomon8:20181007010448p:plain

内容的にはこのMarkdownにもそれぞれの処理の結果が書いてあったりもします。

aws-glue-samples/join_and_relationalize.md at master · aws-samples/aws-glue-samples · GitHub

他のサンプルも実行できます

同じような流れで以下の2つのサンプルも実行することができます。

Clean and Process

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.

The resolveChoice Method

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"
]

後は色々動かしながら理解を深めていきます。

参考URL

github.com