最近データ分析基盤系に興味をもっているので、AWS Glueを使ったデータ分析基盤の構築についてのチュートリアルをやってみました。
CSVファイルを分析用のファイル形式の「Parquet」に変換し、Amazon Athenaから閲覧します。
AWS Glue と Amazon S3 を使用してデータレイクの基礎を構築する | Amazon Web Services ブログ
やること
- Amazon S3に保管されているCSVファイルをParquetファイルに変換し、Amaozn S3の別フォルダに保管する。
- Amazon S3に保管したParquetファイルをAmazon Athenaを使って参照する。

Parquet フォーマット
Parquet は多くのほかのデータ処理システムでサポートされているコラム状のフォーマットです。Spark SQL は自動的に元のデータのスキーマを保持するParquetファイルの読み書きの両方のサポートを提供します。Parquetファイルを書く場合、互換性の理由から全てのカラムは自動的にnullが可能なように変換されます。
Parquet ファイル - Spark 3.0.0 ドキュメント 日本語訳
作業
Glueのメタデータ作成
クローラを使って、Amazon S3のCSVを読み込みデータセットにメタデータを格納します。
Amazon Athenaなどで分析する際はこのメタデータを参照し、実態のS3にアクセスします。メタデータには、テーブルの定義やデータの実態の場所などの情報が格納されています。
CSVデータはAWSが用意していくれているものを利用します。2017年1月のニューヨークのグリーンタクシーの情報です。
1. [AWS Glue]-[データベース]-[データベースの追加]をクリックする。

2. 「データベース名」に任意の値を入力し、[作成]をクリックする。

3. データベースが作成できたら、[テーブル]-[テーブルの追加]をクリックする。

4. 「クローラの名前」に任意の値を入力し、[次へ]をクリックする。

5. [Data stores]を選択し、[次へ]をクリックする。

6.以下の情報を入力し、[次へ]をクリックする。
- データストアの選択: S3
- クロールするデータの場所: 自分のアカウントで指定されたパス
- インクルードパス: s3://aws-bigdata-blog/artifacts/glue-data-lake/data/
※パスの最後のスラッシュ「/」を忘れないように注意です。

<参考>
利用しているCSVデータ

VendorID,lpep_pickup_datetime,lpep_dropoff_datetime,store_and_fwd_flag,RatecodeID,PULocationID,DOLocationID,passenger_count,trip_distance,fare_amount,extra,mta_tax,tip_amount,tolls_amount,ehail_fee,improvement_surcharge,total_amount,payment_type,trip_type 2,2017-01-01 00:01:15,2017-01-01 00:11:05,N,1,42,166,1,1.71,9,0,0.5,0,0,,0.3,9.8,2,1 2,2017-01-01 00:03:34,2017-01-01 00:09:00,N,1,75,74,1,1.44,6.5,0.5,0.5,0,0,,0.3,7.8,2,1
7. 「いいえ」を選択し、「次へ」をクリックする。

8. 以下の情報を入力し、「次へ」をクリックする。 AWS Glue用のIAMロールを作成してなかった場合
- IAMロールを作成する
- AWSGlueServiceRole-xxxx(任意の値)
自動で作成した場合以下の二つのポリシーが付いたロールが作成されます。
- AWSGlueServiceRole-xxxx(カスタムポリシー)
- AWSGlueServiceRole(マネージドポリシー)
特定のS3バケットへの書き込み権限やEC2などへの参照権限が付与されています。

9. 「オンデマンドで実行」を選択し、「次へ」をクリックする。

10. [データベース]で先ほど追加したデータベース名を選択し、[次へ]をクリックする。

11. 確認画面を確認し、[完了]をクリックする。

12. [今すぐ実行しますか?] をクリックする。
クローラを選択して、[クローラの実行]をしても大丈夫です。

13. クローラが正常に完了したことを確認する。
実行ログはカラムのログから確認できます。

14. [テーブル]-[data]をクリックします。
クローラにより作成されたデータカタログを確認します。

15. CSVをもとにスキーマ情報やテーブルのプロパティが作成されたことを確認します。

ETLジョブの作成、Parquetファイルへの変換
ETLジョブを作成し、CSVファイルをParquetファイルに変換し、S3に格納します。
1. [AWS Glue]-[ジョブ]-[ジョブの追加]をクリックします。

2. 以下を入力し、[次へ]をクリックします。 今回はSpark2.4 Python3を使います。
- 名前: nytaxi-csv-parquet (任意の値でOKです)
- IAMロール : AWSGlueServiceRole-xxxx(先ほど作成したロール) ※
※Parquetファイルを保管するS3への書き込み権限が必要です。

3. [data]を選択し[次へ]をクリックします。

4. [スキーマを変更する]を選択し、[次へ]をクリックします。

5. 次の値を入力し、[次へ]をクリックします。
- データストア: Amazon S3
- 形式: Parquet
- ターゲットパス: <Parquetファイルを出力したいS3のパス> ※
※最後のスラッシュ「/」を忘れないように注意です。

6. マッピングの一覧が表示されますので、確認し[次へ]をクリックします。
データ型の変更や不要なカラムの削除などあればここで実施します。

7. [保存]-[ジョブの実行]をクックします。

8. ジョブが完了したことを確認し、6で指定したS3のパスを確認します。

クローラを使って、Amazon S3のParquetファイルを読み込みデータセットにメタデータを格納する
Athenaから分析できるように先ほど作成したParquetファイルをクローラを使って読み込みます。
1. [AWS Glue]-[クローラ]-[クローラの追加]をクリックします。

2. 「クローラの名前」に任意の値を入力し、[次へ]をクリックする。

3. [Data stores]を選択し、[次へ]をクリックする。

4.以下の情報を入力し、[次へ]をクリックする。
- データストアの選択: S3
- クロールするデータの場所: 自分のアカウントで指定されたパス
- インクルードパス: <Parquetファイルを出力したS3のパス>
※パスの最後のスラッシュ「/」を忘れないように注意です。

5. 「いいえ」を選択し、「次へ」をクリックする。

6. 以下の情報を入力し、「次へ」をクリックする。
- 既存のIAMロールを選択
- IAMロール : AWSGlueServiceRole-xxxx(先ほど作成したロール)

7. 「オンデマンドで実行」を選択し、「次へ」をクリックする。

8. [データベース]でデータベース名(nycitytaxi)を選択し、[次へ]をクリックする。

9. 確認画面を確認し、[完了]をクリックする。

10. [今すぐ実行しますか?] をクリックする。
クローラを選択して、[クローラの実行]をしても大丈夫です。

ジョブが正常に完了していることを確認します。
13. [テーブル]-[output]をクリックします。
クローラにより作成されたデータカタログを確認します。

14. CSVをもとにスキーマ情報やテーブルのプロパティが作成されたことを確認します。

これでAthenaからデータが見れる状態になりました。
Athena で分析
最後にAthenaでデータを見てみます。
Parquetのメタデータを保管したnycitytaxiを選択し、以下のSQLを実行すると値が取れます。
Select * From "nycitytaxi"."output" limit 10;

最後に
AWS Glueのチューリアルをやってみましたが、CSVからParquetへの変換、Athenaからの分析が簡単に実施することができました。同じような仕組みでIoTから取得したデータをAWS GlueでETL処理してAthenaで分析するという流れができそうですね。ETL処理の箇所は、SparkとPythonの知識が必要になってくるのでもう少し勉強しようと思います。