AWS Glue 実践入門:Amazon Redshiftのテーブルをクロールする

eyecatch_glue

AWS Glue は未知のデータ(Dark Data)に対して、推測(Infer)して、AWS Glue Data Catalog にテーブルを登録する機能があり、これをクローラ(Crawler)として定義します。ガイド付きチュートリアルの中で、カラム名ありパーティション化されたS3オブジェクトをクロールする例をご紹介しています。今回は、Redshiftに対してクロールする方法をご紹介します。

Amazon Redshiftのテーブルをクロールするには

Amazon Redshiftをクロールする前に Connectionを作成します。Connectionとは、データソースとなるRedshiftへの接続情報です。Connection の準備ができたら、AWS GlueはConnectionを利用して、データソースであるRedshiftに接続して、テーブルの定義情報をクロールします。

Connectionの作成

クラスタを指定する方法は2つあります。一つ目は、Amazon Redshiftのクラスタ識別子(Cluster Identifer)指定する方法と、二つ目はJDBC URLとVPCを選択する方法です。何れもAWSアカウントかつリージョン内のVPCを指定することになりますので、前者の方法で接続を定義します。

Connection properties

Amazon Redshiftのクラスタ識別子(Cluster Identifer)指定する方法で定義するので、Connection typeはAmazon Redshiftを選択します。

20171010-aws-glue-using-redshift-connection-1

Connection Action

Clusterにリージョン内のAmazon Redshiftクラスタの一覧が表示されます。定義したいクラスタが表示されない場合は、リージョンやVPCのセキュリ−ティーグループに誤りがないか確認してください。

20171010-aws-glue-using-redshift-connection-2

Review all steps

接続内容の確認です。Connectionの作成は接続先のDB設定の他に、VPCやセキュリティグループも重要です。

20171010-aws-glue-using-redshift-connection-3

Test Connection

Connectionを作成すると一覧に追加されます。追加したConnectionがあ正しく接続できるか確認することをおすすめします。Test Connectionを押すとダイアログが表示され、ガイド付きチュートリアルの中で、Crowlerを作成したときに指定したIAM ROLEを選択して実行してください。「This can take a few moments.」と表示される通り、本当に接続確認だけで数分かかります。

20171010-aws-glue-using-redshift-connection-4

補足

今回は、Redshiftのクラスタ識別子(Cluster Identifer)指定する方法でConnectionを作成しましたが、作成後はJDBC URLとVPCを選択する方法で設定した内容に変換されます。Connectionの編集画面を開くとJDBC URLが表示されます。Redshiftのクラスタ識別子(Cluster Identifer)で定義されているわけではないということに注意してください。

20171010-aws-glue-using-redshift-connection-5

クローラを作成する

では、作成したConnectionを利用して、データソースであるRedshiftに接続して、テーブルの定義情報をクロールします。

Crawler info

今回は、ssbgzスキーマのcustomerテーブルに対してクロールします。

20171010-aws-glue-using-redshift-crawler-1

Data store

先程のConnectionはAmazon Redshiftで指定しましたが、ここではData StoreにJDBCを選択します。Include PathはMyDatabase/MySchema/MyTableと指定します。今回はxxxxデータベースのssbgzスキーマのcustomerテーブルなので、xxxx/ssbgz/customer と指定します。

20171010-aws-glue-using-redshift-crawler-2

※ なお、MyDatabase/MySchema/%と指定することで、スキーマの全てをテーブルを対象とする事ができます。まとめてクロールしたいときにはとても便利な指定です。

IAM Role

ガイド付きチュートリアルの中で、Crowlerを作成したときに指定したIAM ROLEを選択して実行してください。

20171010-aws-glue-using-redshift-crawler-4

Schedule

Frequencyは Run on demand を選択します。

20171010-aws-glue-using-redshift-crawler-5

Output

クロールした結果、テーブルを作成する先を指定します。AWS Glue Data Catalogのdefaultデータベースに出力します。

20171010-aws-glue-using-redshift-crawler-6

Review all steps

設定内容を確認します。

20171010-aws-glue-using-redshift-crawler-7

クローラの実行

Run it now

作成したクローラが追加されています。Run it now?リンクをクリックすると直ちにクロール開始です。

20171010-aws-glue-using-redshift-crawler-8

クロールが無事に終了しました。

20171010-aws-glue-using-redshift-crawler-9

Redshiftでは以下のクエリが実行されていることが確認できました。

SELECT
    *
FROM
    (SELECT
        CAST(current_database() AS VARCHAR(124)) AS TABLE_CAT,
        table_schema AS TABLE_SCHEM,
        table_name AS TABLE_NAME,
        CAST( CASE table_type
            WHEN 'BASE TABLE' THEN CASE
                WHEN table_schema = 'pg_catalog'
                OR table_schema = 'information_schema' THEN 'SYSTEM TABLE'
                WHEN table_schema = 'pg_toast' THEN 'SYSTEM TOAST TABLE'
                WHEN table_schema ~ '^pg_'
                AND table_schema != 'pg_toast' THEN 'TEMPORARY TABLE'
                ELSE 'TABLE'
            END
            WHEN 'VIEW' THEN CASE
                WHEN table_schema = 'pg_catalog'
                OR table_schema = 'information_schema' THEN 'SYSTEM VIEW'
                WHEN table_schema = 'pg_toast' THEN NULL
                WHEN table_schema ~ '^pg_'
                AND table_schema != 'pg_toast' THEN 'TEMPORARY VIEW'
                ELSE 'VIEW'
            END
            WHEN 'EXTERNAL TABLE' THEN 'EXTERNAL TABLE'
        END AS VARCHAR(124)) AS TABLE_TYPE,
        REMARKS
    FROM
        svv_tables)
WHERE
    TABLE_SCHEM like 'ssbgz'
    AND TABLE_NAME like 'customer'
ORDER BY
    TABLE_TYPE,
    TABLE_CAT,
    TABLE_SCHEM,
    TABLE_NAME
;

登録されたData Catalogのテーブルを確認

xxxx_ssbgz_customerというテーブル名で登録され、Data typeがHiveのデータ型に変換されています。しかし、このテーブル定義はS3のパスはcmawsteamdb.ssbgz.customerと定義されており、このテーブルに対してAthenaからクエリーを実行できません。

20171010-aws-glue-using-redshift-crawler-result

クエリーできないテーブルは一体何か?

xxxx_ssbgz_customerというテーブルは、Redshiftのデータ入出力の定義情報でありテーブルではありません。AWS GlueではETL Jobの入力や出力にこのテーブル名を指定することができます。例えば、ETL Jobの入力にxxxx_ssbgz_customerというテーブルを指定することでデーブルデータをデータソースとすることができるようになります。

最後に

長くなりましたので、クローラで作成したxxxx_ssbgz_customerというテーブルを用いてETL Jobを作成するのは、引き続き以下のブログにて紹介します。

AWS Glue 実践入門:Amazon RedshiftのテーブルをETLする

AWS Cloud Roadshow 2017 福岡