最近 PySparkを少し触ってみたこともあり、 Apache Sparkをサーバーレスに実行している
AWS Glueというサービスを使ってみました。
データ分析ではデータベースを使うことが多く、データを入れるためにはETL処理は必要不可欠になりますが、
Glueを使うことでこの作業を効率化できるようです。
AWS Glue とは
監視やバックアップなど運用に関わる作業をすべてクラウドが行ってくれるといった、
フルマネージドかつサーバーレスのETL(抽出・変換・ロード)サービスです。
Amazon S3やRDS、Redshiftと統合してデータストアに接続することができます。
課金は、ジョブ・クローリングの実行で Glueが使用したリソースに対してのみ発生します。
具体的には、AWSのコンソール上で下記ができます。
データカタログの登録 ----------- データソースのクロールによる分析用データの準備をしてくれます。
JSON、CSV、Parquetのデータタイプに対応しています。ジョブのスケジュール実行 ------- 定期的なトリガやLambdaイベントに対応してフローを実行することができます。
また、ジョブを適切な順序に調整、失敗したジョブの再試行といったことを自動でしてくれます。
ちなみに「Glue」とは「接着剤、糊」といった意味で、AWSサービスとの連携を管理してくれるため、
利用者はETLジョブの作成や監視に注力できるといったメリットがあります。
参考
やってみたこと
権限の設定
Glueのチュートリアル(クローラ作成とジョブ実行)
権限の設定
Glueのサービスを使うための IAMロールの作成と、
Glueをコンソールから操作するための権限を付与したユーザーの作成を行います。
IAMロールの作成
下記の手順を参考にさせて頂きました。画面付きで手順が詳しく記載されています。
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のチュートリアルが存在していて、
これをやることで簡単な一連の流れを体験することができます。
入力画面にガイドが表示されるので、慣れている人はそのガイドを見ながらやるだけで大丈夫かと思います。
私はガイドを読みつつ、 下記サイトを参考にさせて頂きました。
詳細は下記サイトに記載されているので、
私のこの記事では簡単な流れや補足事項を中心に書いています。
このチュートリアルは「S3に保存されているCSVファイルをParquet形式に変換する」ことをゴールにしていて、
その過程としてデータカタログへの登録・クローラの作成・テーブルの作成・Parquet形式への変換を行っています。
- Parquet形式とは
大規模データの分析に適したフォーマットのことで、CSVなどの行方向でなく、列方向にデータが格納されます。
Parquet形式はさらに内部で行方向のメタデータも保持しており、クエリの高速化を実現することができます。
チュートリアルは、AWSコンソールのサービス一覧からAWS Glue
-> Get started
を選択し、
Glue管理画面の左側にあるメニューから行うことができます。
クローラの作成
クローラはリポジトリのデータを読み取り、テーブルを生成して、Glueのデータカタログに自動で登録してくれます。
参考サイトの手順では、クローラ名の入力とロールの設定を同じ画面で行っていますが、
私の環境ではロールの設定は別画面で行うようになっていました。
チュートリアルの「Add crawler」をクリックすることで追加ができます。
この画面は左側のメニューにある「Crawlers」をクリックしたときと同じ画面ですが、
チュートリアルのほうを選択すると、黒い吹き出しでガイドが表示されます。
クローラ名を適当に入力します。今回はFlight_Data_Crawler
としました。
データストアをS3
に設定します。
読み取るファイルの指定は、用意されているファイルを使うのでデフォルトのままで良いですが、
配下のファイル全てにするため末尾に/
を付与します。
データストアを複数指定することも可能ですが、今回は1つだけとするのでNo
を選択します。
先ほど作成したIAMロールAWSGlueServiceRoleDefaultCM
を設定します。
スケジュールを設定します。時間単位、日次、月次、週単位で設定できます。
今回は手動で実行するのでRun on demand
を設定します。
出力先のデータベースを指定します。
既存または新規で作成することができます。
今回は新規で作成するので、Add database
のボタンをクリックして適当なデータベース名を入力しました。
他の設定はデフォルトのままで問題ないです。Finish
ボタンをクリック後、今までの設定内容を確認したらクローラの作成が完了です。
クローラの実行
作成したクローラにチェックを入れ、Run crawler
をクリックして実行します。
クローラのStatusが Ready -> Starting -> Stopping -> Ready に遷移します。
Readyに戻ったら処理が終わっているので、ログと作成されたテーブルを確認します。
ログは、クローラのLogs
のリンクをクリックすることで確認することができます。
テーブルは左側メニューのチュートリアル欄にあるExplore table
もしくはTables
をクリックして確認できます。
テーブル情報の詳細確認や、スキーマ情報の編集を行うこともできます。
詳しい手順は参考サイトに記載されています。
ジョブの作成
左側のメニューからチュートリアル欄にあるAdd job
をクリック -> Add job
ボタンをクリックします。
ジョブ名を適当に入力し、作成したIAMロールを設定、This job runsではGlueで生成されたスクリプトを使用する設定にしました。
また、言語はPythonまたはScalaを選択できます。今回はPython
を選択しました。
スクリプトファイル名、スクリプトファイル格納先のパス、出力結果を格納するパスを適当に設定します。
入力データソースの指定では、先ほどクローラ実行後に作成されたCSVを選択します。
出力データソースは新規と既存で選択できます。
今回は新規で作成するので、ラジオボタンでCreate tables in your data target
を選択し、Next
ボタンをクリックします。
次の画面でデータストアにAmazon S3
、フォーマットにParquet
、出力先を適当に設定します。
入力元(ソース)と出力先(ターゲット)のマッピング表が表示されます。
この画面では項目を削除したり、順序を変更したりすることができます。
次の画面で今までの設定内容を確認してFinish
ボタンをクリックすると、ジョブの作成が完了です。
自動生成されたスクリプトのコードがエディターに表示され、左側にスクリプトの図も表示されています。
ジョブの実行
画面上のほうにあるRun job
ボタンをクリックします。
クリック後にパラメータの入力画面が表示されますが、今回は何も入力せずに再度Run job
ボタンをクリックしました。Run job
ボタンがグルグルまわり始め、ジョブの実行中になります。
Save
ボタンクリック後に右上にある×
ボタンをクリックするとjobsの画面になります。
この画面でジョブを選択すると、ジョブの状態を確認できます。
ジョブの実行は10分程度かかり、Succeeded
になればジョブの実行が完了です。Logs
のリンクをクリックすることで、Cloud Watchに出力されたログの確認をすることができます。
ちなみに、jobs画面でジョブを選択してEdit script
を選択すると、エディターと図が表示されている画面になります。
��ジョブの実行はjobsの画面からでもできます。)
S3の管理画面では、指定したディレクトリにParquetファイルが出力されています。
やってみた所感
Glueのチュートリアルをやることで、処理の流れや他サービスとの連携方法を理解することができたので、
初心者の私にとっては非常に有り難く、AWSの優しさを感じました。
コードを触らずにデータの抽出や登録といったことが自動でできてしまい、非常に便利ではありますが、
自動でやっている内容をしっかり理解しておかないと
エラー時等に対処できないと思うので、理解をより深めておく必要があると思っています。
Glueでできることは他にもありそうなのですが、
いま気持ちがGCPにだいぶ傾いているので、深掘りはAWSに気持ちが戻ってきてからにしようと思います。