S3上のデータをAWS Athena/Glue で読み取る

## はじめに
　本記事では、S3上に収集したGitLabのデータをAmazon Athena/AWS Glueを利用して分析できるようにします。この記事では大きく「Glue クローラーによるData Catalog（構造）化」と「AthenaによるData Catalogを利用したS3データ読み取り」の2つを説明します。
　前回までの記事は以下をご覧ください。
 - [データ可視化基盤の全体デザイン、各サービスの概要について](https://qiita.com/siwa/items/fe10f1a99b18c0828aa9)
 - [Airbyteを構築してGitLabのデータを収集する](https://qiita.com/siwa/items/0703e9465f5f90282ffc)

　なお、本記事の正確性や完全性について保証しませんので、ご注意ください。

### Glue クローラーによるData Catalog（構造）化

AWS Glue は AWSのページでは以下のように説明されています。

> AWS Glue は、データの準備をより簡単、迅速、低コストにするサーバーレスデータ統合サービスです。 70 を超える多様なデータソースを検出して接続し、一元化されたデータカタログでデータを管理し、ETL パイプラインを視覚的に作成、実行、モニタリングして、データをデータレイクにロードできます。

今回はAWS Glue の機能の一つであるGlue クローラーを利用します。Glue クローラーにより、S3上のデータを自動で読み取り、構造化されたインデックスをカタログ(AWS Glue Data Catalog)として保存できます。これにより、S3上のデータをインデックスを利用して、容易に取得することができます。
AWS Glue および クローラの詳細は、以下のAWS ドキュメントを御覧ください。
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/catalog-and-crawler.html

#### クローラー作成、実行手順

Glueクローラを作成して、S3上のデータをカタログ化してみます。

- AWS Glue のページから[Crawlers] -> [Create crawler]を選択します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/08a4fbb5-1468-0734-fe90-1ab3d1fea61a.png)
- 以下を指定してクローラを作成します。
  - [Data source configuration]: Not yet 
  - [Add data source] : データソースを追加します。
    - Data source : s3
    - S3 path : gitlabデータが格納されているs3のパス(s3://gitlab-data)
    - Subsequent crawler runs : Crawl all sub-folders
  - Target database : テーブルを作成するglue database (作ってなければadd databaseから作成)
  - 他の項目も環境に合わせて適時指定してください(S3接続用のIAM等の設定を忘れずに)
- 作成したクローラを実行(Ran crawler)します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/161fa76d-b9b2-a15f-e69a-4aa508a7a510.png)
  - 実行結果を確認するとS3のデータを読み取って、指定したデータベースにテーブルが作成されています。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/d4739498-21c1-3744-8baf-8108147861ba.png)
  - 作成されたテーブルの中を見てみると、S3上のデータが正しく構造化されて登録されていることがわかります。
    (画像はissuesの `_airbyte_data` の中身、tableを選択してSchemaのDatatypeの `struct` をクリックすることで見れます。 )
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/b81ee5a2-65cd-087c-e292-1409b73a7910.png)
  - うまくいかない方は、クローラの設定が間違っていないか（パスや権限周り）を確認ください。
    - 特殊な構造のデータの場合は適切に読み取れない場合があり、その場合は手動で構造を指定することもできます。詳しくは[カスタム分類子](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/custom-classifier.html)を御覧ください。

S3上のデータの構造が変わる可能性がある場合に備えて、クローラーをスケジュール設定することも可能です。  
高頻度にクロールするとそれなりに費用を要するので注意ください。  
また、本記事では対象外としますが、Data Catalogに登録しておくことで、Glue Studioなどを利用して大規模データのサマリ化などバッチ的にデータ処理することもできます。

### AthenaによるData Catalogを利用したS3データ読み取り

Amazon Athena はAWSの説明によると以下のとおりです。

> Amazon Athena は、サーバーレスでインタラクティブな分析サービスであり、ペタバイト級のデータが存在する環境で、簡便かつ柔軟に分析する方法を提供します。

S3のデータをSQL Like(正確にはPresto SQL)な命令で容易に取得、分析することができ、非常にエンジニアフレンドリーです。  
今回はAthenaとGlue Data Catalogを利用することでS3上のデータをSQL Likeなクエリで取得してみます。

手順自体は非常に簡単で、Amazon Athenaでのクエリ実行時に、データベースにGlue Data Catalogのデータベースを指定することで、クエリ内でデータベース内のテーブルやテーブル内の項目名を使うことができます。  
*Glue Data CatalogでDatabaseを作成していると、Athenaには自動で連携（指定候補に表示）されます。

例えば、S3上の保存されたGitLabデータのissuesデータ内のiidとtitleを表示させるクエリは以下になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/cd1e446c-94f6-89b3-9981-f557ff1764c4.png)

データソースとデータベースに、GitLabのS3データをクロールしたテーブルが登録されているデータベースを指定することで、テーブル内の各項目を参照できます。

Glue Data Catalogを使っていない場合はS3のデータ構造を事前に指定する必要があり、Glue Data Catalog (Glue Crawler) を使うとAthenaの使い勝手がかなり良くなります。

次回は、Athenaで取得するデータをグラフィカルに可視化するため、Amazon ECSとAWS Fargateを利用してGrafanaを構築します。

## 商標
- AWSおよびAWSの各種サービスは、Amazon.com, Inc.またはその関連会社の商標です。
- 記載の会社名、製品名、サービス名等はそれぞれの会社の商標または登録商標です。