【AWS Glue】AWS Glue Data Catalog と AWS Glue Studio を活用して簡単ETLジョブ作成!

記事タイトルとURLをコピーする

f:id:swx-mine:20211115134752p:plain AWS GlueはAWSのフルマネージドなETLサービスです。S3やAuroraなどさまざまなデータソース/ターゲットのメタデータをData Catalogとして保存し、それらに対して抽出・変換・ロードのジョブが実行できます。またサーバーレスであるためインフラの管理もほとんど必要ありません。

docs.aws.amazon.com

AWS Glueではスクリプトをジョブとして実行しますが、AWS Glue Studio というツールも用意されています。GUIで実行したい処理のノードをつなげることでジョブが作成できるというツールです。裏ではスクリプトが生成されています。このAWS Glue Studioによりスクリプトをほとんど書かずにジョブが作成できます。今回はAWS Glue Studioを使ってS3・Auroraのデータを処理しAmazon Redshiftへデータを取り込むジョブを作成します。

docs.aws.amazon.com

0. 今回の構成

0-1. データ

今回は青空文庫の形態素データ解析データを使用します。「解析対象データ一覧」と「新字新仮名全データ」を使用ます。「解析対象データ一覧」は対象となる作品一覧で、「新字新仮名全データ」は形態素解析データになります。

氏名 「河原 翔」
作品タイトル 「青空文庫 形態素解析データ集」
URL 「http://aozora-word.hahasoha.net/

aozora-word.hahasoha.net

0-2. 構成

構成は以下のような構成です。あらかじめAurora MySQLに「解析対象データ一覧」を、S3バケットに「新字新仮名全データ」を格納しています。また出力先のRedshiftも構築済み・テーブル作成済みです。Aurora MySQLとS3に格納されているデータから必要なデータを抽出・結合しRedshiftへ出力するようなジョブを作成してみたいと思います。 f:id:swx-mine:20211109172146p:plain

1. Data Catalogの作成

1-1. Aurora/Redshiftへの接続

VPC内のリソースに対してData Catalogを作成する場合、AWS Glueにて「接続」を作成する必要があります。AWS GlueがVPC内のリソースに接続する際にENIが作成されます。そのENIの設定や認証情報などの設定が、この接続です。今回はデータソースであるAurora用の接続とターゲットとなるRedshiftの接続を作成します。

それぞれこんな感じです。選択するサブネットはNAT GatewayもしくはVPCエンドポイント経由でS3と通信できる必要があります。

f:id:swx-mine:20211109184324p:plain
Aurora MySQL
f:id:swx-mine:20211109184341p:plain
Redshift

1-2. クローラを作成

クローラは自動でスキーマを判定してをData Catalog のテーブルを作成します。列が多いのでクローラで自動で取得するのが便利です。テーブル作成後にもスキーマは編集することが可能です。以下な感じな設定で作成しました。

f:id:swx-mine:20211109213348p:plain
Aurora MySQL
f:id:swx-mine:20211109213405p:plain
Redshift
S3は接続の設定は不要でクローラを作成できます。
f:id:swx-mine:20211109214152p:plain
S3

1-3. クローラの実行とテーブル作成

作成したクローラをそれぞれ実行しテーブルを作成します。

f:id:swx-mine:20211109213605p:plain
作成したクローラにチェックし「クローラの実行」
f:id:swx-mine:20211109213858p:plain
テーブルが作成される。スキーマがおかしければ編集する。

2. AWS Glue Studioでジョブ作成

2-1. ジョブの作成

AWS Glue Studioでジョブを作成します。AWS Glue Studioではノードつなげることで処理を作成します。ノードはSource, Transform, Targetの3種類があり、それぞれの中にもいくつかタイプがあります。ノード内の設定で親ノードを指定することでノードをつなげることができます。

f:id:swx-mine:20211109215143p:plain
ノード。クリックして追加できる。
f:id:swx-mine:20211109215408p:plain
親ノードを指定してつなげる。
実際の作成の流れ冗長なのでは割愛しますが、以下のような感じになりました。
f:id:swx-mine:20211112174652p:plain
ジョブ。

項番 ノード名 ノードの種類 ノードタイプ 説明
1 作品リスト Source MySQL データカタログに作成した「解析対象データ一覧」用MySQLのテーブル。
2 使用する列の抽出 Transform Select Feilds 使用する列を選択します。
3 列名の変更 Transform Apply mapping MySQLには「解析対象データ一覧」の元データと同じ日本語の列名を使用しているので、ここで英字に変更しています。
4 形態素解析データ Source Amazon S3 形態素解析データ「新字新仮名全データ」を格納しているS3。
5 file列で内部結語 Transform Join file列という列があるのでこれで内部結合します。
6 不要な列のドロップ Transform DropFields 5でfile列が2つできてしまうのでDropします。
7 著作権フラグなしの抽出 Transform Filter 著作権フラグがないもののみフィルターして使用します。
8 Redshiftに出力 Target Amazon Redshift データの出力先のRedshift

