47
Amazon Kinesis Analytics による ストリーミングデータのリアルタイム分析 2016 年 10 月 4 日 アマゾンウェブサービスジャパン株式会社 ソリューションアーキテクト|内海英一郎

Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Embed Size (px)

Citation preview

Page 1: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

2016 年 10 月 4 日アマゾンウェブサービスジャパン株式会社ソリューションアーキテクト|内海英一郎

Page 2: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

スピーカー紹介

アマゾンウェブサービスジャパン株式会社

ソリューションアーキテクト

❤ Amazon Kinesis

❤ Java

❤ LMAX Disruptor

うちうみえいいちろう

内海英一郎|@eiichirouchiumi

Page 3: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

本セッションのアジェンダ

• Amazon Kinesis プラットフォーム概要

• Amazon Kinesis Analytics– 利用方法

– 分析例

– 注意事項

Page 4: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Amazon Kinesis プラットフォーム概要

Page 5: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

はるか遠い昔「データ分析」はヒストリカルレポートやダッシュボードそのものであった

– M. Gualtieri, Forrester @ AWS re:Invent 2014

Page 6: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

今日の「データ分析」は過去・現在を知り、近未来を予測するものへと変わっている

– M. Gualtieri, Forrester @ AWS re:Invent 2014

Page 7: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

多くのデータは持続的に生成されている

モバイルアプリケーション Web クリックストリーム アプリケーションログ

メータリングレコード IoT センサー スマートビルディング

Page 8: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

データの価値は時間の経過とともに減少する

Perishable Insights– M. Gualtieri, Forrester

新しいデータほど意思決定における価値が高い(もし、その効力が失われる前にアクションが起こせるのであれば)

☞ リアルタイム分析の必要性

Page 9: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

ストリーミングデータをリアルタイムに分析するには?

新しいアプローチ

一時的

クエリー データ

永続的 永続的

クエリー データ

一時的

アドホックなクエリーを永続化されたデータセットに適用すると都度結果セットが

得られる

永続化されたクエリーを連続的にストリーミングデータに適用すると結果ストリームが

得られる

Page 10: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

ストリーミングデータをリアルタイムに分析するには?

新しいプロセス

蓄積したデータを分析してアクションを起こす

収集 処理 蓄積 分析 アクション

分析してアクションを起こした後にデータを蓄積

収集 処理 分析 アクション 蓄積

Page 11: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

プラットフォームに求められる特性

1 連続性 最新のデータを常に処理し続けられること

2 応答性 アクションへ分析結果をフィードバックするメカニズムがあること

3 高速性 高頻度かつ低遅延で処理が完了すること

4 正確性 処理の重複可能性が明確であること。時刻の精度が高いこと

5 耐久性 データが失われないこと。繰り返し処理できること

6 信頼性 高速にフェイルオーバーし、常に利用できること

Page 12: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Amazon Kinesis

Page 13: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Amazon Kinesis プラットフォームストリーミングデータを収集・処理するためのフルマネージドサービス群

Amazon Kinesis Streams

ストリーミングデータを処理するための

アプリケーションを独自に構築

Amazon KinesisAnalytics

ストリーミングデータを標準的な SQL クエリーで

リアルタイムに分析

Amazon Kinesis Firehose

ストリーミングデータをAmazon S3, Amazon

Redshift, Amazon ES へ簡単に配信

Page 14: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Kinesis Streamsストリーミングデータを処理するためのアプリケーションを独自に構築

2

3

1 管理が容易

独自のリアルタイムアプリケーション

低コスト

必要なキャパシティをセットしてストリームを作成するだけで利用可能。スループットやデータ量の変化に応じてスケール

Amazon Kinesis Client Library, Apache Spark/Storm, AWS Lambda 等を利用してストリーム処理を実装

あらゆるスケールのワークロードで高いコスト効果

Page 15: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Kinesis Streams のアーキテクチャ概要

Frontend

認証・認可

3 アベイラビリティゾーンの永続ストレージに強い整合性でデータを複製

数百万のソースが1 時間あたり数百 TB の

データを生成

集約して S3 にアーカイブ

Endpoint

機械学習/スライディングウィンドウ分析

リアルタイムダッシュボード/アラート

データウェアハウスにロード

順序つきイベントストリームとして複数のアプリケーションから

同時アクセス可能

AZ AZ AZ

Page 16: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Kinesis Streams の主要なコンセプト

• データの種類や処理の用途に応じて「ストリーム」を作成。ストリームは 1 つ以上の「シャード」で構成• 保存されるデータの単位を「データレコード」と呼び、保持期間はデフォルトで 24 時間/最長で 7 日間• 1 データレコードの最大サイズは 1 MB• データ送信側のキャパシティは 1 シャードあたり秒間 1 MB もしくは 1,000 PUT レコード• データ処理側のキャパシティは 1 シャードあたり秒間 2 MB もしくは 5 回の読み取りトランザクション• ストリーム内のシャード数を増減することでスループットをコントロール

