Upload
amazon-web-services-japan
View
2.150
Download
2
Embed Size (px)
Citation preview
Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析
2016 年 10 月 4 日アマゾンウェブサービスジャパン株式会社ソリューションアーキテクト|内海英一郎
スピーカー紹介
アマゾンウェブサービスジャパン株式会社
ソリューションアーキテクト
❤ Amazon Kinesis
❤ Java
❤ LMAX Disruptor
うちうみえいいちろう
内海英一郎|@eiichirouchiumi
本セッションのアジェンダ
• Amazon Kinesis プラットフォーム概要
• Amazon Kinesis Analytics– 利用方法
– 分析例
– 注意事項
Amazon Kinesis プラットフォーム概要
はるか遠い昔「データ分析」はヒストリカルレポートやダッシュボードそのものであった
– M. Gualtieri, Forrester @ AWS re:Invent 2014
今日の「データ分析」は過去・現在を知り、近未来を予測するものへと変わっている
– M. Gualtieri, Forrester @ AWS re:Invent 2014
多くのデータは持続的に生成されている
モバイルアプリケーション Web クリックストリーム アプリケーションログ
メータリングレコード IoT センサー スマートビルディング
データの価値は時間の経過とともに減少する
Perishable Insights– M. Gualtieri, Forrester
新しいデータほど意思決定における価値が高い(もし、その効力が失われる前にアクションが起こせるのであれば)
☞ リアルタイム分析の必要性
ストリーミングデータをリアルタイムに分析するには?
新しいアプローチ
一時的
クエリー データ
永続的 永続的
クエリー データ
一時的
アドホックなクエリーを永続化されたデータセットに適用すると都度結果セットが
得られる
永続化されたクエリーを連続的にストリーミングデータに適用すると結果ストリームが
得られる
ストリーミングデータをリアルタイムに分析するには?
新しいプロセス
蓄積したデータを分析してアクションを起こす
収集 処理 蓄積 分析 アクション
分析してアクションを起こした後にデータを蓄積
収集 処理 分析 アクション 蓄積
プラットフォームに求められる特性
1 連続性 最新のデータを常に処理し続けられること
2 応答性 アクションへ分析結果をフィードバックするメカニズムがあること
3 高速性 高頻度かつ低遅延で処理が完了すること
4 正確性 処理の重複可能性が明確であること。時刻の精度が高いこと
5 耐久性 データが失われないこと。繰り返し処理できること
6 信頼性 高速にフェイルオーバーし、常に利用できること
Amazon Kinesis
Amazon Kinesis プラットフォームストリーミングデータを収集・処理するためのフルマネージドサービス群
Amazon Kinesis Streams
ストリーミングデータを処理するための
アプリケーションを独自に構築
Amazon KinesisAnalytics
ストリーミングデータを標準的な SQL クエリーで
リアルタイムに分析
Amazon Kinesis Firehose
ストリーミングデータをAmazon S3, Amazon
Redshift, Amazon ES へ簡単に配信
Kinesis Streamsストリーミングデータを処理するためのアプリケーションを独自に構築
2
3
1 管理が容易
独自のリアルタイムアプリケーション
低コスト
必要なキャパシティをセットしてストリームを作成するだけで利用可能。スループットやデータ量の変化に応じてスケール
Amazon Kinesis Client Library, Apache Spark/Storm, AWS Lambda 等を利用してストリーム処理を実装
あらゆるスケールのワークロードで高いコスト効果
Kinesis Streams のアーキテクチャ概要
Frontend
認証・認可
3 アベイラビリティゾーンの永続ストレージに強い整合性でデータを複製
数百万のソースが1 時間あたり数百 TB の
データを生成
集約して S3 にアーカイブ
Endpoint
機械学習/スライディングウィンドウ分析
リアルタイムダッシュボード/アラート
データウェアハウスにロード
順序つきイベントストリームとして複数のアプリケーションから
同時アクセス可能
AZ AZ AZ
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
データレコード ストリーム
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
Kinesis Firehoseストリーミングデータを Amazon S3, Amazon Redshift, Amazon ES へ簡単に配信
2
3
1 管理不要
データストアとダイレクトに統合
シームレスにスケール
アプリケーションの実装やインフラストラクチャーの管理を一切行わずにAmazon S3 / Amazon Redshift / Amazon ES にデータを配信可能
シンプルな設定でストリーミングデータのバッチ化・圧縮・暗号化が可能。最短 60 秒でデータを配信
データのスループットに応じて自動的にスケール
Kinesis Firehose の主要なコンセプト
• 配信先に応じて「配信ストリーム」を作成• シャードの作成やパーティションキーの指定不要• 1 データレコードの最大サイズは 1 MB• 制限なしにスケールするよう設計• 米国東部(バージニア北部)/米国西部(オレゴン)/欧州(アイルランド)リージョンで利用可能
Kin
esis F
irehose
エンドポイント
データレコード
データ送信側
Amazon S3
Amazon Redshift
Amazon ES
Amazon S3配信ストリーム
Amazon Redshift配信ストリーム
Amazon ES配信ストリーム
Kinesis Analyticsストリーミングデータを標準的な SQL クエリーでリアルタイムに分析
2
3
1 標準 SQL
リアルタイム分析アプリケーション
弾力的にスケール
複雑な処理フレームワークやプログラミング言語の学習不要
秒以下のレイテンシーでストリーミングデータを連続的に分析
データのスループットに応じて処理能力を伸縮。オペレーションの介入不要
Kinesis Analytics の主要なコンセプト
• 分析単位に「アプリケーション」を作成し、入力/出力となる「ストリーミングソース/デスティネーション」を設定• ストリーミングソース/デスティネーションはアプリケーション内部の「入力/出力ストリーム」に対応• SQL でアプリケーション内部の入力ストリームを分析し、結果を出力ストリームへ出力• アプリケーション内部ストリームの最大行サイズは 50 KB/参照データソースの最大サイズは 1 GB• クエリーの複雑さとデータのスループットに応じて処理能力 (KPU – Kinesis Processing Units) を自動伸縮• 米国東部(バージニア北部)/米国西部(オレゴン)/欧州(アイルランド)リージョンで利用可能
SQL
アプリケーション内部入力ストリーム
アプリケーション内部出力ストリーム
ストリーミングソース
(Kinesis Streams またはKinesis Firehose)
ストリーミングデスティネーション
(Kinesis Streams またはKinesis Firehose)
参照テーブル
参照データソース
アプリケーション内部エラーストリーム
アプリケーション
Amazon Kinesis Analytics
アプリケーションを作成
アプリケーション名と説明を入力
ストリーミングソースを設定
既存ストリーミングソースを選択/新規作成
行のスキーマを自動判定
スキーマの手動設定も可能
分析用の SQL を記述
内部(入力)ストリームのプレビューを表示
内部(出力)ストリームのプレビューを表示
ストリーミングデスティネーションを設定
既存ストリーミングデスティネーションを選択/新規作成
内部(出力)ストリームとの対応と出力フォーマットを設定
アプリケーション内部ストリームとポンプ
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”
様々なタイムスタンプ
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
ウィンドウ問い合わせ
タンブリングウィンドウ
スライディングウィンドウ
…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);
前処理の例フィルタリング
• 内部(出力)ストリーム "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%';
前処理の例文字列操作
• 内部(出力)ストリーム "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";
前処理の例参照テーブルの結合
• (参照テーブル "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";
基本的な分析の例トップ 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));
基本的な分析の例アイテム数のカウント
• 内部(出力)ストリーム "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));
基本的な分析の例シンプルなアラート
• 内部(出力)ストリーム "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;
応用的な分析の例アノマリーディテクション(異常検出)
• 内部(出力)ストリーム “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;
代表的な制限事項• 米国東部(バージニア北部)/米国西部(オレゴン)/欧州(アイルランド)
リージョンで利用可能• アプリケーション内部ストリームの最大行サイズは 50 KB• 参照データソースの最大サイズは 1 GB• リージョンあたりの最大アプリケーション数は 5(上限緩和可能)• アプリケーションあたりのストリーミングソースの最大数は 1• アプリケーションあたりのストリーミングデスティネーションの最大数は 4• アプリケーションあたりの参照データソースの最大数は 1• アプリケーションあたりのストリーミングソースの最大並列数は 10• アプリケーションあたりの最大 KPU 数は 8(1 KPU は 1 vCPU および 4 GB
メモリー)• Kinesis Producer Library によって生成されたレコードは未サポート
参考ドキュメント
• 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