ストリーミングの取り込み (プレビュー) - Amazon Redshift

ストリーミングの取り込み (プレビュー)

以下は、Kinesis データストリームからのデータを利用するための、Amazon Redshift による ストリーミングの取り込み (パブリックプレビュー) に関するドキュメントです。プレビューの各機能は、構築の後に Redshift でテストされますが、テスト内容は、すべてのユースケースを完全に網羅していない場合があります。このドキュメントと機能は、一般公開版がリリースされるまでの間に変更される可能性があります。この機能はテストクラスターのみで使用し、本番向けには使用しないことをお勧めします。プレビューの契約条件については、AWSのサービス条件の「ベータサービスへの参加」を参照してください。

以前は、いくつかの手順により、Amazon Kinesis Streams などのストリーミングサービスから Amazon Redshift へのデータのロードを行っていました。例えば、ストリームを Amazon Kinesis Data Firehose に接続した上で、Kinesis Data Firehose がさまざまなサイズのバッファー間隔でサイズのバッチを変更しながら、Amazon S3 内でデータをステージングするのを待つ必要がありました。この後、Amazon S3 から Redshift のテーブルにデータをロードするための COPY コマンドが、Kinesis Data Firehose によりトリガーされていました。

Amazon S3 に事前ステージングを含めなくても、ストリーミングの取り込みにより、Kinesis Data Streams から Amazon Redshift マテリアライズドビューへの、低レイテンシーかつ高速なストリームデータの取り込みが提供されます。これにより速度が向上し、ストレージコストが削減されます。Amazon Redshift でのマテリアライズドビューの作成 で説明されているように SQL ステートメントを使用して Redshift クラスターを設定することで、ストリーミング取り込みを有効にし、マテリアライズドビューを作成できます。その後、マテリアライズドビューの更新を使用して、毎秒数百メガバイトのデータを、Amazon Kinesis Data Streams から Amazon Redshift に取り込むことができます。これにより、外部データにすばやくアクセスできるので、更新が高速化されます。

データフロー

Amazon Redshift はストリームコンシューマーです。Amazon Redshift マテリアライズドビューは、ストリームから読み込まれるデータのランディング領域であり、このデータは到着時に処理されます。例えば、使い慣れた SQL で JSON 値を利用して、その値を Redshift のデータ列にマッピングできます。マテリアライズドビューの更新時、Redshift のコンピューティングノードは、各データシャードをコンピューティングスライスに割り当てます。各スライスは、ビューの内容がストリームと同等になるまで、割り当てられたシャードのデータを処理します。同様に、後続のマテリアライズドビューでは、以前の更新における最後の SEQUENCE_NUMBER からの読み取りデータが、ストリームデータと同等になるまで更新されます。

ストリーミング取り込みのユースケース

Amazon Redshift でのストリーミング取り込みのユースケースは、継続的に生成 (ストリーミング) され、その生成から短期間 (低レイテンシー) の内に処理する必要があるデータの処理が中心となります。これは、ほぼリアルタイムの分析、と呼ばれます。このためのデータソースは、IOT デバイス、システムテレメトリー、またはビジー状態のウェブサイトからのクリックストリームデータなど、さまざまなものがあります。

ストリーミング取り込みの開始方法

Amazon Redshift ストリーミング取り込みを設定する際は、外部スキーマを作成しストリーミングのデータソースにマッピングした上で、その外部スキーマを参照するマテリアライズドビューを作成します。Amazon Redshift のストリーミング取り込みでは、データソースとして Kinesis Data Streams をサポートします。そのため、ストリーミング取り込みを設定する前に、Kinesis Data Streams ソースを使用可能な状態にしておく必要があります。ソースがない場合は、Kinesis ドキュメント「Amazon Kinesis Data Streams の開始方法」の手順に従います。または「AWS ネジメントコンソールを介してのストリームの作成」の手順に従って、コンソールからソースを作成します。

Amazon Redshift のストリーミング取り込みではマテリアライズドビューが使用されます。マテリアライズドビューは、REFRESH実行時にストリームにより直接更新されます。マテリアライズドビューは、ストリームのデータソースにマッピングされています。マテリアライズドビューの定義を行う際には、ストリームデータをフィルタリングしたり集計したりできます。ストリーミング取り込みのマテリアライズドビュー (基盤のマテリアライズドビュー) は 1 つのストリームのみを参照します。ただし、追加のマテリアライズドビューを作成して、それを基盤または別のマテリアライズドビュー、あるいはテーブルと結合させることができます。

