【AWS】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 2.4.3 ドキュメント 日本語訳

作業

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の知識が必要になってくるのでもう少し勉強しようと思います。

データ分析基盤構築入門[Fluentd、Elasticsearch、Kibanaによるログ収集と可視化]

データ分析基盤構築入門[Fluentd、Elasticsearch、Kibanaによるログ収集と可視化]

図解即戦力 ビッグデータ分析のシステムと開発がこれ1冊でしっかりわかる教科書

図解即戦力 ビッグデータ分析のシステムと開発がこれ1冊でしっかりわかる教科書