Kin

esis S

tream

s

エンドポイント

シャード 0

シャード 1

シャード ..N

データ送信側 データ処理側

Amazon S3

DynamoDB

Amazon Redshift

Amazon EMR

データレコード ストリーム

Page 17: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Kinesis Streams をサポートするプロデューサー/コンシューマー

プロデューサー (データ送信側) コンシューマー (データ処理側)

AWS SDK

Kinesis Producer Library

Kinesis Agent

AWS IoT

Kinesis Log4j Appender

Get* API

Kinesis Client Library

Fluentd

Kinesis Analytics

AWS Lambda

Amazon EMR

Apache Storm

Page 18: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Kinesis Firehoseストリーミングデータを Amazon S3, Amazon Redshift, Amazon ES へ簡単に配信

2

3

1 管理不要

データストアとダイレクトに統合

シームレスにスケール

アプリケーションの実装やインフラストラクチャーの管理を一切行わずにAmazon S3 / Amazon Redshift / Amazon ES にデータを配信可能

シンプルな設定でストリーミングデータのバッチ化・圧縮・暗号化が可能。最短 60 秒でデータを配信

データのスループットに応じて自動的にスケール

Page 19: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Kinesis Firehose の主要なコンセプト

• 配信先に応じて「配信ストリーム」を作成• シャードの作成やパーティションキーの指定不要• 1 データレコードの最大サイズは 1 MB• 制限なしにスケールするよう設計• 米国東部(バージニア北部)/米国西部(オレゴン)/欧州(アイルランド)リージョンで利用可能

Kin

esis F

irehose

エンドポイント

データレコード

データ送信側

Amazon S3

Amazon Redshift

Amazon ES

Amazon S3配信ストリーム

Amazon Redshift配信ストリーム

Amazon ES配信ストリーム

Page 20: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Kinesis Analyticsストリーミングデータを標準的な SQL クエリーでリアルタイムに分析

2

3

1 標準 SQL

リアルタイム分析アプリケーション

弾力的にスケール

複雑な処理フレームワークやプログラミング言語の学習不要

秒以下のレイテンシーでストリーミングデータを連続的に分析

データのスループットに応じて処理能力を伸縮。オペレーションの介入不要

Page 21: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Kinesis Analytics の主要なコンセプト

• 分析単位に「アプリケーション」を作成し、入力/出力となる「ストリーミングソース/デスティネーション」を設定• ストリーミングソース/デスティネーションはアプリケーション内部の「入力/出力ストリーム」に対応• SQL でアプリケーション内部の入力ストリームを分析し、結果を出力ストリームへ出力• アプリケーション内部ストリームの最大行サイズは 50 KB/参照データソースの最大サイズは 1 GB• クエリーの複雑さとデータのスループットに応じて処理能力 (KPU – Kinesis Processing Units) を自動伸縮• 米国東部(バージニア北部)/米国西部(オレゴン)/欧州(アイルランド)リージョンで利用可能

SQL

アプリケーション内部入力ストリーム

アプリケーション内部出力ストリーム

ストリーミングソース

(Kinesis Streams またはKinesis Firehose)

ストリーミングデスティネーション

(Kinesis Streams またはKinesis Firehose)

参照テーブル

参照データソース

アプリケーション内部エラーストリーム

アプリケーション

Page 22: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

Amazon Kinesis Analytics

Page 23: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

アプリケーションを作成

Page 24: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

アプリケーション名と説明を入力

Page 25: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

ストリーミングソースを設定

Page 26: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

既存ストリーミングソースを選択/新規作成

Page 27: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

行のスキーマを自動判定

Page 28: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

スキーマの手動設定も可能

Page 29: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

分析用の SQL を記述

Page 30: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

内部(入力)ストリームのプレビューを表示

Page 31: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

内部(出力)ストリームのプレビューを表示

Page 32: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

ストリーミングデスティネーションを設定

Page 33: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

既存ストリーミングデスティネーションを選択/新規作成

Page 34: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

内部(出力)ストリームとの対応と出力フォーマットを設定

Page 35: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

アプリケーション内部ストリームとポンプ

CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (

ticker_symbol VARCHAR(4), sector VARCHAR(12), change REAL, price REAL);

CREATE OR REPLACE PUMP "STREAM_PUMP" AS

INSERT INTO "DESTINATION_SQL_STREAM“

SELECT STREAM ticker_symbol, sector, change, price

FROM "SOURCE_SQL_STREAM_001“;

SQL

内部(入力)ストリーム 内部(出力)ストリームポンプ

“SOURCE_SQL_STREAM_001” “STREAM_PUMP” “DESTINATION_SQL_STREAM”

