Amazon Web Services ブログ

Amazon Redshift を使用したレイクハウスアーキテクチャの ETL および ELT 設計パターン: パート 2



このマルチポストシリーズのパート 1、Amazon Redshift を使用したレイクハウスアーキテクチャの ETL および ELT 設計パターン: パート 1 では、Amazon Redshift Spectrum、同時実行スケーリング、および最近サポートされるようになったデータレイクエクスポートを使用して、データレイクアーキテクチャ用の ELT および ETL データ処理パイプラインを構築するための一般的なお客様のユースケースと設計のベストプラクティスについて説明しました。

この記事では、AWS サンプルデータセットを使用して、Amazon Redshift のいくつかの ETL および ELT デザインパターンのステップバイステップのチュートリアルで、使用を開始する方法を説明します。

前提条件

開始する前に、次の前提条件を満たしていることを確認してください。

  1. この記事では、US-West-2 (オレゴン) リージョンから公開されている 2 つの AWS サンプルデータセットを使用します。テスト実行には US-West-2 (オレゴン) リージョンを使用して、クロスリージョンのネットワークレイテンシーとデータ移転によるコストを削減します。
  2. 同じリージョンに AWS アカウントがあること。
  3. AWS アカウントに AdministratorAccess ポリシーが付与されていること (本番環境の場合、これをさらに制限する必要があります)。
  4. データレイクに、Amazon Redshift からアンロードしたデータを保存するための eltblogpost という名前の既存の Amazon S3 バケットがあること。バケット名は AWS アカウント全体で一意であるため、提供されているサンプルコードに適用できる eltblogpost を一意のバケット名に置き換えます。
  5. AWS CLI がインストールされ、AWS アカウントで使用できるように設定されていること。
  6. redshift-elt-test-s3-policy という名前の IAM ポリシーがあり、eltblogpost という名前の Amazon S3 バケットに対する次の読み取りおよび書き込み権限があること。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "s3:GetBucketLocation",
                    "s3:GetObject",
                    "s3:ListBucket",
                    "s3:ListBucketMultipartUploads",
                    "s3:ListMultipartUploadParts",
                    "s3:AbortMultipartUpload",
                    "s3:PutObject",
                    "s3:DeleteObject"
                ],
                "Resource": [
                    "arn:aws:s3:::eltblogpost",
                    "arn:aws:s3:::eltblogpost/*"
                ],
                "Effect": "Allow"
            }
        ]
    }
  7. redshift-elt-test-sampledata-s3-read-policy という名前の IAM ポリシーがあり、awssampledbuswest2 という名前の Amazon S3 バケットの読み取り専用アクセス許可があり、このチュートリアルに使用するサンプルデータをホストしていること。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:Get*",
                    "s3:List*"
                ],
                "Resource": [
                    "arn:aws:s3:::awssampledbuswest2",
                    "arn:aws:s3:::awssampledbuswest2/*"
                ]
            }
        ]
    }
  8. redshift.amazonaws.comglue.amazonaws.com と信頼関係がある redshift-elt-test-role という名前の IAM ロール、および次の IAM ポリシーがあること (本番環境の場合、必要に応じてこれをさらに制限する必要があります)。

    • redshift-elt-test-s3-policy
    • redshift-elt-test-sampledata-s3-read-policy
    • AWSGlueServiceRole
    • AWSGlueConsoleFullAccess
  9. redshift-elt-test-role IAM ロールの ARN を書き留めます。
  10. 次のパラメータを持つ既存の Amazon Redshift クラスターがあること。
    • rseltblogpost のクラスター名。
    • rselttest のデータベース名。
    • 4 つの dc2.large ノード。
    • redshift-elt-test-role という名前の関連付けられた IAM ロール。
    • 公開されているエンドポイント。
    • eltblogpost-parameter-group という名前のクラスターパラメータグループ。これは、同時実行スケーリングを変更するために使用します
    • クラスターワークロード管理が手動に設定されていること。
  11. SQL Workbench / J (または選択した別のツール) があり、クラスターに正常に接続できること。
  12. PostgreSQL クライアント CLI (psql) を使用して同じリージョンに EC2 インスタンスがあり、クラスターに正常に接続できること。
  13. Amazon Athena および Redshift Spectrum クエリのメタデータカタログとして eltblogpost という名前の AWS Glue カタログデータベースがあること。

Amazon Redshift ローカルストレージへのデータのロード

この記事では、スタースキーマベンチマーク (SSB) データセットを使用します。これは、S3 バケット で公開されていて、Amazon S3 にアクセスできる認証済みの AWS ユーザーであれば誰でもアクセスできます。