ちなみに、今回は使用していませんがTransformにはCustom TransformとSpark SQLのタイプも用意されています。Custom TransformではPython、Spark SQLではSQLを記述することでユーザー側でカスタムした処理を実行することができます。

2-2. ジョブの詳細設定

ジョブの詳細設定をします。今回は以下な感じにしています。ジョブのIAMロールやAWS Glueのバージョンが選択できます。AWS Glueのパフォーマンスに影響しそうなのはWorker typeとRequested number of workersでしょうか。それぞれ項目名どおり設定項目ですがWorker typeはジョブで立ち上がるWorkerのスペック、Requested number of workersはその台数になります。今回はなんだかんだあってG.2Xの20台としています。Job bookmarkとは簡単に言うと、過去のジョブで読み込んだデータを読み込まないか、変更点だけ読み込むか、全部読み込むかです。今回はblog用なのでDisableとし過去に読み込んだものも読み込むようにしています。Number of retriesでジョブ失敗時のリトライ回数を指定します、今回blog用なので0とします。Job timeout (minutes)でタイムアウト時間を指定します、今回はデフォルトです。Advanced propertiesでそのほかの設定も可能です、今回はデフォルトです。

f:id:swx-mine:20211112184025p:plain
Job details。

2-3. ジョブの保存

ジョブの実行前に必ず編集画面右上の「Save」をします。AWS Glue Studioで作成したジョブは通常のジョブと同じ扱いになり、AWS Glueのコンソールからも確認できます。AWS Glue Studioで作成したジョブとそうでないジョブを組み合わせてワークフローを作成することも可能です。

f:id:swx-mine:20211112190347p:plain
AWS Glue Studioで作成したジョブはAWS Glueのジョブ一覧からも確認できる。

3. ジョブの実行

3-1. ジョブの実行

AWS Glue Studioに戻り作成したジョブを実行します。ジョブ一覧の「Run Job」かジョブ詳細画面の「Run」で実行できます。ジョブを実行するとジョブ詳細画面のRunsタブから実行中のジョブや過去に実行されたジョブが確認できます。

f:id:swx-mine:20211115112602p:plain
Runsタブから過去の実行が確認できる。

3-2. ジョブのログ

ログ出力先であるCloudWatch Logsへのリンクがあるので、そこからログを確認できます。ログはいくつか種類があります。ジョブ失敗時はログを確認しましょう。

種類 説明
All logs 各ワーカーのログやprogress barなど。
Output logs その名の通りアウトプットログです。
Error logs その名の通りエラーログです。

f:id:swx-mine:20211115112414p:plain
3種類のログ。
f:id:swx-mine:20211115112438p:plain
All logsの例。

3-3. ジョブのメトリクス

ジョブIDをクリックすると実行されたジョブの詳細画面へ飛びます。ジョブの設定情報はもちろん、ジョブのメトリクスも確認できます。ここでCPU使用率やメモリ使用率などの基本的なメトリクスが確認できます。

f:id:swx-mine:20211115115315p:plain
IDから実行されたジョブの詳細へ飛べる。
f:id:swx-mine:20211115120429p:plain
基本的なメトリクスはここでも確認できる。

4. 結果

ジョブのステータスが「Succeeded」になれば正常にジョブが完了しています。それ以外なら「Failed」となるのでエラーを確認しましょう。Redshift Query Editer v2でRedshiftへ出力したデータを確認してみるとちゃんとできていました。

f:id:swx-mine:20211115131859p:plain
いい感じ。

5. まとめ

いかがでしたでしょうか。AWS GlueならいろんなデータソースがあってもData CatalogとAWS Glue Studioで簡単に管理・ETLジョブ作成ができます。StudioでSQLかコードを書いて処理を作成することも可能ですが、通常のAWS Glueジョブとワークフローにて組み合わせることも可能なのでかなり便利です。AWS Glue Studioと似たAWS サービスにAWS Glue Databrewというのがあります。同じようなことはできますが実はかなり違ったサービスなのでまた別のブログで解説したいと思います。

Yusuke Mine(書いた記事を見る)

I get drunk but it's not enough 'Cause the morning comes and you're not my baby.