Page 36: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

様々なタイムスタンプ

CREATE OR REPLACE PUMP "STREAM_PUMP" AS

INSERT INTO "DESTINATION_SQL_STREAM“

SELECT STREAM

your_own_event_time_column,

approximate_arrival_time,

rowtime

FROM "SOURCE_SQL_STREAM_001";

イベント時刻 処理時刻収集時刻

your_own_event_time_column approximate_arrival_time rowtime

Page 37: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

ウィンドウ問い合わせ

タンブリングウィンドウ

スライディングウィンドウ

…FROM "SOURCE_SQL_STREAM_001"

GROUP BY ticker_symbol,

FLOOR("SOURCE_SQL_STREAM_001".rowtime TO MINUTE);

…FROM "SOURCE_SQL_STREAM_001"

WINDOW last_hour AS (PARTITION BY ticker_symbol RANGE INTERVAL '1' HOUR PRECEDING),

last_two_rows AS (PARTITION BY ticker_symbol ROWS 2 PRECEDING);

Page 38: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

前処理の例フィルタリング

• 内部(出力)ストリーム "DESTINATION_SQL_STREAM" を宣言• ポンプ "STREAM_PUMP" を宣言• sector カラムの値が '%TECH%' に正規表現マッチする行のみを抽出

CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (

ticker_symbol VARCHAR(4), sector VARCHAR(12), change REAL, price REAL);

CREATE OR REPLACE PUMP "STREAM_PUMP" AS

INSERT INTO "DESTINATION_SQL_STREAM“

SELECT STREAM ticker_symbol, sector, change, price

FROM "SOURCE_SQL_STREAM_001"

WHERE sector SIMILAR TO '%TECH%';

Page 39: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

前処理の例文字列操作

• 内部(出力)ストリーム "DESTINATION_SQL_STREAM" を宣言• ポンプ "MY_PUMP" を宣言• referrer カラムの値から SUBSTRING() 関数にて単純ドメイン名の部分文字列を抽出

CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (

ingest_time TIMESTAMP, referrer VARCHAR(32));

CREATE OR REPLACE PUMP "MY_PUMP" AS

INSERT INTO "DESTINATION_SQL_STREAM"

SELECT STREAM

"APPROXIMATE_ARRIVAL_TIME",

SUBSTRING(referrer, 12, (

POSITION('.com' IN referrer) - POSITION('www.' IN referrer) - 4))

FROM "SOURCE_SQL_STREAM_001";

Page 40: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

前処理の例参照テーブルの結合

• (参照テーブル "CompanyName" をアプリケーションに事前追加)• 内部(出力)ストリーム "DESTINATION_SQL_STREAM"/ポンプ "STREAM_PUMP" を宣言• 内部(入力)ストリーム "SOURCE_SQL_STREAM_001" に参照テーブルを外部結合• ティッカーシンボルが一致した場合に参照テーブルから "Company" カラムの値を出力

CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (

ticker_symbol VARCHAR(4), company VARCHAR(20), sector VARCHAR(12),

change DOUBLE, price DOUBLE);

CREATE OR REPLACE PUMP "STREAM_PUMP" AS

INSERT INTO "DESTINATION_SQL_STREAM"

SELECT STREAM ticker_symbol, c."Company", sector, change, price

FROM "SOURCE_SQL_STREAM_001"

LEFT JOIN "CompanyName" c

ON "SOURCE_SQL_STREAM_001".ticker_symbol = c."Ticker";

Page 41: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

基本的な分析の例トップ K アイテムの算出

• 内部(出力)ストリーム "DESTINATION_SQL_STREAM" を宣言• ポンプ "STREAM_PUMP" を宣言• TOP_K_ITEMS_TUMBLING() 関数へ "SOURCE_SQL_STREAM_001" へのカーソルを設定• トップ 10 の ‘ticker_symbol’ を 60 秒のタンブリングウィンドウから算出し、テーブルへ変換

CREATE OR REPLACE STREAM “DESTINATION_SQL_STREAM” (

item VARCHAR(1024), item_count DOUBLE);

CREATE OR REPLACE PUMP "STREAM_PUMP" AS

INSERT INTO "DESTINATION_SQL_STREAM"

SELECT STREAM * FROM TABLE(TOP_K_ITEMS_TUMBLING(

CURSOR(SELECT STREAM * FROM "SOURCE_SQL_STREAM_001"),

'ticker_symbol',

10,

60));

Page 42: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

基本的な分析の例アイテム数のカウント

• 内部(出力)ストリーム "DESTINATION_SQL_STREAM" を宣言• ポンプ "STREAM_PUMP" を宣言• COUNT_DISTINCT_ITEMS_TUMBLING() 関数へ "SOURCE_SQL_STREAM_001" へのカーソルを設定• 出現した ‘ticker_symbol’ の種類を 60 秒のタンブリングウィンドウからカウントし、テーブルへ変換

