AWS認定Big Data勉強記 - 8.3: Kinesis Data Analytics

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

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


#### 参考資料

 - [Black Beltオンラインセミナー資料](https://d1.awsstatic.com/webinars/jp/pdf/services/20180110_AWS-BlackBelt-Kinesis.pdf)
 - 公式ドキュメント
    - Analytics
       - [開発者ガイド、英語のみ](https://aws.amazon.com/jp/kinesis/data-analytics/resources/)
         - [Best Practice](https://docs.aws.amazon.com/ja_jp/kinesisanalytics/latest/dev/best-practices.html)
       - [よくある質問](https://aws.amazon.com/jp/kinesis/data-analytics/faqs/)
 - YouTube
    - [re:Invent 2018](https://www.youtube.com/watch?v=jKPlGznbfZ0)

#### 全般

 - ストリーミングデータの分析、実用的なインサイトの取得、ビジネスやお客様のニーズへのリアルタイムでの対応を行えるサービス
 - 一般的な処理関数のための組み込みのテンプレートや演算子を利用し、SQL クエリと高度な Java アプリケーションを簡単に構築し、あらゆる規模のデータを整理、変換、集計、分析できる
 - ログ分析、クリックストリーム分析、IoT、アドテク、ゲームなどを用途とするエンドツーエンドストリーム処理アプリケーションを簡単に構築できて、一般的なユースケースには、ストリーミング ETL 、継続的メトリック生成、応答分析の3つがある
 - ストリーミングETL
    - データレイクやデータウェアハウスを読み込む前に、未加工データを洗浄、拡充、整理、変換でき、一括 ETL 手順を減らすか無くすことができる。
 - 継続的メトリック生成
    - データの経時的な傾向を監視し、理解できる。アプリケーションでストリーミングデータを集めて重要な情報を引き出したり、報告用データベースや監視サービスとつなぎ目なく統合し、アプリケーションやユーザーにリアルタイムでサービスを提供したりできる
 - リアルタイム応答分析
    - 特定のメトリクスが事前定義しきい値に到達したときや、より高度な例では、機械学習アルゴリズムを使用してアプリケーションによって異常が検出されたときに、リアルタイムのアラームまたは通知を送信する

#### 主要な要素

 - Kinesis Data Analytics アプリケーション
    - ユーザーが操作する Kinesis Data Analytics エンティティで、アプリケーションのコードは、SQL または Java を使用して、受信ストリーミングデータを処理し、出力を生成するように作成する。
    - 入力
        - 入力の設定では、ストリーミングソースをアプリケーション内データストリームにマッピングする
    - アプリケーションコード
        - 単純な形状では、アプリケーションコードは、ストリーミングソースに関連付けられているアプリケーション内データストリームから読み込み、出力に関連付けられているアプリケーション内データストリームに書き込む 1 つの Java 演算子か SQL ステートメント
    - 出力
        - 中間結果を格納する 1 つまたは複数のアプリケーション内ストリーム
 - アプリケーション内データストリーム
    - 処理の実行対象となるデータを絶えずアプリケーションに保存するエンティティ

#### 管理

###### アクセス管理
Kinesis Data Analytics では、ユーザーがアプリケーション内で指定したストリーミングデータソース内のレコードに対する読み取り権限が必要になる。また、ユーザーがアプリケーション出力設定に指定した宛先にアプリケーション出力を書き込む権限も必要になる。これらの権限を付与するには、Kinesis Data Analytics が引き受けることのできる IAM ロールを作成する。

###### スケーリング
アプリケーションが大半のシナリオにおける複雑なクエリとソースストリームのデータスループットに対応できるように、伸縮自在にスケールされる。Kinesis Data Analytics は、Amazon Kinesis 処理単位 (KPU) 数で表すことができ、1 つの KPU で 1 vCPU と 4GB メモリが与えられる。

Java アプリケーションの場合、Kinesis Data Analytics によって、KPU あたり 50GB の稼働アプリケーションストレージが割り当てられる。

API の Parallelism パラメータと ParallelismPerKPU パラメータを利用し、Java アプリケーションタスクに対する Kinesis Data Analytics の並列実行を制御することもできる。
Parallelism によってタスクの同時実行インスタンスの数が定義され、ParallelismPerKPU によって、アプリケーションの Kinesis Processing Unit (KPU) 単位でスケジュールできる並列タスクの数が定義される。

SQL アプリケーションの場合、各ストリーミングソースは対応するアプリケーション内ストリームにマッピングされる。入力並列処理パラメータを指定して、ソースがマッピングされるアプリケーション内ストリームの数を増やすことにより、KPU 数で表される能力をより効率的に使用することができる。

#### Kinesis Client Library との比較
KCL はビルド済みのライブラリであり、Amazon Kinesis Data Stream からデータを読み込んで処理するコンシューマアプリケーションの作成を支援する。KCL は、データストリームボリュームの変化への適応、ストリーミングデータの負荷分散、分散サービスの調整、データ処理の耐障害性などの複雑な問題に対応する。カスタム処理ソリューションを構築する必要がある場合は、KCL を使用する。

Kinesis Data Analytics を使用すると、標準的な SQL を使用するだけでデータストリームを処理できるため、新しいプログラミング言語を学習する必要はない。完全マネージド型のソリューションが必要であり、SQL を使ってデータストリーム内のデータを処理したい場合は、Kinesis Data Analytics を使用する。

#### その他

**Apache Flink**
Apache Flink はストリームと一括データ処理のためのオープンソースのフレームワーク/エンジン。用途の広い演算子を提供し、重複処理など、ストリーミングの中心的問題を効率的に解決するため、ストリーミングアプリケーションを簡単に構築できる。Apache Flink は、データストリーム全体の分散計算に対してデータ分配、通信、耐障害性を与える。 

**アプリケーションの統合**
次のようなアプリケーションと組み合わせることができる

 - ストリーミングデータの配信元: Amazon Kinesis Data Streams
 - 配信先またはシンク: Amazon Kinesis Data Streams、Amazon Kinesis Data Firehose、Amazon DynamoDB、Amazon S3
 - Apache Kafka、Apache Casssandra、Elasticsearch などのコネクタ

**カスタマイズ**
ファイル、ディレクトリ、ソケット、あるいはインターネット経由でアクセスできるあらゆるものとの読み書きを可能にする一連のプリミティブの上に構築することで、アプリケーションに配信元と配信先を追加できる。プリミティブには、データを継続的、1 回限り、非同期、同期などの方法で読み書きする機能などの設定が付属する。

**バックアップ**
チェックポイントとスナップショットを利用し、稼働アプリケーションの状態が自動的にバックアップされる。チェックポイントではアプリケーションの現在の状態が保存される。Java アプリケーション向け Kinesis Data Analytics では、アプリケーションの位置を回復できるため、障害なし実行と同じ意味になる。チェックポイントでは、稼働アプリケーションストレージが活用される。スナップショットによって、アプリケーションのポイントインタイムリカバリが保存され、スナップショットでは、永続的アプリケーションバックアップが活用される。

Kinesis Data Analytics はデフォルトで、スナップショットに保存されているデータを暗号化する。

**SQL アプリケーション**
ストリーミングデータソースとリファレンスデータソースという 2 種類の入力がサポートされている。ストリーミングデータソースは絶えず生成されるデータであり、アプリケーションに読み込まれて処理される。リファレンスデータソースは静的データであり、アプリケーションで使用してストリーミングソースから配信されるデータを拡充する。

ストリーミングデータソースには、Amazon Kinesis Data Stream または Amazon Kinesis Data Firehose 配信ストリームを指定でき、リファレンスデータソースには Amazon S3 オブジェクトを指定できる。

SQL アプリケーションでは、スキーマを検出し、UTF-8 でエンコードされた JSON レコードと CSV レコードを DiscoverInputSchema API を使用して自動解析できる。

SQL の結果は S3、Redshift、Elasticsearch Service (Amazon Kinesis Data Firehose 経由)、Amazon Kinesis Data Streams に保存できる。Kinesis Data Analytics で直接サポートされていない出力先に書き込むには、SQL 結果を Amazon Kinesis Data Streams に送信し、Amazon Kinesis Data Streams と AWS Lambda との統合を利用する。

**Random Cut Forest**
Kinesis Data Analytics では、Random Cut Forest アルゴリズムを使って異常検出を実行できる。詳細は[こちら](https://dev.classmethod.jp/business/bigdata/yoshim-sagemaker-rcf/)の記事を参考にする。