最近データ分析基盤系に興味をもっているので、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の知識が必要になってくるのでもう少し勉強しようと思います。