はじめに
ストリーミングインジェストとは?
リアルタイムで生成されるデータを継続的に収集し、分析や処理のためにデータベースやデータウェアハウスに送信するプロセス。
これにより、データの取り込みと分析がほぼリアルタイムで行えるようになります。
今回は、Kinesis Data Streamsに送られてくるデータを、Redshiftのマテリアライズド・ビュー経由でニアリアルタイムにSQLで参照するところまでをやってみようと思います。
目次
手順の概要
- Kinesis DataStreamの作成
- RedshiftServerlessの作成
- RedshiftにKinesis Data Streams用ポリシーを付与
- Kinesis Data Stream → RedShift マテリアライズドビューの連携
- マテリアライズドビューのリフレッシュを定期実行
- リフレッシュの確認
手順
Kinesis DataStreamの作成
ストリームデータを送信する Kinesis Data Stream を作成します。
今回は検証なので、シャード数は 1つ で作成します。
Kinesis Data Streamのキャパシティ管理には、オンデマンドモードとプロビジョンドモードの2つが存在します。
オンデマンド
・アプリケーションの需要に応じて自動的にスケーリングが行われます。
・データの読み書きに必要な容量を自動的に調整し、必要なスループットを提供するために、シャードを自動的に管理します。
・予測不能で変動性の高いトラフィックパターンを持つワークロードに適しています。
プロビジョンド
・データストリームのシャードカウントを指定する必要があります。データストリームの総容量は、シャードの容量の合計となります
・必要に応じて、データストリームのシャードの数を増減することが可能です。
・予測しやすい容量要件を持つ予測可能なトラフィックに適しています。
詳細については、「データストリーム容量モードの選択」を参照してください。
RedshiftServerlessの作成
Amazon Redshiftのコンソールから「Try Redshift Serverless free trial」をクリックして作成の
開始です。
(Redshift Serverlessを初めての利用の場合、アカウントで使用できる300ドルのクレジットがもらえるようです)
ワークグループを設定します。
ワークグループの名前を入力し、RPU容量は一番小さい 8 に設定しました
ネットワークとセキュリティを設定
ここでは、VPC、セキュリティグループ、サブネット(3つ以上選択)を設定します。
- 名前空間とワークグループという概念がある
・名前空間は、データベースとオブジェクトとユーザのコレクション
・ワークグループは、コンピューティングリソースの集合
「設定を保存」をクリックすると、Redshift Serverlessのセットアップが開始されます。
私が作成した時は、約3分位でセットアップが完了しました。
セットアップ完了!
Redshift Serverlessが作成されました。
RedshiftにKinesis Data Streams用ポリシーを付与
RedshiftがKinesis Data Streamsにアクセスできるよう、Redshiftクラスターに、ポリシーを付与したIAMロールを適用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadStream", "Effect": "Allow", "Action": [ "kinesis:DescribeStreamSummary", "kinesis:GetShardIterator", "kinesis:GetRecords", "kinesis:DescribeStream" ], "Resource": "arn:aws:kinesis:ap-northeast-1:123456789012:stream/*" }, { "Sid": "ListStream", "Effect": "Allow", "Action": [ "kinesis:ListStreams", "kinesis:ListShards" ], "Resource": "*" } ] } |
Kinesis Data Stream → RedShift マテリアライズドビューの連携
Kinesis用外部スキーマの作成
IAM_ROLE
には、作成した IAM ロールの ARN を設定します。
1 2 3 |
CREATE EXTERNAL SCHEMA schema_one FROM KINESIS IAM_ROLE 'arn:aws:iam::123456789012:role/redshift-streaming-role' |
マテリアライズドビューを作成
Kinesis Data Streamの名前に - を入れている場合、"で囲む必要があります。
1 2 3 4 5 6 7 8 9 10 |
CREATE MATERIALIZED VIEW "mview_test-kinesis-datastream-shard-1" AS SELECT approximate_arrival_timestamp, partition_key, shard_id, sequence_number, JSON_PARSE(from_varbyte(kinesis_data, 'utf-8')) as Data, refresh_time FROM schema_one."test-kinesis-datastream-shard-1" |
マテリアライズドビューとは?
通常のビューは、クエリを実行した時にデータを取得してきますが、マテリアライズドビューは、クエリ結果をあらかじめ計算し、その結果を保存しておくことが出来るビューになります。
マテリアライズドビューを利用することで、大量のデータを効率的に処理し、リアルタイムに結果を取得することが可能になります。
これにより、大規模なデータ分析やニアリアルのデータ処理が必要なアプリケーションの開発が容易になります。
マテリアライズド・ビューの更新
マテリアライズドビューは事前にクエリ結果を作成しておくので、定期的にリフレッシュが必要になります。
リフレッシュすることで、マテリアライズドビューも最新の状態になります。
1 |
REFRESH MATERIALIZED VIEW "mview_test-kinesis-datastream-shard-1" |
マテリアライズド・ビューの参照
SELECT文で参照が出来ます。
1 2 |
select * from "mview_test-kinesis-datastream-shard-1" |
Kinesis Data Streamsのデータが参照出来ました。
今回の検証で使用したもの
Kinesis Data Streamsにデータの投入は、KPLを使ってJSONを投げるチュートリアルを参考にしてデータ投入しました。
マテリアライズドビューのリフレッシュを定期実行
定期的にリフレッシュをしたい。ので、EventBridgeでマテリアライズドビューのリフレッシュクエリーを実行するようにしてみました。
1 2 3 4 5 6 7 8 |
{ "WorkgroupName": "test-redshiftserverless-wg", "Database": "dev", "Sql": "REFRESH MATERIALIZED VIEW mview_test_kinesis_datastream_shard_1;", "SecretArn": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:redshift_test_sm-testest" } sql:には、実行するクエリ マテリアライズドビューの更新のクエリを指定しました |
今回の検証では、5分間隔でマテリアライズドビューのリフレッシュが行う様にスケジュールしました。
リフレッシュの確認
5分間隔でマテリアライズドビューのリフレッシュクエリーが実行されました!
データもリフレッシュされました
苦労したところ
今回の検証で、DataStreamにKPLを使ってデータをPUT、DataStreamのデータビューワーで投入したレコードの確認をしていましたが、翌日確認するとレコードが表示されません...データ保持期間は1日なのに...
事象としてはこんな感じのことがおきました。
- DataStream作成の当日内 :PUTしたレコードは表示される。
- DataStream作成の翌日以降:「このリクエストのレコードは見つかりませんでした」が表示され、レコードが表示されない。
- 当日、翌日共にモニタリングの「PutRecord の成功」で、データのPUT成功は確認出来る。
- 作成したデータストリームのデータ保持期間は1日
- KPLからデータ投入成功、投入したデータをRedShiftからデータ取得は成功
- KinesisDataStream上に投入データが残っていることは確認済み
色々調べたり、詳しい方に相談したり、AWSのサポートに聞いたりして、投入データを確認することが出来ました。皆さんに感謝です!
どうやら、データストリーム上に、データの位置的な情報があって、データビューワでは、そのデータ位置を条件にデータ取得するようです。
最新の場合
- データ投入するとデータ最新位置が更新される
- データビューワでは、その最新位置以降のデータが表示される
- データを見る場合、投入前にデータビューワーに最新位置を覚えさせておく
- レコード投入で最新位置が更新される
- 次のレコードで覚えていたレコードの最新位置以降のデータを表示する
タイムスタンプの場合
- データ投入時刻の近くの時刻を条件に指定する
- データ取得範囲が広すぎると一回のデータ取得で拾えずに表示されない
まとめ
今回は、Amazon RedshiftでAmazon Kinesis Data Streamのストリームデータをマテリアライズド・ビュー経由でニアリアルタイムにインジェストする検証をしてみました。
この機能を使うと、マテリアライズド・ビューの更新レイテンシーが発生するものの、ニアリアルタイムにKinesis Data Streamsのデータをインジェストできることが確認出来ました。
リアルタイムに分析し、分析結果をダッシュボードを通じてデータを可視化等、既にいろんなところで活用されているんだろうなと感じました。
RedshiftもKinesis Data Streamも初めてだったので、触りながらいろいろな発見があり、ちょびっと成長したかな!
投稿者プロフィール
-
2023/1にスカイアーチネットワークスにJoin
AWSを日々勉強中
最新の投稿
- AWS2024年8月20日LocalStackをつかってローカル環境でAWSサービスにアクセスしてみた
- AWS2024年4月4日AWS NeptuneにLambdaからアクセスしてみた
- セキュリティ2024年3月4日Amazon GuardDutyについてまとめてみました
- AWS2023年12月4日Amazon Redshift Streaming Ingestion をやってみた