Amazon Web Services ブログ

Amazon Redshift の新機能 – データレイクエクスポートとフェデレーテッドクエリー

データウェアハウスは、トランザクション系システムや業務アプリケーションから届いたリレーショナルデータの分析に最適化されたデータベースです。Amazon Redshiftは高速でフルマネージドのデータウェアハウスであり、標準SQLや既存のビジネスインテリジェンス(BI)ツールを用いたデータ分析をシンプルかつ効率的に行うことを可能にします。

データウェアハウス内に格納されていないであろう非構造化データから情報を習得するためには、データレイクを構築するという手段があります。データレイクは、全ての構造化データと非構造化データをあらゆるスケールで格納可能な、一元化されたレポジトリです。Amazon Simple Storage Service (S3)上に構築されたデータレイクによって、ビッグデータ分析を行い、機械学習を用いて準構造化データセット(JSON、XMLなど)や非構造化データから知見を得ることが簡単に行えるようになります。

本日、データウェアハウスの運用管理を改善しデータレイクとの統合を容易にする二つの新機能を発表しました。

  • データレイクエクスポート。データをApache ParquetフォーマットでS3にアンロードします。Apache Parquetは、分析のための効率的かつオープンなカラムナー型ファイルフォーマットです。
  • フェデレーテッドクエリー。Redshiftクラスターから、クラスター内、S3データレイク、Amazon Relational Database Service (RDS) for PostgreSQLおよびAmazon Aurora PostgreSQLデータベースに保管されたデータを跨いでクエリーを実行できます。

以下のアーキテクチャーダイアグラムは、これらの機能がどのように働くか、および他のAWSサービスとどのように組み合わせて利用できるかの概要を示しています。

図中の各コンポーネントの相互作用について、これらをどのように使用するか、どのような利点が得られるかを詳細に説明していきます。

Redshiftデータエクスポートの使用

Redshiftでのクエリー結果をApache Parquet形式でS3データレイクにアンロードすることができるようになりました。Parquet形式のデータは一般的なテキストフォーマットに比べて最大で2倍高速にアンロードすることができ、S3上の容量を最大で6倍節約することが可能です。これにより、Redshift内で実行したデータ変換やエンリッチ化の結果を、オープンなフォーマットでS3データレイクに保存することができるようになります。

その後、Redshiftの機能拡張であり、S3上のファイルを直接クエリーすることができるRedshift Spectrumを用いて分析を実行したり、Amazon AthenaAmazon EMRAmazon SageMakerといった他のサービスで活用することが可能になります。

この新機能を試してみましょう。Redshiftコンソールから新しいクラスターを立ち上げた後、こちらのチュートリアルに従って、複数の施設でのミュージカルイベントの売上を記録したデータをロードしてみます。次に、S3データレイクに保存した、これらのイベントに関するソーシャルメディアコメントと関連付けて分析します。それぞれのイベントは他のイベントに対する相対的な売上比較の方法を有しているものとします。

RedshiftからS3にデータをエクスポートするためのクエリーを作成してみましょう。私のデータは複数のテーブルに跨がって格納されています。単一のビューを作成して売上の状況を教えてくれるクエリーを作成する必要があります。salesdataテーブルの内容を結合し、あるイベントの総売上(以下のクエリーではtotal_price)と、全イベント・全期間の総売上に対するpercentileを追加します。

クエリーの結果をS3にParquet形式でエクスポートするために、以下のようなクエリーを作成しました。

