32
DynamoDB Streamを使った リアルタイム分析 クラスメソッド株式会社 横田 慎介 classmethod.jp 1 DEVIO-MTUP11-TOKYO-009 2014/12/16

DynamoDB Streamを使ったリアルタイム分析

Embed Size (px)

Citation preview

Page 1: DynamoDB Streamを使ったリアルタイム分析

DynamoDB Streamを使ったリアルタイム分析

クラスメソッド株式会社

横田 慎介

classmethod.jp 1

DEVIO-MTUP11-TOKYO-009

2014/12/16

Page 2: DynamoDB Streamを使ったリアルタイム分析

DynamoDB Stream(Preview)

• テーブルの更新ログ

– MySQLのbinlogのようなもの

• 更新内容をリアルタイムに取得できる

classmethod.jp 2

Page 3: DynamoDB Streamを使ったリアルタイム分析

リアルタイム分析

classmethod.jp 3

Amazon Lambda

Page 4: DynamoDB Streamを使ったリアルタイム分析

DynamoDB

• NoSQLデータベース

• スキーマレス

– ユーザ定義プライマリキー + 任意の項目

classmethod.jp 4

Page 5: DynamoDB Streamを使ったリアルタイム分析

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

Page 6: DynamoDB Streamを使ったリアルタイム分析

DynamoDBテーブル作成

classmethod.jp 6

Page 7: DynamoDB Streamを使ったリアルタイム分析

DynamoDB Stream

classmethod.jp 7

Page 8: DynamoDB Streamを使ったリアルタイム分析

DynamoDB Stream有効化

classmethod.jp 8

Page 9: DynamoDB Streamを使ったリアルタイム分析

DynamoDB Stream

classmethod.jp 9

Page 10: DynamoDB Streamを使ったリアルタイム分析

DynamoDBアイテム登録

classmethod.jp 10

{“user_id”: “0”,

“created_at”:1418638175,

“action”: “register”}

Page 11: DynamoDB Streamを使ったリアルタイム分析

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更新情報

イベント情報

Page 12: DynamoDB Streamを使ったリアルタイム分析

DynamoDB Streamレコード "NewImage":

{

"user_id" : { "S": "0" },

"created_at" : { "N": "1418638175" },

"action" : { "S": "register" }

},

classmethod.jp 12

Page 13: DynamoDB Streamを使ったリアルタイム分析

LambdaでレコードをNorikraへ

classmethod.jp 13

Amazon Lambda

Page 14: DynamoDB Streamを使ったリアルタイム分析

Lambda(Preview)

• コード実行サービス

– イベントを検知し、

– Lambda Functionを実行する

• 処理すべきイベント数に応じて自動でスケール

classmethod.jp 14

Page 15: DynamoDB Streamを使ったリアルタイム分析

Lambda

classmethod.jp 15

① Lambda Functionの登録

② DynamoDB Streamをイベントソースとして登録

① ②

Page 16: DynamoDB Streamを使ったリアルタイム分析

Lambda Function

classmethod.jp 16

Page 17: DynamoDB Streamを使ったリアルタイム分析

Lambda Function作成

classmethod.jp 17

Page 18: DynamoDB Streamを使ったリアルタイム分析

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

Page 19: DynamoDB Streamを使ったリアルタイム分析

Lambda Function登録

classmethod.jp 19

Page 20: DynamoDB Streamを使ったリアルタイム分析

Lambda Function登録

classmethod.jp 20

Page 21: DynamoDB Streamを使ったリアルタイム分析

Lambdaへのイベント登録

classmethod.jp 21

① Lambda Functionの登録

② DynamoDB Streamをイベントソースとして登録

Page 22: DynamoDB Streamを使ったリアルタイム分析

Lambdaへのイベント登録

classmethod.jp 22

Page 23: DynamoDB Streamを使ったリアルタイム分析

Lambdaへのイベント登録

classmethod.jp 23

Page 24: DynamoDB Streamを使ったリアルタイム分析

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’

Page 25: DynamoDB Streamを使ったリアルタイム分析

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’

Page 26: DynamoDB Streamを使ったリアルタイム分析

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’

Page 27: DynamoDB Streamを使ったリアルタイム分析

Norikra WebUI

classmethod.jp 27

Page 28: DynamoDB Streamを使ったリアルタイム分析

Norikra Target

classmethod.jp 28

Page 29: DynamoDB Streamを使ったリアルタイム分析

Norikra Query

classmethod.jp 29

Page 30: DynamoDB Streamを使ったリアルタイム分析

Norikra Output

classmethod.jp 30

1418713623, {“new_user” : 3}

1418713683, {“new_user” : 1}

Page 31: DynamoDB Streamを使ったリアルタイム分析

経路ごとのユーザ登録数

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}

Page 32: DynamoDB Streamを使ったリアルタイム分析

#cmdevio

ご清聴ありがとうございました。

このスライドは後日公開いたします。

reGrowth-001