AWS認定Big Data勉強記 - 8.1: Kinesis Data Streams

こんにちは、えいりんぐーです

今回は Amazon Kinesis Data Streams についてまとめます。

#### 参考資料

 - [Black Beltオンラインセミナー資料](https://d1.awsstatic.com/webinars/jp/pdf/services/20180110_AWS-BlackBelt-Kinesis.pdf)
    - [Amazon Kinesis Family を活用したストリームデータ処理](https://www.slideshare.net/AmazonWebServicesJapan/amazon-kinesis-family-118299242)
 - 公式ドキュメント
    - Streams
       - [開発者ガイド](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/introduction.html)
       - [よくある質問](https://aws.amazon.com/jp/kinesis/data-streams/faqs/)
 - ブログ
    - [Amazon Kinesis Data Streams および AWS Lambda を使用して、Amazon RDS for PostgreSQL の変更をストリーミングする](https://aws.amazon.com/jp/blogs/news/stream-changes-from-amazon-rds-for-postgresql-using-amazon-kinesis-data-streams-and-aws-lambda/)
 - YouTube
    - [re:Invent 2018](https://www.youtube.com/watch?v=jKPlGznbfZ0)
    - [Streaming ETL for Data Lakes using Amazon Kinesis Firehose - 2017 AWS Online Tech Talks](https://www.youtube.com/watch?v=0AGNcZfYkzw)
    - [Real-Time Log Analytics using Amazon Kinesis and Amazon Elasticsearch Service](https://www.youtube.com/watch?v=NfkGpjrdy_Y)
 - その他
    - [[AWS]kinesisまとめ](https://qiita.com/yShig/items/500d4139efed91bc432d)
        - こちらの記事も良くまとまっています。

#### 全般

###### Kinesis Data Streams とは

 - 特定のニーズに合わせてストリーミングデータを処理、分析するカスタムアプリケーションを構築するためのサービス。
 - データプロデューサーからすばやくデータを移動して、連続的にデータを処理し、データストアに送る前にデータを変換したり、メトリクスや分析をリアルタイムで実行したり、他の処理のためにさらに複雑なデータストリームを取得したりできる。
 - データスループットのレベルでデータをストリーミングするために必要なインフラストラクチャ、ストレージ、ネットワーキング、設定を管理するため、ハードウェア、ソフトウェア、その他のサービスのプロビジョニング、デプロイ、継続的なメンテナンスを心配する必要がない。
 - 3 つのアベイラビリティーゾーンでデータが同期的にレプリケートされるため、可用性とデータ耐久性が高い。 

###### SQSとの違い

**Kinesis Data Streams**
Amazon Kinesis Data Streams では、ビッグデータのストリーミングをリアルタイムで処理できる。レコードを並べ替えることができ、複数の Amazon Kinesis アプリケーションに対して同じ順序でレコードを読み取ったり再生したりできる。Amazon Kinesis クライアントライブラリは特定のパーティションキーに対するすべてのレコードを同じレコードプロセッサに提供し、同じ Amazon Kinesis データストリームから読み取る複数のアプリケーションの構築を容易にする。

使用する状況

 - 関連する複数のレコードを同じ処理系に回す時
 - 複数のアプリケーションが同じストリームを同時に使用する時
 - レコードを数時間後に同じ順序で使用する時

**Amazon SQS**
Amazon SQS は、コンピュータ間でやり取りされるメッセージを格納するための、信頼性のある、拡張性の高い、ホスティングされたキューを提供する。Amazon SQS を使用すると、分散したアプリケーションコンポーネント間でデータを簡単に移動でき、自動化されたワークフローのようなメッセージレベルでの確認/失敗セマンティクスを備えたメッセージを独立して処理するアプリケーションを構築できる。

使用する状況

 - メッセージングセマンティクス (メッセージレベルの確認/失敗など) および可視性タイムアウト、例えば、作業項目のキューがあり、各項目の正常な完了を個別に追跡する時
 - ジョブキューがあり、遅延のある個別のジョブをスケジュールする必要がある時
 - 例えば、負荷の一時的な上昇や事業の自然な成長の結果として、バッファ要求や負荷が変化するような場合

#### 概念

 - シャード
    - スループットの単位で、データレコードが保存されるところ。
    - 1シャードは、1MB/秒のデータ入力と、2MB/秒のデータ出力をサポート。
    - また、各シャードは1秒あたり最大1,000件のPUTレコードをサポート。
    - 1 秒あたり最大 5 件の読み取りトランザクションをサポート。
        - 読み込みトランザクションは最大 10,000 レコードを提供でき、トランザクションあたり 10 MB の上限がある。
        - GetRecords では、1 つのシャードから最大 10 MB のデータを取得でき、呼び出しごとに最大 10,000 レコードを取得できる。
    - デフォルトでストリームに追加された時点から24時間アクセス可能。
        - 最大7日間まで上げることができる。
 - レコード
    - データストリームに保存されるデータの単位。
    - シーケンス番号、パーティションキー、データ BLOB で構成される。
    - データBLOBの最大サイズは1MB。
 - パーティションキー
    - レコードを分離してデータストリームの異なるシャードにルーティングするために使用する。
 - シーケンス番号
    - 各レコードの一意の識別子。
    - データを Amazon Kinesis データストリームに追加すると、Amazon Kinesis によってシーケンス番号が割り当てられる。
    - シャード間では増加しない。

#### データの書き込み

 - PutRecord, PutRecords, KPL, Kinesis Agentを使ってストリームにデータを追加する。
 - Kinesis Producer Library (KPL)
    - Kinesis データストリームにデータを格納するのに便利な、高度な設定が可能なライブラリ。非同期処理。
    - PutRecordなどは同期処理。
 - Kinesis Agent
    - データの収集および Amazon Kinesis データストリームへのデータの送信を容易にする、ビルド済みの Java アプリケーション。Linux ベースのサーバー環境にインストールして利用する。
 - ストリームの容量制限を超えている間、PUT データの呼び出しは `ProvisionedThroughputExceeded` 例外で拒否される。

#### 拡張ファンアウト (Enhanced fan-out)
コンシューマーとシャード間に論理的な 2 MB/秒スループットパイプを提供する Kinesis Data Streams コンシューマーのオプション機能。普通に複数のコンシューマーを設計すると、Kinesis Data Streams の性能制限を超えてしまう場合や、200ms以下のデータ提供速度を求める場合に利用する。

 - コンシューマーはまず、コンシューマー自体を Kinesis Data Streams サービスに登録する必要がある。
 - KCL を使用している場合、KCL version 2.x はコンシューマーの登録を自動で行う。
 - 登録されると、すべての登録されたコンシューマーはプロビジョニングされた独自の論理的な拡張ファンアウトスループットを持つようになる。
 - 次に、コンシューマーは HTTP/2 SubscribeToShard API を使用して、そのスループットパイプ内のデータを取得する。

#### データの読み取り

 - Kinesis アプリケーション
    - Kinesis Data Streams からのデータを読み取って処理するデータコンシューマー。
    - Kinesis Data Analytics, Kinesis API, KCLを使用する。
 - Kinesis Client Library (KCL)
    - データコンシューマー。
    - データストリームボリュームの変化への適応、ストリーミングデータの負荷分散、分散サービスの調整、データ処理の耐障害性などの複雑な問題に対応。
    - KCLは、各 Amazon Kinesis アプリケーションの Amazon DynamoDB テーブルを自動的に作成し、リシャーディングイベントやシーケンス番号チェックポイントなどの状態情報を追跡および管理する。
    - Kinesis アプリケーションをオートスケールグループの一部であるEC2インスタンス上で実行することで、アプリケーションの処理能力を自動的にスケールできる。
 - Kinesis Connector Library
    - KCLとは言わない。
    - Amazon Kinesis Data Streams を AWS の他のサービスやサードパーティ製ツールと簡単に統合できるようになる。
    - Amazon DynamoDB、Amazon Redshift、Amazon S3、Elasticsearch に対するコネクタを利用できる。
 - Kinesis Storm Spout
    - Amazon Kinesis Data Streams と Apache Storm を統合するライブラリ。
    - Kinesis Data Streamsからデータをフェッチし、そのデータをタプルとして送出する。
 - `ApproximateArrivalTimestamp`
    - レコードが Amazon Kinesis によって正常に受信および保存された時に設定される。
 - 容量制限を超えている間、READ データの呼び出しは `ProvisionedThroughputExceeded` 例外で拒否される

#### Data Streams の管理

 - リシャーディング
    - シャードの分割や結合を使用してデータストリームをスケールするために使用するプロセス。
    - シャードの分割では、1 つのシャードが 2 つのシャードに分割されて、データストリームのスループットが上がる。
    - シャードの結合では、2 つのシャードが 1 つのシャードに結合されて、データストリームのスループットが下がる。
    - 一度に実行できるリシャーディングオペレーションは 1 つだけ。

#### セキュリティ

 - アカウントとデータストリームの所有者のみが、自分が作成した Kinesis リソースにアクセスできる。
 - HTTPS プロトコルを使用して SSL エンドポイント経由で、Kinesis からのデータの格納と取得を安全に行うことができる。
 - AWS KMS マスターキーでサーバー側の暗号化を使用して、データストリームに保存されているデータを暗号化できる。
    - Kinesis Data Streams のサーバー側の暗号化は、ユーザーが指定した AWS KMS マスターキー (CMK) を使用して自動的にデータを暗号化してから、データストリームストレージレイヤーに書き出し、ストレージから取得した後でデータを復号化する。
 - 独自の暗号化ライブラリを使用して、データを Kinesis に格納する前にクライアント側のデータを暗号化できる。
 - VPC エンドポイントを作成すると、Amazon Virtual Private Cloud (VPC) から Kinesis Data Streams API にパブリックIPを使わずにプライベートでアクセスできる。