UNLOAD ( `SELECT sales.*, date.*, total_price, percentile
  FROM sales, date,
    (SELECT eventid,total_price, ntile(1000) over (order by total_price desc) / 10.0 as percentile
      FROM (SELECT eventid, sum(pricepaid) total_price
        FROM sales
    GROUP BY eventid) as percentile_events
    WHERE sales.dateid = date.dateid
      AND percentile_events.eventid = sales.eventid')
TO 's3://MY-BUCKET/DataLake/Sales/'
FORMAT AS PARQUET
CREDENTIALS 'aws_iam_role=arn:aws:iam::123412341234:role/myRedshiftRole';

RedshiftにS3への書き込みアクセスを付与するために、AWS Identity and Access Management (IAM)ロールを使用します。UNLOADコマンドの結果は、AWS Command Line Interface (CLI)を使って確認することができます。想定通り、Parquetカラムナーデータ形式でエクスポートされていることがわかります。

$ aws s3 ls s3://MY-BUCKET/DataLake/Sales/
2019-11-25 14:26:56 1638550 0000_part_00.parquet
2019-11-25 14:26:56 1638550 0001_part_00.parquet
2019-11-25 14:26:56 1638550 0002_part_00.parquet
2019-11-25 14:26:56 1638550 0003_part_00.parquet

データへのアクセスを最適化するために、一つまたはそれ以上のパーティション列を指定し、アンロードされたデータがS3バケット内でパーティション化されるように指定できます。例えば、年月日でパーティションされた売上データをアンロードすることが可能です。これにより、クエリーはパーティションプルーニングの恩恵に与ることができるようになります。無関係なパーティションのスキャンをスキップすることで、性能の向上とコストの最小化が期待できます。

パーティションを使用するには、先程のSQLコマンドにPARTITIONED BYオプションを追加し、別ディレクトリにあるデータを分割するために使用する列を記述する必要があります。ここでは、結果をyearおよびカレンダー日(クエリー中ではcaldate)に基づいてパーティションしたいと思います。

UNLOAD ( `SELECT sales.*, date.*, total_price, percentile
  FROM sales, date,
    (SELECT eventid,total_price, ntile(1000) over (order by total_price desc) / 10.0 as percentile
      FROM (SELECT eventid, sum(pricepaid) total_price
        FROM sales
    GROUP BY eventid) as percentile_events
    WHERE sales.dateid = date.dateid
      AND percentile_events.eventid = sales.eventid')
TO 's3://MY-BUCKET/DataLake/SalesPartitioned/'
FORMAT AS PARQUET
PARTITION BY (year, caldate)
CREDENTIALS 'aws_iam_role=arn:aws:iam::123412341234:role/myRedshiftRole';

今回は、クエリー結果は複数のパーティションに保管されます。例えば、ある年月日に対応するデータのディレクトリ内容は以下のようになります。

$ aws s3 ls s3://MY-BUCKET/DataLake/SalesPartitioned/year=2018/caldate=2008-07-20/
2019-11-25 14:36:17 11940 0000_part_00.parquet
2019-11-25 14:36:17 11052 0001_part_00.parquet
2019-11-25 14:36:17 11138 0002_part_00.parquet
2019-11-25 14:36:18 12582 0003_part_00.parquet

オプションとして、AWS Glueを使ってCrawlerをセットアップし、S3バケット内のデータを(オンデマンドまたはスケジュール実行で)探し、Glueデータカタログに追加することもできます。データカタログが更新されれば、Redshift SpectrumやAthena、EMRを用いて容易にデータをクエリーすることができるようになります。

これで、売上データをS3データレイク内の非構造化データや準構造化データ(JSON、XML、Parquet)と関連付けて処理する準備ができました。例えばEMR上のApache SparkSageMakerのビルトインアルゴリズムに用いてデータにアクセスし、新たな知見を得ることが可能となります。

Redshiftフェデレーテッドクエリーの使用

Redshiftデータウェアハウスから、RDS PostgreSQLやAurora PostgreSQLに格納されているデータに直接アクセスすることも可能になりました。これにより、必要としているデータに迅速にアクセスできるようになります。Redshiftから、データウェアハウス内のデータのみならず、トランザクション系データベースやS3に格納されているデータを直接クエリーすることが可能となり、ETLジョブのセットアップやデータロードの完了を待つ必要がなくなります。

Redshiftはその最適化機構を活用して、ネットワーク上を流れるデータ量を最小化しつつ、計算処理のかなりの部分をトランザクション系データベースに直接プッシュダウンおよび分散します。

以下の構文を用いて、RDS PostgreSQLやAurora PostgreSQLのデータベースを外部スキーマとしてRedshiftクラスターに追加できます。

CREATE EXTERNAL SCHEMA IF NOT EXISTS online_system
FROM POSTGRES
DATABASE 'online_sales_db' SCHEMA 'online_system'
URI 'my-hostname' port 5432
IAM_ROLE 'iam-role-arn'
SECRET_ARN 'ssm-secret-arn';

スキーマとポートはオプションです。スキーマのデフォルトはpublicで、特に値を指定しなければこの名前になります。PostgreSQLデータベースのデフォルトポート番号は5432です。RedshiftはAWS Secrets Managerを使用して外部データベースに接続するための認証情報を管理します。

このコマンドにより、外部スキーマ内の全テーブルが利用可能となり、Redshiftから複雑なSQLを使用してクラスター内や、Redshift Spectrumを介してS3データレイク上のデータをクエリーできるようになります。

先程利用した売上データに戻りましょう。ここまでの操作で、ミュージカルイベントの履歴データのトレンドをリアルタイムの売上データと関連付けることができるようになっています。これにより、あるイベントが予想したとおりに売上を上げられるか否かを判断し、迅速なマーケティングイベントを打つといったことが可能となります。

例えば、オンラインコマースのデータベースをonline_systemスキーマを通じてRedshiftに取り込んだ後、過去の売上と現在の売上を、以下のようなシンプルなSQLで比較することができます。

SELECT eventid,
  sum(pricepaid) total_price,
  sum(online_pricepaid) online_total_price
FROM sales, online_system.current_sales
GROUP BY eventid
WHERE eventid = online_eventid

Redshiftは、データベースやスキーマの全体をインポートするわけではありません。クエリーが実行されると、Redshiftはクエリーの一部であるAuroraやRDSのテーブル(およびビュー)のメタデータをローカライズします。ローカライズされたメタデータはその後、クエリーのコンパイルや実行計画生成に使用されます。

今すぐ利用可能です
Amazon Redshiftデータレイクエクスポートはお客様のデータ処理パイプラインをよりよいものにするための新たなツールであり、Redshiftリリースバージョン1.0.10480以降で利用可能です。Redshiftが利用可能であるかどうかについては、リージョン表ページを参照して下さい。

Amazon Redshiftの新しいフェデレーションクエリー機能はパブリックベータとして提供され、Redshift、S3、RDSおよびAurora PostgreSQLに格納されたデータをひとまとめにして処理することを可能にします。クラスター作成時に、Current、Trailing、Previewの三つのメンテナンストラックのいずれかを選択することができます。Preview内のPREVIEW_FEATURESを選択することで、フェデレーテッドクエリーおよびマテリアライズドビューのパブリックベータに参加いただくことが可能です。

これらの機能は、より素早く変化に対応するための多くのツールとデータに対する一元的なビューを提供することで、データ処理と分析を容易にします。どのような目的にお使いになるか、是非フィードバックをお寄せ下さい!

Danilo

(翻訳はプロフェッショナルサービス仲谷が担当しました)