Amazon Web Services ブログ

AWS Step Functions を用いた AWS Glue クローラのオーケストレーション

この投稿は、AWS Workflow の General Manager である Justin Callison によって書かれています。

組織は半構造化されたテラバイト規模の様々なデータを日々生成しています。AWS GlueAmazon 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 でサンプルをデプロイします。

  1. こちら から template.yaml をダウンロードします。
  2. マネジメントコンソール にログインし、 AWS CloudFormation に移動します。
  3. サイドパネルのスタックを選択し、スタックの作成から新しいリソースを使用 (標準) をクリックします。
  4. テンプレートの準備完了テンプレートファイルのアップロードを選択し、ファイルの選択からステップ1 でダウンロードした template.yaml を選択し、次へをクリックします。
  5. スタックの名前glue-stepfunctions-demo などのスタック名を入力し次へを選択します。
  6. スタックオプションの設定はデフォルトのままで次へを選択し、機能と変換セクションを確認してチェックボックスにチェックを入れ、スタックの作成をクリックします。
  7. デプロイが完了するとステータスが CREATE_COMPLETE になります。

データセットの作成

マネジメントコンソールで Step Functions コンソールに移動し、先ほどの CloudFormation スタックから作成された create-dataset ステートマシン(名前にはスタック作成時に指定した ParameterPrefix がつく)をリストから選択します。このステートマシンは、 Express ワークフローParallel ステート を使用して、同時に 3 つのデータセットを S3 に構築します。最初の 2 つのデータセットには、それぞれ userlocation の情報が含まれており、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-summariesdaily-location-summaries には年、月、日毎にネストされたフォルダがあります。このフォルダ構造はコンソールから目的のデータへ遷移しやすいことに加えて、データセットをパーティションに分割して、より効率的にクエリできるように AWS Glue へヒントを提供します。

クロール

AWS Glue クローラを使用してこれらのデータセットを分析し、クエリできるようにします。AWS Glue コンソールに移動し、サイドパネルから Crawlers を選択して、スタックをデプロイしたときに作成されたクローラのリストを表示します。daily-user-summaries クローラを選択して詳細を表示し、datatypeis-partitioned などのメタデータを示すタグが割り当てられていることを確認します。

Step Functions コンソールへ戻り、 run-crawlers-with-tags ステートマシンをクリックします。このステートマシンは AWS SDK のサービス統合 を使用して、入力したタグ条件に一致する全てのクローラのリストを取得します。次に、Map ステートStep Functions の最適化されたサービス統合を使用して、一致する各クローラの run-crawler ステートマシンを実行します。 run-crawler ステートマシンは各クローラを起動し、クローラが完了するまでステータスを監視します。個々のクローラがそれぞれ完了すると、 run-crawlers-with-tags ステートマシンも完了します。

クローラを開始するには以下を行います。

  1. run-crawlers-with-tags ステートマシンのページ上部の実行の開始を選択します。
  2. 入力として下記を提供します。
    {"tags": {"datatype": "json"}}
  3. 実行の開始をクリックします。

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 をご覧ください。

翻訳はソリューションアーキテクトの松岡勝也が担当しました。原文はこちらです。