Amazon Redshift ローカルストレージにデータをロードするには、次の手順を実行します。

  1. SQL Workbench/J からクラスターに接続します。
  2. SQL Workbench/J の Github repo から CREATE TABLE ステートメントを実行して、SSB データセットからテーブルを作成します。次の図は、テーブルのリストを示しています。
  3. Github repo から COPY ステートメントを実行します。このステップは、s3://awssampledbuswest2/ssbgz/ で利用できるサンプルデータを使用して作成したテーブルにデータをロードします。前述の IAM ロール ARN を置き換えることを忘れないでください。
  4. 各テーブルが正しくロードされたことを確認するには、次のコマンドを実行します。
    select count(*) from LINEORDER; 
    select count(*) from PART;
    select count(*) from CUSTOMER;
    select count(*) from SUPPLIER;
    select count(*) from DWDATE;

    次の結果テーブルは、SSB データセットの各テーブルの行数を示しています。

     テーブル名    レコード数
    LINEORDER     600,037,902
    PART            1,400,000
    CUSTOMER        3,000,000
    SUPPLIER        1,000,000
    DWDATE              2,556

レコード数に加えて、各テーブルからいくつかのサンプルレコードを確認することもできます。

Amazon Redshift を使用して ELT と ETL を実行し、S3 にアンロードする

このチュートリアルの大まかな手順は次のとおりです。

  1. Amazon Redshift ローカルストレージに読み込んだ POS (Point of Sales) データについて、エンドユーザーからよく聞かれる評価を事前に集計することを検討しています。
  2. 次に、集約されたデータを Amazon Redshift からデータレイク (S3) に、オープンで分析的に最適化および圧縮された Parquet ファイル形式でアンロードします。また、エンドユーザーのクエリパフォーマンスを向上させ、最終的にコストを削減するために、データレイクのアンロードされたデータに対して最適化されたパーティション分割を検討します。
  3. Redshift Spectrum を使用して、データレイクからアンロードされたデータをクエリします。また、従量制およびサーバーレスのアドホックおよびオンデマンドクエリモデルを備えた Athena、アンロードされたデータで ETL 操作を実行し、データレイクに保存されている他のデータセット (ERP、財務、サードパーティデータなど) とのデータ統合を行うための AWS Glue と Amazon EMR、および機械学習を行うための Amazon SageMaker など、他の AWS のサービスとデータを共有することを考えます。

