非インフラエンジニアが理解の為に、AWS Glueを使ってみる

Glue。。接着剤？
なるほど、わからん！というレベルの非エンジニアが
実際に触りながら、理解するためにまとめている記事。

## ゴール

Glueを実際に触って、利便性が理解出来ることを目指す

なには、ともあれ触っていきましょう！

## S3での操作

まずは、いろいろ利用するストレージの確保

### 手順

まずは、S3でテスト用のバケットを作成（設定はデフォルト）
構成は下記の通り。

```
s3
 ├ 20200921testglue001in   - 入力CSV置き場
 ├ 20200921testglue001out　 - 出力ファイルの置き場所（今回は、parquetファイルを格納）
 ├ 20200921testglue001athena - athena実行用
 ├ 20200921testglue001script - Glueジョブの実行用
 └ 20200921testglue001temp - Glueジョブの為の一次領域
```

続いて、下記CSVファイルを「20200921testglue001in」へアップロード

```
deviceid,uuid,appid,country,year,month,day,hour
iphone,11111,001,JP,2017,12,14,12
android,11112,001,FR,2017,12,14,14
iphone,11113,009,FR,2017,12,16,21
iphone,11114,007,AUS,2017,12,17,18
other,11115,005,JP,2017,12,29,15
iphone,11116,001,JP,2017,12,15,11
pc,11118,001,FR,2017,12,01,01
pc,11117,009,FR,2017,12,02,18
iphone,11119,007,AUS,2017,11,21,14
other,11110,005,JP,2017,11,29,15
iphone,11121,001,JP,2017,11,11,12
android,11122,001,FR,2017,11,30,20
iphone,11123,009,FR,2017,11,14,14
iphone,11124,007,AUS,2017,12,17,14
iphone,11125,005,JP,2017,11,29,15
iphone,11126,001,JP,2017,12,19,08
android,11127,001,FR,2017,12,19,14
iphone,11128,009,FR,2017,12,09,04
iphone,11129,007,AUS,2017,11,30,14
```

## Glueでの操作

### クローラの設定（データカタログを作成する準備～実行）

まずは、クローラーを作成してみます。
CSVファイルを取り込みテーブルを自動で作成してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/a4cc798d-f60b-387a-3ac2-e875df81da0b.png)

#### クローラに関する情報の追加

クローラーの名前は、任意につけてしまってOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/0277575f-45f6-3a45-5939-7f592982f4c2.png)

#### Specfy crawler source type

クローラーのソースタイプ
ここはデフォルト値のまま

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/b6b86819-ec06-728f-f47e-ac20a0328083.png)

#### データストアの追加

インクルードパスは、先ほどCSVファイルをアップロードしたファイルを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/2add29ea-d160-3d8f-0686-4c9256dce392.png)

#### 別のデータストアの追加

「いいえ」ここでは特に追加しない

#### IAMロール

以下のポリシーを付与した任意の名前のロールを作っておく。
・AmazonS3FullAccess
・AWSGlueServiceRole

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/002122d3-4380-d5ca-1f5b-de3714866076.png)


#### スケジュール

オンデマンドで実行を選ぶ

#### クローラの出力を設定する

出力されるテーブルの設定
データベースがなければ、「データベース」の追加をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/4fcea2fb-561d-ecd4-8ea4-ab82ec617681.png)

#### すべてのステップの確認

最後に、確認画面がでるので、「完了」をクリックすればクローラの設定は完了

### クローラの実行

オンデマンドでの設定をしているので、クローラーを選択しクローラ時の実行を選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/0e2020c3-e3dc-b605-1084-3f42a361cc9e.png)

　↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/047a333b-b119-0bbd-57fd-c406792f787e.png)

１分程度で処理が終わる

作成されたテーブルを確認してみよう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/07a6c5bc-bb43-d865-aa0a-648e8bac4ab4.png)

サイドバーのテーブルを接続すると、新しいテーブルが出来ていることが確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/77426346-6a3c-0907-c8f4-5b52fe321ca8.png)

テーブルの情報各種が見れる状態となっている。
不要なカラムを削除したりすることもできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/93ce8f28-a7c2-d2ee-9afb-48abcc2b4c3b.png)


## Athenaでの操作（データカタログへのアクセス）

ここまでできたら、作成されたData catalogにAthenaでアクセスし、
データが取り出せるかをテストする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/4d512983-a185-a245-d6db-aa2d578ebb16.png)



シンプルなSQLを記述して実行、
無事にCSVファイルを取り込んだものからSQLが実行できることが確認できる。
※初回などS3に保存場所を確保していないときは、Run Queryが出来ないので設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/36b819a1-c178-0150-4a93-9a7a987bc572.png)

## Glueでの操作

### ジョブを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/9c7fe782-3639-e0a1-9934-905e202a6374.png)

#### ジョブのプロパティ設定

名前：適当に
IAMロール：先ほどの、Athenaで使用したものと同じ
Type：今回はSpark
スクリプトファイル名：デフォルト
スクリプトが保存されているS3パス：任意のパスを指定
一次ディレクトリ：任意のパスを指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/2e82b3a8-3571-12f6-151d-52167ef524be.png)

#### データソースの選択

最初にアップロードしたCSV選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/955aed60-ba18-c57a-eb68-e821f012c6ae.png)

#### 変換タイプの選択

デフォルト値

#### データターゲットの選択

データストア：AmazonS3
形式：Parquet
ターゲットパス：出力したいS3パスを指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/b8dd23af-6163-e6c8-4d7d-49567a18d04e.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/757448a3-e701-b000-5df7-9c6107b3cbe1.png)


#### ソース列をターゲット列にマッピング

必要があれば修正、今回はそのまま次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/803df0ca-f49d-30d1-ff62-b192066a0fed.png)

#### ジョブの実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/250de00e-d87c-3e79-ba5b-153d715f6478.png)

エラーの時は、Cloud watch logに内容が書き出される

成功時にはステータスがSuccessedとなり
S3のout用フォルダに、Parquetフォーマットのファイルが作成されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/fc3b812f-2030-77e1-1533-05b6dc9f0426.png)


#### もう一度、クローラ設定で、読み込ませてみる。

先ほどと同様に、クローラ設定をし、今度はparquetフォーマットのファイルを読み込ませて
同様にAthenaで取り出してみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/3dc59a58-548c-6382-278d-847078481074.png)

フォーマットがparquetに変換されたので
列単位での集計処理などが高速化されるデータフォーマットに変換ができました。

## 最後に

ここでやった処理は、以下の通りです。

CSV→テーブル変換→parquetで出力→テーブル変換

これだけだと、何が便利かわかりづらいのですが。

今回はオンデマンドで実行していたのですが、
実践の場面では、トリガーを組み合わせることで、
以下のような事が出来るようになる為、便利そうだと感じました。

* 何かしらのフォーマットをアップロード→スケジュールが来れば実行→最適な形式へ変換
* 定期出力されるCSV→スケジュールごとに実行して最適な形式へ変換