雲のメモ帳

猫とクラウドと旅行が好きなインフラエンジニアです。 日々の調べたことや興味が持ったことをこのブログにアウトプットします。

AWS Glueを使って、データ分析基盤を構築する(CSV → Parquet)

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

やること

  1. Amazon S3に保管されているCSVファイルをParquetファイルに変換し、Amaozn S3の別フォルダに保管する。
  2. Amazon S3に保管したParquetファイルをAmazon Athenaを使って参照する。

f:id:ykoomaru:20191103151046p:plain

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]-[データベース]-[データベースの追加]をクリックする。 f:id:ykoomaru:20191103155037p:plain

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

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

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

5. [Data stores]を選択し、[次へ]をクリックする。 f:id:ykoomaru:20191103155231p:plain

6.以下の情報を入力し、[次へ]をクリックする。

  • データストアの選択: S3
  • クロールするデータの場所: 自分のアカウントで指定されたパス
  • インクルードパス: s3://aws-bigdata-blog/artifacts/glue-data-lake/data/
    ※パスの最後のスラッシュ「/」を忘れないように注意です。

f:id:ykoomaru:20191103155309p:plain

<参考> 利用しているCSVデータ f:id:ykoomaru:20191110081021p:plain

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. 「いいえ」を選択し、「次へ」をクリックする。 f:id:ykoomaru:20191103155350p:plain

8. 以下の情報を入力し、「次へ」をクリックする。 AWS Glue用のIAMロールを作成してなかった場合

  • IAMロールを作成する
  • AWSGlueServiceRole-xxxx(任意の値)

自動で作成した場合以下の二つのポリシーが付いたロールが作成されます。

  • AWSGlueServiceRole-xxxx(カスタムポリシー)
  • AWSGlueServiceRole(マネージドポリシー)

特定のS3バケットへの書き込み権限やEC2などへの参照権限が付与されています。

f:id:ykoomaru:20191103155427p:plain

9. 「オンデマンドで実行」を選択し、「次へ」をクリックする。 f:id:ykoomaru:20191103160450p:plain

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

11. 確認画面を確認し、[完了]をクリックする。
f:id:ykoomaru:20191103162600p:plain

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

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

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

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

ETLジョブの作成、Parquetファイルへの変換

ETLジョブを作成し、CSVファイルをParquetファイルに変換し、S3に格納します。

1. [AWS Glue]-[ジョブ]-[ジョブの追加]をクリックします。 f:id:ykoomaru:20191103155745p:plain

2. 以下を入力し、[次へ]をクリックします。 今回はSpark2.4 Python3を使います。

  • 名前: nytaxi-csv-parquet (任意の値でOKです)
  • IAMロール : AWSGlueServiceRole-xxxx(先ほど作成したロール) ※

※Parquetファイルを保管するS3への書き込み権限が必要です。
f:id:ykoomaru:20191103155807p:plain f:id:ykoomaru:20191103160950p:plain

3. [data]を選択し[次へ]をクリックします。 f:id:ykoomaru:20191103155857p:plain

4. [スキーマを変更する]を選択し、[次へ]をクリックします。 f:id:ykoomaru:20191103155925p:plain

5. 次の値を入力し、[次へ]をクリックします。

  • データストア: Amazon S3
  • 形式: Parquet
  • ターゲットパス: <Parquetファイルを出力したいS3のパス> ※
    ※最後のスラッシュ「/」を忘れないように注意です。

f:id:ykoomaru:20191103160012p:plain

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

7. [保存]-[ジョブの実行]をクックします。
f:id:ykoomaru:20191103160130p:plain

8. ジョブが完了したことを確認し、6で指定したS3のパスを確認します。 f:id:ykoomaru:20191103161028p:plain

クローラを使って、Amazon S3のParquetファイルを読み込みデータセットにメタデータを格納する

Athenaから分析できるように先ほど作成したParquetファイルをクローラを使って読み込みます。

1. [AWS Glue]-[クローラ]-[クローラの追加]をクリックします。 f:id:ykoomaru:20191103161223p:plain

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

3. [Data stores]を選択し、[次へ]をクリックする。 f:id:ykoomaru:20191103161310p:plain

4.以下の情報を入力し、[次へ]をクリックする。

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

f:id:ykoomaru:20191103161352p:plain

5. 「いいえ」を選択し、「次へ」をクリックする。 f:id:ykoomaru:20191103161448p:plain

6. 以下の情報を入力し、「次へ」をクリックする。

  • 既存のIAMロールを選択
  • IAMロール : AWSGlueServiceRole-xxxx(先ほど作成したロール)

f:id:ykoomaru:20191103161526p:plain

7. 「オンデマンドで実行」を選択し、「次へ」をクリックする。 f:id:ykoomaru:20191103161733p:plain

8. [データベース]でデータベース名(nycitytaxi)を選択し、[次へ]をクリックする。 f:id:ykoomaru:20191103161809p:plain

9. 確認画面を確認し、[完了]をクリックする。
f:id:ykoomaru:20191103161945p:plain

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

ジョブが正常に完了していることを確認します。

13. [テーブル]-[output]をクリックします。
クローラにより作成されたデータカタログを確認します。 f:id:ykoomaru:20191103162042p:plain

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

これでAthenaからデータが見れる状態になりました。

Athena で分析

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

f:id:ykoomaru:20191103162147p:plain

最後に

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