Amazon Web Services ブログ
Amazon Redshift を使用したレイクハウスアーキテクチャの ETL および ELT 設計パターン: パート 2
このマルチポストシリーズのパート 1、Amazon Redshift を使用したレイクハウスアーキテクチャの ETL および ELT 設計パターン: パート 1 では、Amazon Redshift Spectrum、同時実行スケーリング、および最近サポートされるようになったデータレイクエクスポートを使用して、データレイクアーキテクチャ用の ELT および ETL データ処理パイプラインを構築するための一般的なお客様のユースケースと設計のベストプラクティスについて説明しました。
この記事では、AWS サンプルデータセットを使用して、Amazon Redshift のいくつかの ETL および ELT デザインパターンのステップバイステップのチュートリアルで、使用を開始する方法を説明します。
前提条件
開始する前に、次の前提条件を満たしていることを確認してください。
- この記事では、US-West-2 (オレゴン) リージョンから公開されている 2 つの AWS サンプルデータセットを使用します。テスト実行には US-West-2 (オレゴン) リージョンを使用して、クロスリージョンのネットワークレイテンシーとデータ移転によるコストを削減します。
- 同じリージョンに AWS アカウントがあること。
- AWS アカウントに
AdministratorAccess
ポリシーが付与されていること (本番環境の場合、これをさらに制限する必要があります)。 - データレイクに、Amazon Redshift からアンロードしたデータを保存するための
eltblogpost
という名前の既存の Amazon S3 バケットがあること。バケット名は AWS アカウント全体で一意であるため、提供されているサンプルコードに適用できるeltblogpost
を一意のバケット名に置き換えます。 - AWS CLI がインストールされ、AWS アカウントで使用できるように設定されていること。
-
redshift-elt-test-s3-policy
という名前の IAM ポリシーがあり、eltblogpost
という名前の Amazon S3 バケットに対する次の読み取りおよび書き込み権限があること。 -
redshift-elt-test-sampledata-s3-read-policy
という名前の IAM ポリシーがあり、awssampledbuswest2
という名前の Amazon S3 バケットの読み取り専用アクセス許可があり、このチュートリアルに使用するサンプルデータをホストしていること。 - redshift.amazonaws.com と glue.amazonaws.com と信頼関係がある
redshift-elt-test-role
という名前の IAM ロール、および次の IAM ポリシーがあること (本番環境の場合、必要に応じてこれをさらに制限する必要があります)。redshift-elt-test-s3-policy
redshift-elt-test-sampledata-s3-read-policy
AWSGlueServiceRole
AWSGlueConsoleFullAccess
-
redshift-elt-test-role
IAM ロールの ARN を書き留めます。 - 次のパラメータを持つ既存の Amazon Redshift クラスターがあること。
-
rseltblogpost
のクラスター名。 -
rselttest
のデータベース名。 - 4 つの dc2.large ノード。
-
redshift-elt-test-role
という名前の関連付けられた IAM ロール。 - 公開されているエンドポイント。
-
eltblogpost-parameter-group
という名前のクラスターパラメータグループ。これは、同時実行スケーリングを変更するために使用します - クラスターワークロード管理が手動に設定されていること。
-
- SQL Workbench / J (または選択した別のツール) があり、クラスターに正常に接続できること。
- PostgreSQL クライアント CLI (psql) を使用して同じリージョンに EC2 インスタンスがあり、クラスターに正常に接続できること。
- Amazon Athena および Redshift Spectrum クエリのメタデータカタログとして
eltblogpost
という名前の AWS Glue カタログデータベースがあること。
Amazon Redshift ローカルストレージへのデータのロード
この記事では、スタースキーマベンチマーク (SSB) データセットを使用します。これは、S3 バケット で公開されていて、Amazon S3 にアクセスできる認証済みの AWS ユーザーであれば誰でもアクセスできます。
Amazon Redshift ローカルストレージにデータをロードするには、次の手順を実行します。
- SQL Workbench/J からクラスターに接続します。
- SQL Workbench/J の Github repo から CREATE TABLE ステートメントを実行して、SSB データセットからテーブルを作成します。次の図は、テーブルのリストを示しています。
- Github repo から COPY ステートメントを実行します。このステップは、
s3://awssampledbuswest2/ssbgz/
で利用できるサンプルデータを使用して作成したテーブルにデータをロードします。前述の IAM ロール ARN を置き換えることを忘れないでください。 - 各テーブルが正しくロードされたことを確認するには、次のコマンドを実行します。
次の結果テーブルは、SSB データセットの各テーブルの行数を示しています。
レコード数に加えて、各テーブルからいくつかのサンプルレコードを確認することもできます。
Amazon Redshift を使用して ELT と ETL を実行し、S3 にアンロードする
このチュートリアルの大まかな手順は次のとおりです。
- Amazon Redshift ローカルストレージに読み込んだ POS (Point of Sales) データについて、エンドユーザーからよく聞かれる評価を事前に集計することを検討しています。
- 次に、集約されたデータを Amazon Redshift からデータレイク (S3) に、オープンで分析的に最適化および圧縮された Parquet ファイル形式でアンロードします。また、エンドユーザーのクエリパフォーマンスを向上させ、最終的にコストを削減するために、データレイクのアンロードされたデータに対して最適化されたパーティション分割を検討します。
- Redshift Spectrum を使用して、データレイクからアンロードされたデータをクエリします。また、従量制およびサーバーレスのアドホックおよびオンデマンドクエリモデルを備えた Athena、アンロードされたデータで ETL 操作を実行し、データレイクに保存されている他のデータセット (ERP、財務、サードパーティデータなど) とのデータ統合を行うための AWS Glue と Amazon EMR、および機械学習を行うための Amazon SageMaker など、他の AWS のサービスとデータを共有することを考えます。
次の手順を実行します。
- 必要な事前集計を計算するには、SQL Workbench/J の Github repo で利用できる次の 3 つの ELT クエリを実行します。
- ELT クエリ 1 – このクエリは、メーカー、カテゴリ、およびブランドごとの収益を、サプライヤーリージョンごとに月と年単位で要約します。
- ELT クエリ 2 – このクエリは、ブランドごとの収益を、サプライヤーリージョンと都市ごとに月と年単位で要約します。
- ELT クエリ 3 – このクエリは、顧客の都市、サプライヤーの都市、月、年ごとに時間をドリルダウンします。
- 集約されたデータを Parquet ファイル形式と適切なパーティションで S3 にアンロードして、データレイク内のアンロードされたデータのアクセスパターンを支援するには、SQL Workbench/J から Github repo で利用できる 3 つの UNLOAD クエリを実行します。アンロードされたデータのクエリに Redshift Spectrum を使用するには、次のものが必要です。
- クラスターに接続して SQL コマンドを実行できる Amazon Redshift クラスターと SQL クライアント (SQL Workbench/J または選択した別のツール)。S3 のクラスターとデータファイルは同じリージョンに存在する必要があります。
- 外部データカタログ内のデータベースを参照し、クラスターがユーザーに代わって S3 にアクセスすることを許可する IAM ロール ARN を提供する Amazon Redshift の外部スキーマ。 AWS Glue に外部データカタログを作成することをお勧めします。これで、AWS Glue クローラを作成する準備が整いました。
- AWS CLI から、次のコードを実行します (<Your AWS Account> を置き換えてください):
aws glue create-crawler --cli-input-json file://mycrawler.json --region us-west-2
また、ユースケースに基づいてクローラを定期的に実行するようにスケジュールすることもできます。たとえば、35 分ごとにクローラをスケジュールして、30 分ごとにデータがアンロードされる AWS Glue カタログテーブルを最新の状態に保つことができます。ただし、この記事ではスケジューリングを設定していません。
- AWS Glue クローラを作成したら、次のコマンドを使用して AWS CLI から手動で実行します。
aws glue start-crawler --name "eltblogpost_redshift_spectrum_etl_elt_glue_crawler" --region us-west-2
- AWS Glue クローラの実行が完了したら、AWS Glue コンソールに移動して、データベース
eltblogpost
の下にある次の 3 つの AWS Glue カタログテーブルを確認します。monthly_revenue_by_region_manufacturer_category_brand
monthly_revenue_by_region_city_brand
yearly_revenue_by_city
- etlblogpost という名前の外部データカタログが AWS Glue にあるので、SQL Workbench/J の次の SQL を使用して eltblogpost という名前の永続クラスターに外部スキーマを作成します (<Your AWS Account>を置き換えてください):
Spectrum を使用して、以前に設定した 3 つの AWS Glue カタログテーブルをクエリできるようになりました。
- SQL Workbench/J に移動し、次のサンプルクエリを実行します。
- 1992 年 3 月にリージョン
AFRICA
の収益に貢献しているカテゴリおよびメーカー別のトップ 10 ブランド: - 1995 年のブランド全体の
AMERICA
リージョンの月間収益: - 1992〜1995 年 12 月のサプライヤー都市
ETHIOPIA
4 の年間収益:
- 1992 年 3 月にリージョン
データが S3 にあり、AWS Glue カタログにカタログされている場合、Athena、AWS Glue、Amazon EMR、Amazon SageMaker、Amazon QuickSight、および S3 とシームレスに統合する他の AWS のサービスを使用して同じカタログテーブルをクエリできます。
Redshift Spectrum を使用して ELT と ETL を加速し、S3 にアンロードする
使い慣れた SQL を使用して、データレイク (S3) コールドストレージに格納された大規模なデータセットでエンドユーザーから一般的に要求される一連のメトリクスを事前に集計し、ダウンストリームの消費のためにデータレイクで集計されたメトリクスをアンロードする必要があると仮定します。
このチュートリアルの大まかな手順は次のとおりです。
- これは、かなり大量のリレーショナルデータと構造化データで標準 SQL の結合と集計を必要とするバッチワークロードです。Redshift Spectrum の機能を使用して、S3 に保存されているデータに対して必要な SQL 変換を実行し、変換された結果を S3 にアンロードします。
- 既存のクラスターがある場合は Redshift Spectrum を使用してデータレイクからアンロードされたデータをクエリします。その際、従量制およびサーバーレスのアドホックおよびオンデマンドクエリモデルを備えた Athena、データレイクに保存されている他のデータセットとのアンロードされたデータおよびデータ統合で ETL 操作を実行するための AWS Glue と Amazon EMR、および機械学習を行うための Amazon SageMaker を使用します。
Redshift Spectrum では、Amazon Redshift ローカルストレージにロードする必要なく、データレイクから直接データをクエリできるため、短命のクラスターをスピンアップして、Redshift Spectrum を使用して大規模に ELT を実行し、作業が完了した時にクラスターを終了できます。AWS CloudFormation を使用して、短命のクラスターのスピンアップと終了を自動化できます。そうすれば、数分または数時間の使用に対してのみ料金を支払うことができます。また、短命のクラスターは、ライブユーザーからのインタラクティブなクエリを処理する現在の永続的なクラスターの過負荷を回避できます。この記事では、既存のクラスター rseltblogpost
を使用します。
この記事では、AWS が提供する tickit
という名前の公開サンプルサンプルデータセットを使用します。これは、S3 へのアクセス権を持つ認証済み AWS ユーザーは誰でもアクセスできます。
- Sales – s3://awssampledbuswest2/tickit/spectrum/sales/
- Event – s3://awssampledbuswest2/tickit/allevents_pipe.txt
- Date – s3://awssampledbuswest2/tickit/date2008_pipe.txt
- Users – s3://awssampledbuswest2/tickit/allusers_pipe.txt
パフォーマンス上の理由から、短命クラスターのローカルストレージにディメンションテーブルをロードし、ファクトテーブル Sales
に外部テーブルを使用することが Redshift Spectrum のベストプラクティスです。
次の手順を実行します。
- SQL Workbench/J からクラスターに接続します。データレイク (S3) からのデータのクエリに Redshift Spectrum を使用するには、次のものが必要です。
- クラスターに接続して SQL コマンドを実行できる Amazon Redshift クラスターと SQL クライアント (SQL Workbench/J または選択した別のツール)。S3 のクラスターとデータファイルは同じリージョンに存在する必要があります。
- 外部データカタログ内のデータベースを参照し、クラスターがユーザーに代わって S3 にアクセスすることを許可する IAM ロール ARN を提供する Amazon Redshift の外部スキーマ。AWS Glue に外部データカタログを作成することをお勧めします。
- すでに作成した
eltblogpost
という名前の AWS Glue カタログデータベース。 - すでに作成した
spectrum_eltblogpost
という名前の Redshift クラスター内の外部スキーマ。
- Github repo で利用可能な SQL を実行して、
spectrum_eltblogpost
という名前の同じ外部スキーマにsales
という名前の外部テーブルを作成します。前のセクションで示したように、AWS Glue クローラを使用して外部テーブルを作成することもできます。 - Github repo で利用できる SQL を実行して、ディメンションテーブルを作成し、Redshift Spectrum のパフォーマンスのベストプラクティスのためにデータを Amazon Redshift ローカルストレージにロードします。
- Github repo で利用できる COPY ステートメントを実行して、
s3://awssampledbuswest2/tickit/
で利用可能なサンプルデータを使用してディメンションテーブルをロードします。IAM ロール ARN を、クラスターに関連付けられている前述の IAM ロール ARN に置き換えます。 - 各テーブルに正しいレコード数があることを確認するには、次のコマンドを実行します。
次の結果テーブルは、
tickit
データセット内の各テーブルの行数を示しています。レコード数に加えて、各テーブルからいくつかのサンプルレコードを確認することもできます。
- 必要な事前集計を計算するには、SQL Workbench/J の Github repo で利用できる次の 3 つの ELT クエリを実行します。
- ELT クエリ 1 – 特定の暦日に販売された合計数量。
- ELT クエリ 2 – 各購入者に販売された合計数量。
- ELT クエリ 3 – 過去の総売上の 99.9 パーセンタイルのイベント。
- 集約されたデータを Parquet ファイル形式と適切なパーティションで S3 にアンロードして、データレイク内のアンロードされたデータのアクセスパターンを支援するには、SQL Workbench/J から Github repo で利用できる 3 つの UNLOAD クエリを実行します。
- アンロードされたデータのクエリに Redshift Spectrum を使用するには、新しい AWS Glue クローラを作成するか、
eltblogpost_redshift_spectrum_etl_elt_glue_crawler
という名前の以前のクローラを変更します。AWS CLI の次のコードを使用して既存のクローラを更新します (<Your AWS Account>を置き換えます) :aws glue update-crawler --cli-input-json file://mycrawler.json --region us-west-2
- クローラを正常に作成したら、次のコマンドを使用して AWS CLI から手動で実行します。
aws glue start-crawler --name "eltblogpost_redshift_spectrum_etl_elt_glue_crawler" --region us-west-2
- クローラの実行が完了したら、AWS Glue コンソールに移動します。次の追加のカタログテーブルは、カタログデータベース
eltblogpost
にあります。- total_quantity_sold_by_date
- total_quantity_sold_by_buyer_by_date
- total_price_by_eventname
- Spectrum を使用して、前述の 3 つのカタログテーブルをクエリできるようになりました。SQL Workbench/J に移動し、次のサンプルクエリを実行します。
-
- 2008 年 2 月と 3 月の販売数量で見た上位 10 日間:
- 2008 年 2 月と 3 月の販売数量で見た上位 10 名の購入者:
- Top 10 event names for total price:
-
データが S3 にあり、AWS Glue カタログにカタログされたら、Amazon Athena、AWS Glue、Amazon EMR、Amazon SageMaker、Amazon QuickSight、および S3 とシームレスに統合する他の AWS のサービスを使用して同じカタログテーブルをクエリできます。
同時実行スケーリングを使用した ELT のスケーリングと並列実行のアンロード
同時実行スケーリングがオンになっているクラスターで UNLOAD クエリと ELT ジョブが並行して実行されているとき、並行性の下で混合ワークロードがあると仮定します。同時実行スケーリングが有効になっている場合、UNLOAD クエリを含む同時読み取りクエリの増加を処理する必要があると、Amazon Redshift は自動的にクラスター容量を追加します。デフォルトでは、クラスターの同時実行スケーリングモードはオフになっています。この記事では、クラスターの同時実行スケーリングモードを有効にします。
次の手順を実行します。
-
eltblogpost-parameter-group
という名前のクラスターパラメータグループに移動し、以下を完了します。-
max_concurrency_scaling_clusters
を5
に更新します。 - 次の手順で、同時実行スケーリングモードを
Auto
に設定したQueue 1
という名前の新しいキューと、unload_query
という名前のクエリグループを作成します。
-
- これらの変更を行った後、変更を有効にするためにクラスターを再起動します。
- この記事では、psql クライアントを使用して、以前にセットアップした EC2 インスタンスからクラスター
rseltblogpost
に接続します。 - EC2 インスタンスへの SSH セッションを開き、以下に示す 9 つのファイルを Github repo の並行フォルダーから EC2 インスタンスの
/home/ec2-user/eltblogpost/
にコピーします。 - 次の 8 つのジョブを並行して実行する
concurrency-elt-unload.sh
スクリプトを確認します。- SSB データセット用の ELT スクリプト。一度に 1 つのクエリを開始します。
-
tickit
データセット用の ELT スクリプト。一度に 1 つのクエリを開始します。 - SSB データセットに対する 3 つのアンロードクエリが並行して開始されました。
-
tickit
データセットに対する 3 つのアンロードクエリが並行して開始されました。
-
concurrency-elt-unload.sh
を実行します。スクリプトの実行中に、次のサンプル出力が表示されます。以下は、スクリプトがとる応答時間です。real 2m40.245s user 0m0.104s sys 0m0.000s
- 次のクエリを実行して、UNLOAD クエリの一部が同時実行スケーリングクラスタで実行されたことを検証します (以下のクエリ出力で「
which_cluster = Concurrency Scaling
」を探します)。SELECT query, Substring(querytxt,1,90) query_text, starttime starttime_utc, (endtime-starttime)/(1000*1000) elapsed_time_secs, case when aborted= 0 then 'complete' else 'error' end status, case when concurrency_scaling_status = 1 then 'Concurrency Scaling' else 'Main' end which_cluster FROM stl_query WHERE database = 'rselttest' AND starttime between '2019-10-20 22:53:00' and '2019-10-20 22:56:00’ AND userid=100 AND querytxt NOT LIKE 'padb_fetch_sample%' AND (querytxt LIKE 'create%' or querytxt LIKE 'UNLOAD%') ORDER BY query DESC;
クエリからの次の出力を確認します。
- 6 つの UNLOAD クエリファイル (
ssb-unload<1-3>.sql
およびtickit-unload<1-3>.sql
) の次の SET ステートメントをコメントアウトして、メインクラスタで実行するように 6 つの UNLOAD クエリすべてを強制します。set query_group to 'unload_query';
つまり、UNLOAD クエリの同時実行スケーリングモードを無効にします。
-
concurrency-elt-unload.sh
スクリプトを実行します。スクリプトの実行中に、次のサンプル出力が表示されます。以下は、スクリプトがとる応答時間です。real 3m40.328s user 0m0.104s sys 0m0.000s
以下に、Redshift クラスターのワークロード管理設定を示します。
- 次のクエリを実行して、すべてのクエリがメインクラスターで実行されたことを検証します (以下のクエリ出力で「
which_cluster = Main
」を探します)。SELECT query, Substring(querytxt,1,90) query_text, starttime starttime_utc, (endtime-starttime)/(1000*1000) elapsed_time_secs, case when aborted= 0 then 'complete' else 'error' end status, case when concurrency_scaling_status = 1 then 'Concurrency Scaling' else 'Main' end which_cluster FROM stl_query WHERE database = 'rselttest' AND starttime between '2019-10-20 23:19:00' and '2019-10-20 23:24:00’ AND userid=100 AND querytxt NOT LIKE 'padb_fetch_sample%' AND (querytxt LIKE 'create%' or querytxt LIKE 'UNLOAD%') ORDER BY query DESC;
クエリからの次の出力を確認します。 同時実行スケーリングにより、エンドツーエンドのランタイムが 37.5% 向上しました (60 秒高速化)。
まとめ
この記事では、Amazon Redshift Spectrum、同時実行スケーリング、および最近利用できるようになったデータレイクエクスポートのサポート といった AWS Redshift のいくつかの重要な機能を使用して、Amazon Redshift の ETL および ELT デザインパターンの簡単な例によるステップバイステップのチュートリアルで、使用を開始する方法を説明しました。
いつものように、AWS では皆さんのフィードバックをお待ちしています。コメント欄よりご意見やご質問をお送りください。
著者について
Asim Kumar Sasmal は、AWS プロフェッショナルサービスのグローバルスペシャリティプラクティスの IoT 担当シニアデータアーキテクトです。彼は、AWS プラットフォームで専門的な技術コンサルティング、ベストプラクティスに関するガイダンス、実装サービスを提供することによって、世界中の AWS 顧客がデータ駆動型ソリューションを設計および構築するのを支援しています。彼は、顧客の要望から逆向きに取り組み、大きな思考を手助けし、AWS プラットフォームの力を活用して現実のビジネスの問題を深く掘り下げて解決することに情熱を注いでいます。
Maor Kleider は、Amazon Redshift のプリンシパルプロダクトマネージャーです。Amazon Redshift は、高速、シンプルかつコスト効率のよいデータウェアハウスです。お客様やパートナーの皆様と協働し、彼ら特有のビッグデータユースケースについて学び、その利用体験をよりよくすることに情熱を傾けています。余暇は、家族とともに旅行やレストラン開拓を楽しんでいます。