AWS Glue のチュートリアルをやってみました

最近 PySparkを少し触ってみたこともあり、 Apache Sparkをサーバーレスに実行している
AWS Glueというサービスを使ってみました。

データ分析ではデータベースを使うことが多く、データを入れるためにはETL処理は必要不可欠になりますが、
Glueを使うことでこの作業を効率化できるようです。






AWS Glue とは



監視やバックアップなど運用に関わる作業をすべてクラウドが行ってくれるといった、
フルマネージドかつサーバーレスのETL(抽出・変換・ロード)サービスです。

Amazon S3やRDS、Redshiftと統合してデータストアに接続することができます。

課金は、ジョブ・クローリングの実行で Glueが使用したリソースに対してのみ発生します。





具体的には、AWSのコンソール上で下記ができます。




  • データカタログの登録 ----------- データソースのクロールによる分析用データの準備をしてくれます。
    JSONCSV、Parquetのデータタイプに対応しています。


  • ETLを行うコードの自動生成 ----- PythonScalaどちらかを選択できます。


  • ジョブのスケジュール実行 ------- 定期的なトリガやLambdaイベントに対応してフローを実行することができます。
    また、ジョブを適切な順序に調整、失敗したジョブの再試行といったことを自動でしてくれます。







ちなみに「Glue」とは「接着剤、糊」といった意味で、AWSサービスとの連携を管理してくれるため、
利用者はETLジョブの作成や監視に注力できるといったメリットがあります。






参考



dev.classmethod.jp



dev.classmethod.jp



aws.amazon.com






やってみたこと












権限の設定






Glueのサービスを使うための IAMロールの作成と、
Glueをコンソールから操作するための権限を付与したユーザーの作成を行います。






IAMロールの作成



下記の手順を参考にさせて頂きました。画面付きで手順が詳しく記載されています。



dev.classmethod.jp





Glueで使用するための、ソース・ターゲット・スクリプト・S3へのアクセスができる権限を付与したIAMロールを作成します。

AWSコンソールからロール作成画面に行き、
ロールタイプでGlueを選択して下記の権限を付与します。




  • AWSGlueServiceRole


  • AmazonS3FullAccess







ロール名は先頭にAWSGlueServiceRoleを付けるという命名規約があるそうなので、
「AWSGlueServiceRoleDefaultCM」という名前にしました。






Glueサインイン用のIAMユーザーを作成



Glueをコンソールから操作するための、ポリシーを付与したIAMユーザーを作成します。
ユーザー名は任意でいいので、今回はadmin-for-glueとしました。

ユーザー名を入力する画面で、プログラムによるアクセスAWS マネジメントコンソールへのアクセスにチェックを入れておきます。

下記ポリシーを付与したユーザーを新規で作成します。




  • AWSGlueConsoleFullAccess


  • CloudWatchLogsReadOnlyAccess


  • AWSCloudFormationReadOnlyAccess


  • AmazonAthenaFullAccess








Jupyter Notebook用のIAMロールを作成



今回は使いませんが、Pythonコードで分析をする際によく使われるJupyterに、権限を付与してGlueで使うことができるようです。
ロールタイプでEC2を選択、ユースケースEC2を選択して下記権限を付与します。




  • AWSGlueServiceNotebookRole


  • AmazonS3FullAccess







ロール名は先頭にAWSGlueServiceNotebookRoleを付ける規則があるようなので、
「AWSGlueServiceNotebookRoleDefaultCM」としました。









Glueのチュートリアル






AWSコンソール上でGlueのチュートリアルが存在していて、
これをやることで簡単な一連の流れを体験することができます。
入力画面にガイドが表示されるので、慣れている人はそのガイドを見ながらやるだけで大丈夫かと思います。
私はガイドを読みつつ、 下記サイトを参考にさせて頂きました。

詳細は下記サイトに記載されているので、
私のこの記事では簡単な流れや補足事項を中心に書いています。



dev.classmethod.jp





このチュートリアルは「S3に保存されているCSVファイルをParquet形式に変換する」ことをゴールにしていて、
その過程としてデータカタログへの登録・クローラの作成・テーブルの作成・Parquet形式への変換を行っています。




  • Parquet形式とは




大規模データの分析に適したフォーマットのことで、CSVなどの行方向でなく、列方向にデータが格納されます。
Parquet形式はさらに内部で行方向のメタデータも保持しており、クエリの高速化を実現することができます。





チュートリアルは、AWSコンソールのサービス一覧からAWS Glue -> Get startedを選択し、
Glue管理画面の左側にあるメニューから行うことができます。



f:id:mtomitomi:20180209120352p:plain






f:id:mtomitomi:20180209120411p:plain






クローラの作成



クローラはリポジトリのデータを読み取り、テーブルを生成して、Glueのデータカタログに自動で登録してくれます。
参考サイトの手順では、クローラ名の入力とロールの設定を同じ画面で行っていますが、
私の環境ではロールの設定は別画面で行うようになっていました。