次の手順を実行します。

  1. 必要な事前集計を計算するには、SQL Workbench/J の Github repo で利用できる次の 3 つの ELT クエリを実行します。
    • ELT クエリ 1 – このクエリは、メーカー、カテゴリ、およびブランドごとの収益を、サプライヤーリージョンごとに月と年単位で要約します。
    • ELT クエリ 2 – このクエリは、ブランドごとの収益を、サプライヤーリージョンと都市ごとに月と年単位で要約します。
    • ELT クエリ 3 – このクエリは、顧客の都市、サプライヤーの都市、月、年ごとに時間をドリルダウンします。
  2. 集約されたデータを 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 クローラを作成する準備が整いました。
  3. AWS CLI から、次のコードを実行します (<Your AWS Account> を置き換えてください):
    aws glue create-crawler --cli-input-json file://mycrawler.json --region us-west-2
    Where the file mycrawler.json contains:
    {
        "Name": "eltblogpost_redshift_spectrum_etl_elt_glue_crawler",
        "Role": "arn:aws:iam::<Your AWS Account>:role/redshift-elt-test-role",
        "DatabaseName": "eltblogpost",
        "Description": "",
        "Targets": {
            "S3Targets": [
                {
                    "Path": "s3://eltblogpost/unload_parquet/monthly_revenue_by_region_manufacturer_category_brand"
                },
                {
                    "Path": "s3://eltblogpost/unload_parquet/monthly_revenue_by_region_city_brand"
                },
                {
                    "Path": "s3://eltblogpost/unload_parquet/yearly_revenue_by_city"
                }
            ]
        }
    }

    また、ユースケースに基づいてクローラを定期的に実行するようにスケジュールすることもできます。たとえば、35 分ごとにクローラをスケジュールして、30 分ごとにデータがアンロードされる AWS Glue カタログテーブルを最新の状態に保つことができます。ただし、この記事ではスケジューリングを設定していません。

  4. AWS Glue クローラを作成したら、次のコマンドを使用して AWS CLI から手動で実行します。
    aws glue start-crawler --name "eltblogpost_redshift_spectrum_etl_elt_glue_crawler" --region us-west-2
  5. 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
  6. etlblogpost という名前の外部データカタログが AWS Glue にあるので、SQL Workbench/J の次の SQL を使用して eltblogpost という名前の永続クラスターに外部スキーマを作成します (<Your AWS Account>を置き換えてください):
    create external schema spectrum_eltblogpost 
    from data catalog 
    database 'eltblogpost' 
    iam_role 'arn:aws:iam::<Your AWS Account>:role/redshift-elt-test-role'
    create external database if not exists;

    Spectrum を使用して、以前に設定した 3 つの AWS Glue カタログテーブルをクエリできるようになりました。

  7. SQL Workbench/J に移動し、次のサンプルクエリを実行します。
    • 1992 年 3 月にリージョンAFRICA の収益に貢献しているカテゴリおよびメーカー別のトップ 10 ブランド:
      SELECT brand, category, manufacturer, revenue 
      from "spectrum_eltblogpost"."monthly_revenue_by_region_manufacturer_category_brand"
      where year = '1992'
      and month = 'March' 
      and supplier_region = 'AFRICA'
      order by revenue desc
      limit 10;
      
      brand | category | manufacturer | revenue
      ----------+----------+--------------+-----------
      MFGR#1313 | MFGR#13 | MFGR#1 | 5170356068
      MFGR#5325 | MFGR#53 | MFGR#5 | 5106463527
      MFGR#3428 | MFGR#34 | MFGR#3 | 5055551376
      MFGR#2425 | MFGR#24 | MFGR#2 | 5046250790
      MFGR#4126 | MFGR#41 | MFGR#4 | 5037843130
      MFGR#219 | MFGR#21 | MFGR#2 | 5018018040
      MFGR#159 | MFGR#15 | MFGR#1 | 5009626205
      MFGR#5112 | MFGR#51 | MFGR#5 | 4994133558
      MFGR#5534 | MFGR#55 | MFGR#5 | 4984369900
      MFGR#5332 | MFGR#53 | MFGR#5 | 4980619214
    • 1995 年のブランド全体の AMERICA リージョンの月間収益:
      SELECT month, sum(revenue) revenue
      FROM "spectrum_eltblogpost"."monthly_revenue_by_region_city_brand"
      where year = '1992'
      and supplier_region = 'AMERICA'
      group by month;
      
      month | revenue
      ----------+--------------
      April | 4347703599195
      January | 4482598782080
      September | 4332911671240
      December | 4489411782480
      May | 4479764212732
      August | 4485519151803
      October | 4493509053843
      June | 4339267242387
      March | 4477659286311
      February | 4197523905580
      November | 4337368695526
      July | 4492092583189
    • 1992〜1995 年 12 月のサプライヤー都市 ETHIOPIA 4 の年間収益:
      SELECT year, supplier_city, sum(revenue) revenue
      FROM "spectrum_eltblogpost"."yearly_revenue_by_city"
      where supplier_city in ('ETHIOPIA 4')
      and year between '1992' and '1995'
      and month = 'December'
      group by year, supplier_city
      order by year, supplier_city;
      
      year | supplier_city | revenue
      -----+---------------+------------
      1992 | ETHIOPIA 4 | 91006583025
      1993 | ETHIOPIA 4 | 90617597590
      1994 | ETHIOPIA 4 | 92015649529
      1995 | ETHIOPIA 4 | 89732644163

データが S3 にあり、AWS Glue カタログにカタログされている場合、Athena、AWS Glue、Amazon EMR、Amazon SageMaker、Amazon QuickSight、および S3 とシームレスに統合する他の AWS のサービスを使用して同じカタログテーブルをクエリできます。

Redshift Spectrum を使用して ELT と ETL を加速し、S3 にアンロードする

使い慣れた SQL を使用して、データレイク (S3) コールドストレージに格納された大規模なデータセットでエンドユーザーから一般的に要求される一連のメトリクスを事前に集計し、ダウンストリームの消費のためにデータレイクで集計されたメトリクスをアンロードする必要があると仮定します。

このチュートリアルの大まかな手順は次のとおりです。

  1. これは、かなり大量のリレーショナルデータと構造化データで標準 SQL の結合と集計を必要とするバッチワークロードです。Redshift Spectrum の機能を使用して、S3 に保存されているデータに対して必要な SQL 変換を実行し、変換された結果を S3 にアンロードします。
  2. 既存のクラスターがある場合は 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 のベストプラクティスです。

