Upload
shinsukeyokota
View
676
Download
2
Embed Size (px)
Citation preview
DynamoDB Streamを使ったリアルタイム分析
クラスメソッド株式会社
横田 慎介
classmethod.jp 1
DEVIO-MTUP11-TOKYO-009
2014/12/16
DynamoDB Stream(Preview)
• テーブルの更新ログ
– MySQLのbinlogのようなもの
• 更新内容をリアルタイムに取得できる
classmethod.jp 2
リアルタイム分析
classmethod.jp 3
Amazon Lambda
DynamoDB
• NoSQLデータベース
• スキーマレス
– ユーザ定義プライマリキー + 任意の項目
classmethod.jp 4
DynamoDBテーブル例
classmethod.jp 5
user_id created_at action means points
0 1418638175 register
0 1418638260 get_point tutorial 100
1 1418642914 register
user_history
DynamoDBテーブル作成
classmethod.jp 6
DynamoDB Stream
classmethod.jp 7
DynamoDB Stream有効化
classmethod.jp 8
DynamoDB Stream
classmethod.jp 9
DynamoDBアイテム登録
classmethod.jp 10
{“user_id”: “0”,
“created_at”:1418638175,
“action”: “register”}
DynamoDB Streamレコード {
"Records": [
{
"awsRegion": "us-east-1",
"dynamodb": {
"Keys":
{
"user_id" : { "S": "0" },
"created_at" : { "N": "1418638175" }
},
"NewImage":
{
"user_id" : { "S": "0" },
"created_at" : { "N": "1418638175" },
"action" : { "S": "register" }
},
"SequenceNumber": "3758000000000000010265650",
"SizeBytes": 62,
"StreamViewType": "NEW_AND_OLD_IMAGES"
},
"eventID": ” cae695c863e891e573b710d101d4a72a",
"eventName": "INSERT",
"eventSource": "aws:dynamodb",
"eventVersion": "1.0"
}
]
}
classmethod.jp 11
DynamoDB更新情報
イベント情報
DynamoDB Streamレコード "NewImage":
{
"user_id" : { "S": "0" },
"created_at" : { "N": "1418638175" },
"action" : { "S": "register" }
},
classmethod.jp 12
LambdaでレコードをNorikraへ
classmethod.jp 13
Amazon Lambda
Lambda(Preview)
• コード実行サービス
– イベントを検知し、
– Lambda Functionを実行する
• 処理すべきイベント数に応じて自動でスケール
classmethod.jp 14
Lambda
classmethod.jp 15
① Lambda Functionの登録
② DynamoDB Streamをイベントソースとして登録
① ②
Lambda Function
classmethod.jp 16
Lambda Function作成
classmethod.jp 17
Lambda Function内容 exports.handler = function(event, context) {
// DynamoDB StreamイベントのデータをNorikraで扱いやすいように整形
async.series(
[
function (callback) { Norikraにターゲット作成; callback(null, true);},
function (callback) { Norikraにイベント送信; callback(null, true);}
],
function (err, results) {
if (err) {context.done('error', err);} else {context.done(null, results);}
}
);
}
classmethod.jp 18
https://github.com/yokota-shinsuke/aws-lambda-dynamodbstream-to-norikra
Lambda Function登録
classmethod.jp 19
Lambda Function登録
classmethod.jp 20
Lambdaへのイベント登録
classmethod.jp 21
① Lambda Functionの登録
② DynamoDB Streamをイベントソースとして登録
②
Lambdaへのイベント登録
classmethod.jp 22
Lambdaへのイベント登録
classmethod.jp 23
Norikra
• イベントストリームプロセッサ
• SQLライクな言語でイベントの集計方法を記述できる
– 例:直近1時間に新規登録したユーザ数
http://norikra.github.io/index.html
classmethod.jp 24
SELECT COUNT(*) AS new_users
FROM user_history.win:time_batch(1 hour)
WHERE action = ‘register’
user_id: 0 action: register
Norikra
classmethod.jp 25
user_id: 1 action: register
user_histor
user_id: 0 action: get_point
new_user: 1
SELECT COUNT(*) AS new_users
FROM user_history.win:time_batch(1 hour)
WHERE action = ‘register’
Norikra
classmethod.jp 26
user_histor
user_id: 0 action: get_point
new_user: 2
user_id: 1 action: register
SELECT COUNT(*) AS new_users
FROM user_history.win:time_batch(1 hour)
WHERE action = ‘register’
Norikra WebUI
classmethod.jp 27
Norikra Target
classmethod.jp 28
Norikra Query
classmethod.jp 29
Norikra Output
classmethod.jp 30
1418713623, {“new_user” : 3}
1418713683, {“new_user” : 1}
経路ごとのユーザ登録数
classmethod.jp 31
{“user_id” : 3, “created_at” : 1418713623,
“action” : “register”, “entry_from” : “ad01”}
SELECT entry_from, COUNT(*) AS new_users
FROM user_history.win:time_batch(1 hour)
WHERE action = ‘register’
GROUP BY entry_from
{“entry_from” : “ad01” ,“new_user” : 3}
{“entry_from” : “ad02” ,“new_user” : 1}
#cmdevio
ご清聴ありがとうございました。
このスライドは後日公開いたします。
reGrowth-001