チュートリアルの「Add crawler」をクリックすることで追加ができます。
この画面は左側のメニューにある「Crawlers」をクリックしたときと同じ画面ですが、
チュートリアルのほうを選択すると、黒い吹き出しでガイドが表示されます。



f:id:mtomitomi:20180209122902p:plain





クローラ名を適当に入力します。今回はFlight_Data_Crawlerとしました。



f:id:mtomitomi:20180209123406p:plain





データストアをS3に設定します。
読み取るファイルの指定は、用意されているファイルを使うのでデフォルトのままで良いですが、
配下のファイル全てにするため末尾に/を付与します。



f:id:mtomitomi:20180209123423p:plain





データストアを複数指定することも可能ですが、今回は1つだけとするのでNoを選択します。



f:id:mtomitomi:20180209130257p:plain





先ほど作成したIAMロールAWSGlueServiceRoleDefaultCMを設定します。



f:id:mtomitomi:20180209123516p:plain





スケジュールを設定します。時間単位、日次、月次、週単位で設定できます。

今回は手動で実行するのでRun on demandを設定します。



f:id:mtomitomi:20180209130650p:plain





出力先のデータベースを指定します。
既存または新規で作成することができます。

今回は新規で作成するので、Add databaseのボタンをクリックして適当なデータベース名を入力しました。
他の設定はデフォルトのままで問題ないです。

Finishボタンをクリック後、今までの設定内容を確認したらクローラの作成が完了です。






クローラの実行



作成したクローラにチェックを入れ、Run crawlerをクリックして実行します。



f:id:mtomitomi:20180209131116p:plain





クローラのStatusが Ready -> Starting -> Stopping -> Ready に遷移します。

Readyに戻ったら処理が終わっているので、ログと作成されたテーブルを確認します。





ログは、クローラのLogsのリンクをクリックすることで確認することができます。



f:id:mtomitomi:20180209132219p:plain





テーブルは左側メニューのチュートリアル欄にあるExplore tableもしくはTablesをクリックして確認できます。

テーブル情報の詳細確認や、スキーマ情報の編集を行うこともできます。

詳しい手順は参考サイトに記載されています。



f:id:mtomitomi:20180209132458p:plain






ジョブの作成



左側のメニューからチュートリアル欄にあるAdd jobをクリック -> Add jobボタンをクリックします。



f:id:mtomitomi:20180209133235p:plain





ジョブ名を適当に入力し、作成したIAMロールを設定、This job runsではGlueで生成されたスクリプトを使用する設定にしました。

また、言語はPythonまたはScalaを選択できます。今回はPythonを選択しました。

スクリプトファイル名、スクリプトファイル格納先のパス、出力結果を格納するパスを適当に設定します。



f:id:mtomitomi:20180209133948p:plain





入力データソースの指定では、先ほどクローラ実行後に作成されたCSVを選択します。





出力データソースは新規と既存で選択できます。
今回は新規で作成するので、ラジオボタンCreate tables in your data targetを選択し、Nextボタンをクリックします。
次の画面でデータストアにAmazon S3、フォーマットにParquet、出力先を適当に設定します。





入力元(ソース)と出力先(ターゲット)のマッピング表が表示されます。

この画面では項目を削除したり、順序を変更したりすることができます。



f:id:mtomitomi:20180209135101p:plain





次の画面で今までの設定内容を確認してFinishボタンをクリックすると、ジョブの作成が完了です。

自動生成されたスクリプトのコードがエディターに表示され、左側にスクリプトの図も表示されています。



f:id:mtomitomi:20180209135354p:plain






ジョブの実行



画面上のほうにあるRun jobボタンをクリックします。

クリック後にパラメータの入力画面が表示されますが、今回は何も入力せずに再度Run jobボタンをクリックしました。

Run jobボタンがグルグルまわり始め、ジョブの実行中になります。



f:id:mtomitomi:20180209140514p:plain





Saveボタンクリック後に右上にある×ボタンをクリックするとjobsの画面になります。
この画面でジョブを選択すると、ジョブの状態を確認できます。
ジョブの実行は10分程度かかり、Succeededになればジョブの実行が完了です。

Logsのリンクをクリックすることで、Cloud Watchに出力されたログの確認をすることができます。

ちなみに、jobs画面でジョブを選択してEdit scriptを選択すると、エディターと図が表示されている画面になります。
��ジョブの実行はjobsの画面からでもできます。)



f:id:mtomitomi:20180209142044p:plain





S3の管理画面では、指定したディレクトリにParquetファイルが出力されています。



f:id:mtomitomi:20180209142100p:plain






やってみた所感



Glueのチュートリアルをやることで、処理の流れや他サービスとの連携方法を理解することができたので、
初心者の私にとっては非常に有り難く、AWSの優しさを感じました。

コードを触らずにデータの抽出や登録といったことが自動でできてしまい、非常に便利ではありますが、
自動でやっている内容をしっかり理解しておかないと
エラー時等に対処できないと思うので、理解をより深めておく必要があると思っています。





Glueでできることは他にもありそうなのですが、
いま気持ちがGCPにだいぶ傾いているので、深掘りはAWSに気持ちが戻ってきてからにしようと思います。