次の手順を実行します。

  1. 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 クラスター内の外部スキーマ。
  2. Github repo で利用可能な SQL を実行して、spectrum_eltblogpost という名前の同じ外部スキーマに sales という名前の外部テーブルを作成します。前のセクションで示したように、AWS Glue クローラを使用して外部テーブルを作成することもできます。
  3. Github repo で利用できる SQL を実行して、ディメンションテーブルを作成し、Redshift Spectrum のパフォーマンスのベストプラクティスのためにデータを Amazon Redshift ローカルストレージにロードします。
  4. Github repo で利用できる COPY ステートメントを実行して、s3://awssampledbuswest2/tickit/ で利用可能なサンプルデータを使用してディメンションテーブルをロードします。IAM ロール ARN を、クラスターに関連付けられている前述の IAM ロール ARN に置き換えます。
  5. 各テーブルに正しいレコード数があることを確認するには、次のコマンドを実行します。
    select count(*) from date;
    select count(*) from users;
    select count(*) from event;
    select count(*) from spectrum_eltblogpost.sales;

    次の結果テーブルは、tickit データセット内の各テーブルの行数を示しています。

    Table Name                    Record Count
    DATE                           365
    USERS                       49,990
    EVENT                        8,798
    spectrum_eltblogpost.sales 172,456

    レコード数に加えて、各テーブルからいくつかのサンプルレコードを確認することもできます。

  6. 必要な事前集計を計算するには、SQL Workbench/J の Github repo で利用できる次の 3 つの ELT クエリを実行します。
    • ELT クエリ 1 – 特定の暦日に販売された合計数量。
    • ELT クエリ 2 – 各購入者に販売された合計数量。
    • ELT クエリ 3 – 過去の総売上の 99.9 パーセンタイルのイベント。
  7. 集約されたデータを Parquet ファイル形式と適切なパーティションで S3 にアンロードして、データレイク内のアンロードされたデータのアクセスパターンを支援するには、SQL Workbench/J から Github repo で利用できる 3 つの UNLOAD クエリを実行します。
  8. アンロードされたデータのクエリに 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
    Where the file mycrawler.json contains:
    {
        "Name": "eltblogpost_redshift_spectrum_etl_elt_glue_crawler",
        "Role": "arn:aws:iam::<Your AWS Account>:role/redshift-elt-test-role",
        "DatabaseName": "eltblogpost",
        "Description": "",
        "Targets": {
            "S3Targets": [
                {
                    "Path": "s3://eltblogpost/unload_parquet/monthly_revenue_by_region_manufacturer_category_brand"
                },
                {
                    "Path": "s3://eltblogpost/unload_parquet/monthly_revenue_by_region_city_brand"
                },
                {
                    "Path": "s3://eltblogpost/unload_parquet/yearly_revenue_by_city"
                },
                {
                    "Path": "s3://eltblogpost/unload_parquet/total_quantity_sold_by_date"
                },
                {
                    "Path": "s3://eltblogpost/unload_parquet/total_quantity_sold_by_buyer_by_date"
                },
                {
                    "Path": "s3://eltblogpost/unload_parquet/total_price_by_eventname"
                }
            ]
        }
    }
  9. クローラを正常に作成したら、次のコマンドを使用して AWS CLI から手動で実行します。
    aws glue start-crawler --name "eltblogpost_redshift_spectrum_etl_elt_glue_crawler" --region us-west-2
  10. クローラの実行が完了したら、AWS Glue コンソールに移動します。次の追加のカタログテーブルは、カタログデータベース eltblogpost にあります。
    • total_quantity_sold_by_date
    • total_quantity_sold_by_buyer_by_date
    • total_price_by_eventname
  11. Spectrum を使用して、前述の 3 つのカタログテーブルをクエリできるようになりました。SQL Workbench/J に移動し、次のサンプルクエリを実行します。
      • 2008 年 2 月と 3 月の販売数量で見た上位 10 日間:
        SELECT caldate, total_quantity
        FROM "spectrum_eltblogpost"."total_quantity_sold_by_date"
        where caldate between '2008-02-01' and '2008-03-30'
        order by total_quantity desc
        limit 10;
        
        caldate | total_quantity
        -----------+---------------
        2008-02-20 | 1170
        2008-02-25 | 1146
        2008-02-19 | 1145
        2008-02-24 | 1141
        2008-03-26 | 1138
        2008-03-22 | 1136
        2008-03-17 | 1129
        2008-03-08 | 1129
        2008-02-16 | 1127
        2008-03-23 | 1121
      • 2008 年 2 月と 3 月の販売数量で見た上位 10 名の購入者:
        SELECT firstname,lastname,total_quantity
        FROM "spectrum_eltblogpost"."total_quantity_sold_by_buyer_by_date"
        where caldate between '2008-02-01' and '2008-03-31'
        order by total_quantity desc
        limit 10;
        
        firstname | lastname | total_quantity
        ----------+------------+---------------
        Laurel | Clay | 9
        Carolyn | Valentine | 8
        Amelia | Osborne | 8
        Kai | Gill | 8
        Gannon | Summers | 8
        Ignacia | Nichols | 8
        Ahmed | Mcclain | 8
        Amanda | Mccullough | 8
        Blair | Medina | 8
        Hadley | Bennett | 8
      • Top 10 event names for total price:
        SELECT eventname, total_price
        FROM "spectrum_eltblogpost"."total_price_by_eventname"
        order by total_price desc
        limit 10;
        
        eventname | total_price
        ---------------------+------------
        Adriana Lecouvreur | 51846.00
        Janet Jackson | 51049.00
        Phantom of the Opera | 50301.00
        The Little Mermaid | 49956.00
        Citizen Cope | 49823.00
        Sevendust | 48020.00
        Electra | 47883.00
        Mary Poppins | 46780.00
        Live | 46661.00

