Amazon Web Services ブログ
AWS Step Functions を用いた AWS Glue クローラのオーケストレーション
この投稿は、AWS Workflow の General Manager である Justin Callison によって書かれています。
組織は半構造化されたテラバイト規模の様々なデータを日々生成しています。AWS Glue と Amazon Athena を使用するとインフラストラクチャの管理なく、これらのデータをシンプルで費用対効果の高い方法で分析できます。AWS Glue クローラは、データ変換やデータウェアハウスへのロードなしにデータのスキーマを識別し、データをその場で分析するために必要なメタデータを管理します。
クローラが実行されて完了するタイミングは重要です。クローラが実行されるタイミングはデータが更新された後且つ、 Athena でのクエリ実行や AWS Glue ジョブでの分析の前である必要があります。タイミングがこの間でない場合、解析でエラーが発生したり、不完全な結果が返されることがあります。
本ブログでは、220 以上の AWS サービスと統合するローコードのビジュアルワークフローサービスである AWS Step Functions の使用方法を紹介します。Step Functions はクローラをオーケストレーションして、開始時刻を制御し、完了を確認して、エンドツーエンドのサーバーレスデータ処理ワークフローに結合します。
Step Functions を使用して複数の AWS Glue クローラをオーケストレーションすると、コードを使用してソリューションを直接実装する場合と比べて多くの利点があります。まず、ワークフローによって、アプリケーションと実行中に発生するエラーを即座に視覚的に理解できます。また、Map ステート内でネストされたワークフローを実行する Step Functions の機能は、ネイティブの配列反復でアプリケーションコンポーネントを分離して再利用するのに役立ちます。そして、Step Functions の待機ステートにより、ワークフローはクロールジョブのステータスを定期的にポーリングし、アイドル待機時間の追加コストは発生しません。
サンプルのデプロイ
この例では、Amazon S3 に 3 つのデータセットを作成し、Step Functions を用いて AWS Glue クローラをオーケストレーションし、データセットを分析して、Athena でクエリできるようにします。
以下のステップを使用して、AWS CloudFormation でサンプルをデプロイします。
- こちら から
template.yaml
をダウンロードします。 - マネジメントコンソール にログインし、 AWS CloudFormation に移動します。
- サイドパネルのスタックを選択し、スタックの作成から新しいリソースを使用 (標準) をクリックします。
- テンプレートの準備完了とテンプレートファイルのアップロードを選択し、ファイルの選択からステップ1 でダウンロードした
template.yaml
を選択し、次へをクリックします。 - スタックの名前に
glue-stepfunctions-demo
などのスタック名を入力し次へを選択します。 - スタックオプションの設定はデフォルトのままで次へを選択し、機能と変換セクションを確認してチェックボックスにチェックを入れ、スタックの作成をクリックします。
- デプロイが完了するとステータスが
CREATE_COMPLETE
になります。
データセットの作成
マネジメントコンソールで Step Functions コンソールに移動し、先ほどの CloudFormation スタックから作成された create-dataset ステートマシン(名前にはスタック作成時に指定した ParameterPrefix がつく)をリストから選択します。このステートマシンは、 Express ワークフロー と Parallel ステート を使用して、同時に 3 つのデータセットを S3 に構築します。最初の 2 つのデータセットには、それぞれ user
と location
の情報が含まれており、2016 年から 2020 年までの 5 年間の 1 日あたりのファイルが含まれています。3 番目のデータセットは location
別データのよりシンプルなサマリーです。
データセットを作成するために、create-dataset
スタートマシンのツールバーから実行の開始をクリックし、表示されるダイアログボックスから実行の開始を選択します。これによりステートマシンが実行され、S3 にデータセットが生成されます。
S3 コンソールから先ほどステートマシンで生成された glue-stepfunctions-demo-databucket
バケットを選択します。バケット内の data
フォルダ配下にデータセットをそれぞれ格納した 3 つのサブフォルダがあります。
all-time-location-summaries
フォルダには location
毎に 1 つずつ JSON ファイルのセットが格納されています。
daily-user-summaries
と daily-location-summaries
には年、月、日毎にネストされたフォルダがあります。このフォルダ構造はコンソールから目的のデータへ遷移しやすいことに加えて、データセットをパーティションに分割して、より効率的にクエリできるように AWS Glue へヒントを提供します。
クロール
AWS Glue クローラを使用してこれらのデータセットを分析し、クエリできるようにします。AWS Glue コンソールに移動し、サイドパネルから Crawlers を選択して、スタックをデプロイしたときに作成されたクローラのリストを表示します。daily-user-summaries
クローラを選択して詳細を表示し、datatype
や is-partitioned
などのメタデータを示すタグが割り当てられていることを確認します。
Step Functions コンソールへ戻り、 run-crawlers-with-tags
ステートマシンをクリックします。このステートマシンは AWS SDK のサービス統合 を使用して、入力したタグ条件に一致する全てのクローラのリストを取得します。次に、Map ステートと Step Functions の最適化されたサービス統合を使用して、一致する各クローラの run-crawler
ステートマシンを実行します。 run-crawler
ステートマシンは各クローラを起動し、クローラが完了するまでステータスを監視します。個々のクローラがそれぞれ完了すると、 run-crawlers-with-tags
ステートマシンも完了します。
クローラを開始するには以下を行います。
run-crawlers-with-tags
ステートマシンのページ上部の実行の開始を選択します。- 入力として下記を提供します。
{"tags": {"datatype": "json"}}
- 実行の開始をクリックします。
2 〜 3 分後に、 3 つのクローラがすべて完了すると実行は成功ステータスで終了します。この間、run-crawler
ステートマシンに移動してクローラ毎にネストされた個々の実行の表示や、AWS Glue コンソールに移動してクローラのステータスの確認を行えます。
Amazon Athena を使用したデータのクエリ
次に、クローラで作成されたデータベースとテーブルを表示する Athena コンソールに移動します。AWS Glue はパーティションスキームを認識し、JSON ファイルに含まれるデータの user
フィールドと usage
フィールドに加えて、年、月、日のフィールドを含めます。
このアカウントで以前に Athena を使用したことがない場合は、クエリ結果の場所を設定するように指示するメッセージが表示されます。クエリエディタの設定から管理をクリックし、クエリ結果の場所で S3 を参照を選択し、スタックで作成された athena-results
バケットを選択します。そして、保存を選択し、エディタに戻ります。
Glue により作成された database
をデータベースフィールドで選択し、以下のクエリを実行することで 5 年間のすべてのユーザーの合計使用量を計算できます。
SELECT SUM(usage) all_time_usage FROM "daily_user_summaries"
以下の例のように、結果を 2016 年のものに限定するフィルターを追加することもできます。
SELECT SUM(usage) all_time_usage FROM "daily_user_summaries" WHERE year = '2016'
この 2 つ目のクエリは 17% のデータしかスキャンせず ( 2 つ目は 133 KB、1 つ目は 797 KB)、より早く完了したことに注目してください。これは Athena がパーティション情報を使用してデータセット全体のクエリを回避するためです。この例の違いはわずかですが、テラバイト規模の実世界のデータセットではデータのパーティションによるコストとレイテンシの節約が大きくなる可能性があります。
パーティションスキームの欠点は、新しいパーティションを追加するまで新しいフォルダーがクエリ結果に含まれないことです。クローラを再実行すると、新しいパーティションが識別されて追加されます。Step Functions を使用してこれらのクローラを調整すると、そのタスクが簡単になります。
サンプルの拡張
これらサンプルのステートマシンを AWS アカウントでそのまま使用して、既存のクローラを管理できます。Amazon EventBridge での Amazon S3 イベント通知を使用して、データ変更に基づいてクローラを起動できます。 Step Functions での最適化された Amazon Athena のサービス統合により、これらのクロールされたデータセットに対してクエリを実行するようにワークフローを拡張できます。また、これらのサンプルを使用してクローラの実行をエンドツーエンドのデータ処理ワークフローに統合し、取り込みから分析まで信頼性が高く監査可能なワークフローを構築できます。
まとめ
このブログでは Step Functions を使用して AWS Glue クローラをオーケストレーションする方法を紹介しました。3 つのデータセットを生成するサンプルをデプロイし、Step Functions で Glue クローラの実行を開始および調整します。また、クローラによりこのデータを分析して、Athena を使用してクエリ実行できるようにします。
Step Functions の詳細については Serverless Land をご覧ください。
翻訳はソリューションアーキテクトの松岡勝也が担当しました。原文はこちらです。