CREATE OR REPLACE STREAM “DESTINATION_SQL_STREAM” (

number_of_distinct_items BIGINT);

CREATE OR REPLACE PUMP "STREAM_PUMP" AS

INSERT INTO "DESTINATION_SQL_STREAM“

SELECT STREAM *

FROM TABLE(COUNT_DISTINCT_ITEMS_TUMBLING(

CURSOR(SELECT STREAM * FROM "SOURCE_SQL_STREAM_001"),

'ticker_symbol',

60));

Page 43: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

基本的な分析の例シンプルなアラート

• 内部(出力)ストリーム "DESTINATION_SQL_STREAM" を宣言• ポンプ "STREAM_PUMP" を宣言• 10 秒のスライディングウィンドウから ticker_symbol ごとに変化量の平均値を算出• 変化量の平均値の絶対値が 1 を超える行のみを抽出

CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (

ticker_symbol VARCHAR(4), avg_change DOUBLE);

CREATE OR REPLACE PUMP "STREAM_PUMP" AS

INSERT INTO "DESTINATION_SQL_STREAM“

SELECT STREAM ticker_symbol, avg_change

FROM (

SELECT STREAM ticker_symbol, AVG(change) OVER w1 AS avg_change

FROM "SOURCE_SQL_STREAM_001“

WINDOW w1 AS (PARTITION BY ticker_symbol RANGE INTERVAL '10' SECOND PRECEDING))

WHERE ABS(avg_change) > 1;

Page 44: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

応用的な分析の例アノマリーディテクション(異常検出)

• 内部(出力)ストリーム “TEMP_SQL_STREAM“ および "DESTINATION_SQL_STREAM" を宣言• ポンプ “STREAM_PUMP” および “OUTPUT_PUMP” を宣言• RANDOM_CUT_FOREST() 関数にて変化量と価格からアノマリースコアを算出• 1 秒のタンブリングウィンドウで行をアノマリースコアの降順にソート

CREATE OR REPLACE STREAM "TEMP_STREAM" (

ticker_symbol VARCHAR(4), change DOUBLE, price DOUBLE, anomaly_score DOUBLE);

CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (

ticker_symbol VARCHAR(4), change DOUBLE, price DOUBLE, anomaly_score DOUBLE);

CREATE OR REPLACE PUMP "STREAM_PUMP" AS INSERT INTO "TEMP_STREAM“

SELECT STREAM ticker_symbol, c, p, anomaly_score

FROM TABLE(RANDOM_CUT_FOREST(CURSOR(

SELECT STREAM ticker_symbol, CAST(change AS DOUBLE) AS c, CAST(price AS DOUBLE) AS p

FROM "SOURCE_SQL_STREAM_001")));

CREATE OR REPLACE PUMP "OUTPUT_PUMP" AS INSERT INTO "DESTINATION_SQL_STREAM“

SELECT STREAM *

FROM "TEMP_STREAM“

ORDER BY FLOOR("TEMP_STREAM".rowtime TO SECOND), anomaly_score DESC;

Page 45: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

代表的な制限事項• 米国東部(バージニア北部)/米国西部(オレゴン)/欧州(アイルランド)

リージョンで利用可能• アプリケーション内部ストリームの最大行サイズは 50 KB• 参照データソースの最大サイズは 1 GB• リージョンあたりの最大アプリケーション数は 5(上限緩和可能)• アプリケーションあたりのストリーミングソースの最大数は 1• アプリケーションあたりのストリーミングデスティネーションの最大数は 4• アプリケーションあたりの参照データソースの最大数は 1• アプリケーションあたりのストリーミングソースの最大並列数は 10• アプリケーションあたりの最大 KPU 数は 8(1 KPU は 1 vCPU および 4 GB

メモリー)• Kinesis Producer Library によって生成されたレコードは未サポート

Page 46: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析

参考ドキュメント

• Amazon Kinesis Analytics– https://aws.amazon.com/jp/kinesis/analytics/

• Amazon Kinesis Analytics Developer Guide– http://docs.aws.amazon.com/kinesisanalytics/latest/dev/what-is.html

• Amazon Kinesis Analytics SQL Reference– http://docs.aws.amazon.com/kinesisanalytics/latest/sqlref/analytics-sql-

reference.html

• Real-time Clickstream Anomaly Detection with Amazon Kinesis Analytics (AWS Big Data Blog)– https://blogs.aws.amazon.com/bigdata/post/Tx1XNQPQ2ARGT81/Real-time-

Clickstream-Anomaly-Detection-with-Amazon-Kinesis-Analytics

• Robust Random Cut Forest Based Anomaly Detection On Streams– http://jmlr.org/proceedings/papers/v48/guha16.pdf

Page 47: Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析