データが S3 にあり、AWS Glue カタログにカタログされたら、Amazon Athena、AWS Glue、Amazon EMR、Amazon SageMaker、Amazon QuickSight、および S3 とシームレスに統合する他の AWS のサービスを使用して同じカタログテーブルをクエリできます。

同時実行スケーリングを使用した ELT のスケーリングと並列実行のアンロード

同時実行スケーリングがオンになっているクラスターで UNLOAD クエリと ELT ジョブが並行して実行されているとき、並行性の下で混合ワークロードがあると仮定します。同時実行スケーリングが有効になっている場合、UNLOAD クエリを含む同時読み取りクエリの増加を処理する必要があると、Amazon Redshift は自動的にクラスター容量を追加します。デフォルトでは、クラスターの同時実行スケーリングモードはオフになっています。この記事では、クラスターの同時実行スケーリングモードを有効にします。

次の手順を実行します。

  1. eltblogpost-parameter-group という名前のクラスターパラメータグループに移動し、以下を完了します。

    • max_concurrency_scaling_clusters5 に更新します。
    • 次の手順で、同時実行スケーリングモードを Auto に設定した Queue 1 という名前の新しいキューと、unload_query という名前のクエリグループを作成します。
  2. これらの変更を行った後、変更を有効にするためにクラスターを再起動します。
  3. この記事では、psql クライアントを使用して、以前にセットアップした EC2 インスタンスからクラスター rseltblogpost に接続します。
  4. EC2 インスタンスへの SSH セッションを開き、以下に示す 9 つのファイルを Github repo の並行フォルダーから EC2 インスタンスの /home/ec2-user/eltblogpost/ にコピーします。
  5. 次の 8 つのジョブを並行して実行する concurrency-elt-unload.sh スクリプトを確認します。
    • SSB データセット用の ELT スクリプト。一度に 1 つのクエリを開始します。
    • tickit データセット用の ELT スクリプト。一度に 1 つのクエリを開始します。
    • SSB データセットに対する 3 つのアンロードクエリが並行して開始されました。
    • tickit データセットに対する 3 つのアンロードクエリが並行して開始されました。
  6. concurrency-elt-unload.sh を実行します。スクリプトの実行中に、次のサンプル出力が表示されます。以下は、スクリプトがとる応答時間です。

    real 2m40.245s
    user 0m0.104s
    sys 0m0.000s
  7. 次のクエリを実行して、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;

    クエリからの次の出力を確認します。

  8. 6 つの UNLOAD クエリファイル (ssb-unload<1-3>.sql および tickit-unload<1-3>.sql) の次の SET ステートメントをコメントアウトして、メインクラスタで実行するように 6 つの UNLOAD クエリすべてを強制します。
    set query_group to 'unload_query';

    つまり、UNLOAD クエリの同時実行スケーリングモードを無効にします。

  9. concurrency-elt-unload.sh スクリプトを実行します。スクリプトの実行中に、次のサンプル出力が表示されます。以下は、スクリプトがとる応答時間です。

    real 3m40.328s
    user 0m0.104s
    sys 0m0.000s

    以下に、Redshift クラスターのワークロード管理設定を示します。

  10. 次のクエリを実行して、すべてのクエリがメインクラスターで実行されたことを検証します (以下のクエリ出力で「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 は、高速、シンプルかつコスト効率のよいデータウェアハウスです。お客様やパートナーの皆様と協働し、彼ら特有のビッグデータユースケースについて学び、その利用体験をよりよくすることに情熱を傾けています。余暇は、家族とともに旅行やレストラン開拓を楽しんでいます。