More Related Content Similar to AWS Black Belt Techシリーズ Amazon Kinesis (20) More from Amazon Web Services Japan (20) AWS Black Belt Techシリーズ Amazon Kinesis11. AWS のビッグデータ・プラットフォーム
11
収集 保存 解析 可視化
Amazon
Kinesis
Stream Processing
Amazon S3
Cloud Storage
Amazon DynamoDB
NoSQL
Amazon
EMR
Batch Processing
Amazon
Redshift
Data Warehouse
Amazon EC2
BI Tools
Amazon RDS
RDBMS
AWS Data Pipeline
Data Flow
16. Kinesisコスト
従量課金 & 初期費用不要
課金項目 単価
シャード利用料 $0.0195/shard/時間
PUT Payload Unit
トランザクション
$0.0215/100万Put
• PUT Payload Unitは、25KB
• シャード1つで、一ヶ月約$14
• Getトランザクションは無料
• インバウンドのデータ転送料は無料
• アプリケーションが走るEC2は通常の料金がかかります
18. データ入力方法
• PutRecord API, PutRecords API でデータ入力が可能
– http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html
– http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html
• AWS SDK for Java, Javascript, Python, Ruby, PHP, .Net, AWS CLIが利用可能
• PutRecords APIを用いることにより効率的なアップロードが可能(上限1000Records, 1MB)
$ aws kinesis put-record
--stream-name StreamName --data 'foo' --partition-key $RANDOM
{
"ShardId": "shardId-000000000013",
"SequenceNumber":
"49541296383533603670305612607160966548683674396982771921"
}
レスポンス
AWS CLI を利用した例(PutRecord):
19. データ入力方法
$ aws kinesis put-records
--stream-name StreamName --records Data=foo, PartitionKey=part1
Data=bar,PartitionKey=part2
{
"FailedRecordCount": 0,
"Records": [
{
"ShardId": "shardId-000000000000",
"SequenceNumber": "49545693054015017535413974379008689042941246688683098114"
},
{
"ShardId": "shardId-000000000000",
"SequenceNumber": "49545693054015017535413974379009897968760861317857804290"
}
]
}
レスポンス
AWS CLI を利用した例(PutRecords):
24. Kinesis Producer Library KPL
• アプリケーションがデータをKinesisにPutすることを補助するライブラリ
[ドキュメント]
http://docs.aws.amazon.com/ja_jp/kinesis/latest/dev/developin
g-producers-with-kpl.html
<特徴>
1. パフォーマンス
2. 簡単実装
3. モニタリング
4. 非同期実行
<サポートプラットフォーム>
Amazon Linux AMI (2012.09, 2013.03, 2014.09, 2015.03)
CentOs 7.0
Fedora (2013, 2014, 2015)
Gentoo (2014, 2015)
OpenSuse 13 (2014)
RedHat 7.1
SUSE Linux Enterprise Server 12 x86_64
Ubuntu Server (13.04, 14.04, 15.04)
Apple OS X (10.9, 10.10)
26. 既存ログ収集パターン
• Fluentd Plugin利用パターン
• Webサーバ、アプリケーションサー
バなどにあるログデータの入力に最
適
• GithubからPluginを取得することが
可能
https://github.com/awslabs/aw
s-fluent-plugin-kinesis
• Log4J利用パターン
• JavaアプリケーションでLog4Jを利用
している場合導入が容易
• 開発者ガイド
http://docs.aws.amazon.com/ElasticMapRed
uce/latest/DeveloperGuide/kinesis-pig-
publisher.html
Web
# KINESIS appender
log4j.logger.KinesisLogger=INFO, KINESIS
log4j.additivity.KinesisLogger=false
log4j.appender.KINESIS=com.amazonaws.services.kin
esis.log4j.KinesisAppender
log4j.appender.KINESIS.layout=org.apache.log4j.Patte
rnLayout
log4j.appender.KINESIS.layout.ConversionPattern=%
m
log4j.properties サンプル
27. MQTT Broker
Kinesis-MQTT Bridge
センサーログ収集パターン
• センサーデバイスなどライトウェイトなプロトコル(MQTT)を利用するパターン
• MQTT BrokerとMQTT-Kinesis Bridgeを用いてメッセージをKinesisに入力するこ
とが可能
• GithubからMQTT-Kinesis Bridgeサンプルソースが取得可能
https://github.com/awslabs/mqtt-kinesis-bridge
MQTT Broker
Kinesis-MQTT Bridge
センサー
センサー
センサー
Auto scaling Group
28. モバイルアプリデータ収集パターン
• モバイルアプリから直接入力パターン
• CognitoとMobileSDKを用いて容易にKinesisにデータ入力が可能
• 認証または、非認証でKinesisへのアクセストークンをテンポラリに取得しデータ入
力が可能
App w/SDK
End Users
Login OAUTH/OpenID
Access Token
Cognito ID,
Temp
Credentials
Access
Token
Pool ID
Role ARNs
Put Recode
認証が必要な
場合
Identitypool
Identity
Providers
Access
Policyidentitypool
Unauthenticated
Identities
authenticated
identitiesAWS
Account
Amazon Cognito - IDブローカー
30. データ取得方法
• GetShardIterator APIでShard内のポジションを取得し、GetRecords APIでデータ入力が可能
– http://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetShardIterator.html
– http://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html
• AWS SDK for Java, Javascript, Python, Ruby, PHP, .Net が利用可能
• AWS CLIが利用可能
$ aws kinesis get-shard-iterator --stream-name StreamName
--shard-id shardId-000000000013 --shard-iterator-type AT_SEQUENCE_NUMBER
--starting-sequence-number 49541296383533603670305612607160966548683674396982771921
{
"ShardIterator": ”FakeIterator"
}
$ aws kinesis get-records --shard-iterator FakeIterator --limit 1
{
"Records": [
{
"PartitionKey": "16772",
"Data": "Zm9v",
"SequenceNumber": "49541296383533603670305612607160966548683674396982771921"
}
],
"NextShardIterator": “YetAnotherFakeIterator"
}
get-shard-iterator
get-records
32. Kinesis Client Library (KCL)
Client library for fault-tolerant, at least-once, Continuous
Processing
• Shardと同じ数のWorker
• Workerを均等にロードバランシング
• 障害感知と新しいWorkerの立ち上げ
• シャードの数に応じてworkerが動作する
• AutoScalingでエラスティック
• チェックポインティングとAt least once処理
これらの煩雑な処理を意識することなく
ビジネスロジックに集中することができる。
33. Sample RecordProcessor
public class SampleRecordProcessor implements IRecordProcessor {
@Override
public void initialize(String shardId) {
LOG.info("Initializing record processor for shard: " + shardId);
// initialize to start processing records.
initializeLocalState(shardId);
}
@Override
public void processRecords(List<Record> records, IRecordProcessorCheckpointer checkpointer) {
LOG.info("Processing " + records.size() + " records for kinesisShardId " + kinesisShardId);
// Process records and perform all exception handling.
processRecordsWithRetries(records);
// Checkpoint once every checkpoint interval.
if (System.currentTimeMillis() > nextCheckpointTimeInMillis) {
checkpoint(checkpointer);
nextCheckpointTimeInMillis = System.currentTimeMillis() + CHECKPOINT_INTERVAL_MILLIS;
}
}
}
39. Kinesis Client Library (KCL)対応言語
• Java
• Node.js
• .Net
• Python
複数の言語でビジネスロジックを記述し、KCLのMultiLangDaemonが
Kinesisとのやりとりを行う。
40. MultiLangDaemonについて
• KCL for Pythonは、KCL for Javaの“MultiLangDaemon”を常駐プロセ
スとして利用し、データ処理のメインロジックをPythonで記述できるラ
イブラリ
• データ処理は、サブプロセスとして起動される
• “MultiLangDaemon”とサブプロセス間のデータ通信は、定義されたプロ
トコルでSTDIN/STDOUTを使って行われる
KCL(Java)
Shard-0
Shard-1 Worker Thread
Worker Thread
Python Logic
Process
Python Logic
Process
41. Pythonの例)KCL for Python実装
#!env python
from amazon_kclpy import kcl
import json, base64
class RecordProcessor(kcl.RecordProcessorBase):
def initialize(self, shard_id):
pass
def process_records(self, records, checkpointer):
pass
def shutdown(self, checkpointer, reason):
pass
if __name__ == "__main__":
kclprocess = kcl.KCLProcess(RecordProcessor())
kclprocess.run()
42. Multi Language Protocol
Action Parameter
Initialize "shardId" : "string"
processRecords [{ "data" : ”base64encoded_string",
"partitionKey" : ”partition key",
"sequenceNumber" : ”sequence number";
}] // a list of records
checkpoint "checkpoint" : ”sequence number",
"error" : NameOfException"
shutdown "reason" : “TERMINATE|ZOMBIE"
43. KCL for Pythonのプロパティで設定出来る項目
項目 内容
failoverTimeMillis Workerが処理を継続できなくなり別なWorkerにフェイルオーバする時間(ミリ秒)
短い値を設定するとDynamoDBのPIOPS高くなるため注意が必要
maxRecords 1回のデータ取得で取得するレコード件数
idleTimeBetweenReadsInMillis レコード取得間隔(ミリ秒)
callProcessRecordsEvenForEmptyRecord
List
レコードデータが空でもレコード取得処理を継続するかの判断(True or Fault)
parentShardPollIntervalMillis 親のShardをチェックするインターバル
短い値を設定するとDynamoDBのPIOPS高くなるため注意が必要
cleanupLeasesUponShardCompletion shradが終了した後に継続して処理を続けるかクリーンアップするかを指定
taskBackoffTimeMillis KCLのバックオフタイムの設定
metricsBufferTimeMillis CloudWatchのAPIコールする前の時間
metricsMaxQueueSize CloudWatchのAPIコールする最大のキューサイズ
validateSequenceNumberBeforeCheckpo
inting
Checkpointingする前にシーケンス番号をチェックするかを指定
maxActiveThreads MultiLangDaemonの最大スレッド数
44. Pythonの例)KCL for Python実行方法
[ec2-user@ip-172-31-17-43 samples]$ amazon_kclpy_helper.py --print_command -j /usr/bin/java -p /home/ec2-
user/amazon-kinesis-client-python/samples/sample.properties
/usr/bin/java -cp /usr/lib/python2.6/site-packages/amazon_kclpy-1.0.0-py2.6.egg/amazon_kclpy/jars/amazon-
kinesis-client-1.2.0.jar:/usr/lib/python2.6/site-packages/amazon_kclpy-1.0.0-
py2.6.egg/amazon_kclpy/jars/jackson-annotations-2.1.1.jar:/usr/lib/python2.6/site-packages/amazon_kclpy-
1.0.0-py2.6.egg/amazon_kclpy/jars/commons-codec-1.3.jar:/usr/lib/python2.6/site-packages/amazon_kclpy-
1.0.0-py2.6.egg/amazon_kclpy/jars/commons-logging-1.1.1.jar:/usr/lib/python2.6/site-packages/amazon_kclpy-
1.0.0-py2.6.egg/amazon_kclpy/jars/joda-time-2.4.jar:/usr/lib/python2.6/site-packages/amazon_kclpy-1.0.0-
py2.6.egg/amazon_kclpy/jars/jackson-databind-2.1.1.jar:/usr/lib/python2.6/site-packages/amazon_kclpy-1.0.0-
py2.6.egg/amazon_kclpy/jars/jackson-core-2.1.1.jar:/usr/lib/python2.6/site-packages/amazon_kclpy-1.0.0-
py2.6.egg/amazon_kclpy/jars/aws-java-sdk-1.7.13.jar:/usr/lib/python2.6/site-packages/amazon_kclpy-1.0.0-
py2.6.egg/amazon_kclpy/jars/httpclient-4.2.jar:/usr/lib/python2.6/site-packages/amazon_kclpy-1.0.0-
py2.6.egg/amazon_kclpy/jars/httpcore-4.2.jar:/home/ec2-user/amazon-kinesis-client-python/samples
com.amazonaws.services.kinesis.multilang.MultiLangDaemon sample.properties
出力結果をコピーして、シェルの入力
としてペーストし、実行すると、KCL
が実行されます
45. KCLが使用するリソース
• DynamoDB
– チェックポイントの情報などのステート管理
– デフォルトでRead/WriteのProvisioned Throughputが10
で作成される
– http://docs.aws.amazon.com/kinesis/latest/dev/kinesi
s-record-processor-ddb.html
• Cloudwatch
– KCLアプリケーションのカスタムメトリックス
– 取得できるメトリックスは以下を確認してください
• http://docs.aws.amazon.com/kinesis/latest/dev/monitori
ng-with-kcl.html
49. データ処理パターン分類
分類 ユースケース
基本構成パターン Kinesisアプリケーションを構成する基本的なパターン
Simple ETL処理パターン KinesisでIngestされたデータをS3、DynamoDB、Redshiftにアーカイブするパ
ターン
- フィルタリング+データアーカイブ
ETL/MapReduce処理パターン KinesisでIngestされたデータをHadoop、Spark、Storm
を用いてデータ処理するパターン
- データクレンジング
- ETL+簡易集計
Filterパターン 複数のKinesisをパイプラインのようにつなぎあわせてFiltering/MapReduceを行
うパターン
- フィルタリング
- ロジックルーティング
機械学習インテグレーションパターン オンラインとオフラインを組み合わせた機械学習インテグレーションパターン
− 異常検知、リコメンデーション
53. Kinesis Connector Library サンプルコード
public class S3Pipeline implements IKinesisConnectorPipeline<KinesisMessageModel, byte[]> {
@Override
public ITransformer<KinesisMessageModel, byte[]> getTransformer(KinesisConnectorConfiguration configuration) {
return new JsonToByteArrayTransformer<KinesisMessageModel>(KinesisMessageModel.class);
}
@Override
public IFilter<KinesisMessageModel> getFilter(KinesisConnectorConfiguration configuration) {
return new AllPassFilter<KinesisMessageModel>();
}
@Override
public IBuffer<KinesisMessageModel> getBuffer(KinesisConnectorConfiguration configuration) {
return new BasicMemoryBuffer<KinesisMessageModel>(configuration);
}
@Override
public IEmitter<byte[]> getEmitter(KinesisConnectorConfiguration configuration) {
return new S3Emitter(configuration);
}
}
[Sample S3 pipeline]
JSONをByteArrayに変換
すべてパスするフィルタ
メモリ上にバッファ
S3に対して書き込み
55. EMR Connector
• Hive、Pig、Cascading、Hadoop Streamingといった使い慣れたHadoopのツールを
使って、Kinesis Streamのデータを取得し、Map Reduceの処理が可能
• ETL処理や別のKinesis Stream, S3, DynamoDB, HDFSのHive Tableなどの他のデー
タソースのテーブルとJOINすることなども可能
– (例) Clickstream (Kinesis) JOIN Ad campaign data (DynamoDB)
Kinesis
Stream EMR Hive
Table
Data Storage
Table Mapping
(Hive利用例)
http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-kinesis.html
56. EMR Connector : Hive利用例
Hiveテーブル作成
Kinesis Streamを
指定
HQLの実行(例)
通常のHQLを実行するだけ。
内部的には、Kinesisからデー
タを取得し、処理を行う
58. ETL/MapReduce処理パターン(2)
• Apache SparkをEMR上で実行するパターン
• Apache Hadoopより高速にMapReduceの処理が可能
EMR ClusterKinesis
def main(args: Array[String]) {
val ssc = new StreamingContext(args(0), "KinesisWordCount",
Seconds(30),System.getenv("SPARK_HOME"),
Seq(System.getenv("SPARK_EXAMPLES")))
var canalClient = new AmazonKinesisClient(getCredentials());
val describeStreamRequest = new
DescribeStreamRequest().withStreamName(args(1));
val describeStreamResult = canalClient.describeStream(describeStreamRequest);
val shards = describeStreamResult.getStreamDescription().getShards().toList
val stream = ssc.union(for (shard <- shards)
yield (ssc.networkStream[String](new
KinesisInputDStream("none",args(1),shard.getShardId()))))
val hashTags = stream.flatMap(status => status.split(" "))
val wordCount = hashTags.map((_, 1))
.reduceByKeyAndWindow(_ + _, Seconds(60))
.map{case (topic, count) => (count, topic)}
wordCount.print
ssc.start()
} WordCount Sample(抜粋)
59. ETL/MapReduce処理パターン(3)
• Apache Stormを利用するパターン
• Boltをつなげることで高度なデータ処理をリアルタイムで分散処理が可能
• KinesisからApache Stormへのインテグレーションを容易にするためのSpout
を提供
https://github.com/awslabs/kinesis-storm-spout
Data
Sources
Data
Sources
Data
Sources
Storm
Spout
Storm
Bolt
Storm
Bolt
Storm
Bolt
60. Kinesis MapReduceパターン
• Kinesisをパイプラインとして連結するパターン
• FilterやMapReduceを多段Kinesisを用いて実現
• 最初のKinesisは、ピークトラフィックに対応しやすくするためにランダムな値を
パーティションキーとしてセットし、平準化し、次のストリームを生成し、伝送す
る
Data
Sources
Data
Sources
Data
Sources
Kinesis
App
Kinesis
App
Kinesis
App
Kinesis
App
Filter Layer (例) Process Layer (例)
63. CloudWatchによるメトリックスの監視
• CloudWatchを通して以下のメトリックスを取得可能
• Shardの運用に利用することが可能
メトリックス
GetRecords.Bytes GetRecordsで取得されたデータバイト数
GetRecords.IteratorAge GetShardIteratorの有効時間
GetRecords.Latency GetRecordsのレイテンシー
GetRecords.Success GetRecords APIの成功した数
PutRecord.Bytes PutRecordで入力されたデータバイト数
PutRecord.Latency PutRecordのレイテンシー
PutRecord.Success PutRecord APIの成功した数
PutRecords.Bytes PutRecordsで入力されたデータバイト数
PutRecords.Latency PutRecordsのレイテンシー
PutRecords.Success PutRecords APIの成功した数
PutRecords.Records PutRecordsで成功したレコード数
IncomingBytes 指定した期間にPutに成功したデータバイト数
IncomingRecords 指定した期間にPutに成功したレコード数
64. CloudWatchによるメトリックスの監視のポイント
• Shardのキャパシティ(データ入力側 1MB/sec, 1000 TPS、データ処理側
2 MB/sec, 5TPS)を意識する。
– 各APIのProvisionedThroughputExceededExceptionの発生数できないため
キャパシティを意識して監視ポイントを設定する必要がある。(2014年12月
現在)
• 各メトリックスは、Stream単位での値であるため以下の計算式で監視ポイ
ントを設定する
– {Shardキャパシティ上限} x {Shard数} x {監視ポイント(%)}
(例: 80%超えたらShardを追加する場合)
1000TPS x 2Shards x 80%
65. Shardの分割とマージ
• Shardのキャパシティと実際の利用に応じてShardを分割またはマージし
てサービスの拡張とコストの最適化が可能
• SpritShard APIで分割、MergeShards APIでマージすることができる。
– (SpritShard) http://docs.aws.amazon.com/kinesis/latest/APIReference/API_SplitShard.html
– (MergeShards) http://docs.aws.amazon.com/kinesis/latest/APIReference/API_MergeShards.html
AWSEndpoint
Availability
Zone
Shard 1
Shard 2
Shard N
Availability
Zone
Availability
Zone Shard-
1
Shard-
2
Shard-
1
Shard-
2
Shard-
3
Shard-
4
分割
67. SpritShard API
• SpritShardでは、担当するハッシュキーのスタートの値を指定する。
conn = KinesisConnection()
descStream = conn.describe_stream(stream_name)
for shard in descStream['StreamDescription']['Shards']:
StartHashKey = shard['HashKeyRange']['StartingHashKey']
EndHashKey = shard['HashKeyRange']['EndingHashKey’]
NewHashKey = (long(EndHashKey) - long(StartHashKey))/2
print "StartHashKey : ", StartHashKey
print "EndHashKey : ", EndHashKey
print "NewHashKey : ", str(NewHashKey)
ret = conn.split_shard(stream_name,targetShard,str(NewHashKey))
Botoを利用した例:1Stream1Shardを半分に分割
StartHashKey : 0
EndHashKey : 340282366920938463463374607431768211455
NewHashKey : 170141183460469231731687303715884105727
上記、実行例)
68. MergeShards API
• MergeShards APIでは、基とするShardとマージされるShardを指定する。
conn = KinesisConnection()
conn.merge_shards(stream_name,targetShard, mergedShard)
Botoを利用した例
69. Amazon Kinesis Scaling Utils
• コマンドラインでShardの管理ができるツール
– https://github.com/awslabs/amazon-kinesis-scaling-utils
java -cp KinesisScalingUtils.jar-complete.jar -Dstream-name=MyStream -Dscaling-
action=scaleUp -Dcount=10 -Dregion=ap-northeast-1 ScalingClient
Options:
stream-name – ストリーム名
scaling-action – スケールアクション "scaleUp”, "scaleDown" or “resize"
count – シャード数
pct – 既存シャードに対する増加減数(%)
region – リージョン
shard-id – ターゲットとするシャードID
86. MediaMath様 (Marketing Tech )
• 毎日1,200億のイベント
• 最高毎秒2million event
• 30+のAd exchange
• 30 ms avg response time
• 毎日3TB(圧縮後)
MediaMath様のFirehoseと呼ばれる複数の
Kinesis Streamを使い、バッチとリアルタイ
ム処理を実施
87. DataXu様 ( Digital AdTech )
• リアルタイムビディングデータのパイプラインとプロセシング
• ペタバイトスケール
• 毎秒120万リクエスト
• 継続的オフライン学習、リアルタイム予測継続的にアルゴリズムを改善
• 複数のプロセシングフレームワーク (The right tool for the right job)
• データはビッドの確認情報, 詐欺行為レコードなど
• すべてのデータはS3に保存
96. 参考資料
• Amazon Kinesis API Reference
– http://docs.aws.amazon.com/kinesis/latest/APIReference/Welcome.html
• Amazon Kinesis Developer Guide
http://docs.aws.amazon.com/kinesis/latest/dev/introduction.html
• Amazon Kinesis Forum
https://forums.aws.amazon.com/forum.jspa?forumID=169#