Kinesis Data Streams のストリームが利用可能な場合の最初のステップは、CREATE EXTERNAL SCHEMAを使用して Amazon Redshift 内にスキーマを定義することです。その上で、Kinesis Data Streams リソースを参照します。その後、ストリーム内のデータにアクセスするために、マテリアライズドビュー内で STREAM を定義します。ストリームレコードは半構造的な SUPER 形式で保存できます。あるいは、Redshift データ型に変換されたデータを出力するスキーマを定義することができます。マテリアライズドビューをクエリすると、返されるレコードにはその時点のストリームが反映されます。

  1. Amazon Redshift クラスターがロールを引き受けることを許可する信頼ポリシーを持つ IAM ロールを作成します。IAM ロール向けに信頼ポリシーを設定する方法については、「ユーザーに代わって Amazon Redshift が他の AWS サービスにアクセスすることを許可する」を参照してください。作成されたロールには次の IAM ポリシーが設定されており、これにより、Amazon Kinesis のデータストリームとの通信に関するアクセス許可が提供されます。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "ReadStream", "Effect": "Allow", "Action": [ "kinesis:DescribeStreamSummary", "kinesis:GetShardIterator", "kinesis:GetRecords", "kinesis:DescribeStream" ], "Resource": "arn:aws:kinesis:*:0123456789:stream/*" }, { "Sid": "ListStream", "Effect": "Allow", "Action": [ "kinesis:ListStreams", "kinesis:ListShards" ], "Resource": "*" } ] }
  2. Amazon Redshift で、外部スキーマを作成します。

    CREATE EXTERNAL SCHEMA schema_one FROM KINESIS IAM_ROLE { default | 'iam-role-arn' };
  3. ストリームデータを利用するためのマテリアライズドビューを作成します。次の例では、JSON ソースデータを使用するマテリアライズドビューを定義しています。次に示すビューでは、データが有効な JSON ソースで UTF8 形式であることを検証しています。Kinesis のストリームの名前では大文字と小文字が区別され、その両方を使用することができます。大文字と小文字を区別する識別子を使用するには、セッションレベルまたはクラスターレベルのいずれかで、enable_case_sensitive_identifiertrue を設定します。詳細については、「名前と識別子」ならびに「enable_case_sensitive_identifier」を参照してください。

    CREATE MATERIALIZED VIEW my_view AS SELECT ApproximateArrivalTimestamp, JSON_PARSE(from_varbyte(Data, 'utf-8')) as Data FROM schema_one.my_stream_name WHERE is_utf8(Data) AND is_valid_json(from_varbyte(Data, 'utf-8'));
  4. ビューを更新します。これにより、Amazon Redshift によるストリームからの読み取りがトリガーされ、データがマテリアライズドビューにロードされます。

    REFRESH MATERIALIZED VIEW my_view;
  5. マテリアライズドビュー内でデータをクエリします。

    select * from my_view;

制約事項

  • この状態では更新は手動ですが、クエリスケジューラを使用して自動化することが可能です。「Amazon Redshift コンソールでのクエリのスケジューリング」を参照してください。

  • 現在、ストリームで作成されたマテリアライズドビューでは、JOIN の使用はサポートされていません。ストリームを使用してマテリアライズドビューを作成した後、別のマテリアライズドビューを作成して、ストリーミングのマテリアライズドビューと他のマテリアライズドビュー、テーブル、またはビューとの結合のために使用できます。

  • マテリアライズドビュー更新時の、ストリームからのデータの消費は、1 時間以内に完了する必要があります。更新処理が 1 時間を超過すると、認証情報の有効期限が切れるため、その更新は失敗します。

  • Redshift ストリームの取り込みでは、Kinesis プロデューサーライブラリ (KPL の重要なコンセプト) によって集計されたレコードの解析をサポートしていません. 集計されたレコードは取り込まれますが、バイナリプロトコルのバッファデータとして格納されます。(詳細については「Protocol buffers」(プロトコルバッファ) を参照してください。) Kinesis へのデータのプッシュ方法によっては、この機能の無効化が必要となる場合があります。例えば、Kinesis Data Analytics を使用している場合は、Kinesis シンクテーブルを作成する際に 'sink.producer.aggregation-enabled' = 'false' を追加することで、無効化ができます。詳細については、「Amazon Kinesis Data Streams SQL Connector」(Amazon Kinesis Data Streams の SQL コネクター) を参照してください。

  • マテリアライズドビューの作成後の最初の更新は、ストリームの TRIM_HORIZON から開始されます。

  • マテリアライズドビューは、増分的な保守が可能である必要があります。Kinesis のデフォルトでは、24 時間前のストリームの履歴は保持されないため、これによる再計算は完全ではありません。より長いデータ保持を Kinesis で設定することは可能ですが、これにより技術的なメンテナンス量が増え、コストが高くなる可能性があります。詳細については、「REFRESH MATERIALIZED VIEW」を参照してください。

  • クラスターが一時停止している場合、そのクラスターが再開されるまで、マテリアライズドビューを更新することはできません。ストリームからのレコードが一時停止期間中に期限切れになった場合、そのストリームは使用できなくなります。

  • サポートされるデータ形式は、VARBYTEからの変換が可能なデータ形式に限られます。詳細については、「VARBYTE 型」を参照してください。

  • 現在、VARBYTEに対しては解凍処理がサポートされていないため、圧縮データを含む Kinesis レコードを Amazon Redshift 内で クエリすることはできません。クエリするためには、ストリームにプッシュする前にデータを解凍する必要があります。