AWS Black Belt Techシリーズ Amazon Kinesis

10,459 views

Published on

AWS Black Belt Tech Webinar 2014
(旧マイスターシリーズ)

Amazon Kinesis

Published in: Technology

AWS Black Belt Techシリーズ Amazon Kinesis

  1. 1. Amazon Kinesis AWS Black Belt Tech Webinar 2015 パートナーソリューションアーキテクト 榎並 利晃
  2. 2. Agenda • Kinesisを取り巻く環境 • Kinesis概要 • データの入力 • データの取得と処理 • Kinesisの運用 • サンプルアーキテクチャ • 事例 • まとめ
  3. 3. Kinesisを取り巻く環境
  4. 4. 多様で大量なデータとスピーディなビジネスニーズ M2M センサー オープンデータ IoT Web Logs リアルタイムにデータを処理する基盤に対する期待! POS Data
  5. 5. 例えば、こんなユースケース サービスやシステムの リアルタイム状況把握 • キャンペーンの状況 把握 • ゲーム内イベントの 状況把握 • POSデータからの売 上状況把握 異常検知 • センサーの異常検知 • 不正アクセス検知 サービス向上 • ソーシャルデータを 用いたリアルタイム サービス • 直近の行動に基にし たリコメンデーショ ン
  6. 6. AWSでの例:迅速かつ正確なメータリング情報の集計 毎秒数千万レ コードの利用 データ 何十万ものデー タソース 毎時数テラバイ トのデータ 毎日 100以上の ETL Job起動 毎時 100以上の クエリー • 求められるリアルタイムアラートの要求 • スケール出来る構造への変更 Kinesis
  7. 7. 典型的なデータフローとIngestレイヤの重要性 Client/Sen sor Ingest Processin g Storage Analytics + Visualization + Reporting
  8. 8. Ingest Layerの重要性 構造の異なるデータソースに対する高速処理 • 耐障害性とスケールに対する考慮 • 高い信頼性の維持 • 順序性 ランダムにくるデータをまとめて、シーケンスストリームの形に変換 • シーケンスデータによる容易な処理の実現 • 容易なスケール • 永続化データ Processing Kafka Or Kinesis Processing Kinesis
  9. 9. Amazon Kinesis概要
  10. 10. Amazon Kinesisとは? • ハイボリュームな連続したデータをリアルタイム で処理可能なフルマネージドサービス • Kinesisは、数十万のデータソースからの1時間辺 り数テラバイトのデータを処理することができ、 かつ、格納されたデータは、複数のAZに格納する 信頼性と耐久性をもつサービス
  11. 11. 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
  12. 12. Bigdataソリューションの分類 DynamoDB RedshiftRDS EMR クエリー タイプ バッチタイプ (Map-Reduce) ストリーム タイプ Kinesis 半構造化されたデータに 対してデータ処理を数回 実行 事前処理なしで実行 半構造化データをストリー ムで処理 シンプルなデータ処理 他システムへのデータ転送 構造化されたデータに対 してクエリー処理を繰り 返し実行可能 大量データに対するイン デックス処理を事前行う
  13. 13. Kinesis概要 AWS SDK LOG4J Flume Fluentd Get* APIs Kinesis Client Library + Connector Library Apache Storm Amazon Elastic MapReduce データ入力側 データ処理側
  14. 14. Kinesis構成内容 Data Sources App.4 [Machine Learning] App.1 [Aggregate & De-Duplicate] Data Sources Data Sources Data Sources App.2 [Metric Extraction] S3 DynamoDB Redshift App.3 [Real-time Dashboard] Data Sources Availability Zone Shard 1 Shard 2 Shard N Availability Zone Availability Zone Kinesis AWSEndpoint • 用途単位でStreamを作成し、Streamは、1つ以上のShardで構成される • Shardは、データ入力側 1MB/sec, 1000 TPS、データ処理側 2 MB/sec, 5TPSのキャパシティを持つ • 入力するデータをData Recordと呼び、入力されたData Recordは、24 時間かつ複数のAZに保管される • Shardの増加減によってスケールの制御が可能 Stream
  15. 15. セットアップとモニタリング • Management Console/APIで簡単セットアップ Stream名とShard数を入力して Streamが作成できる。 キャパシティ、レイテン シーをモニタリング。 Cloud Watchで監視も可能
  16. 16. Kinesisコスト 従量課金 & 初期費用不要 課金項目 単価 シャード利用料 $0.0195/shard/時間 PUT Payload Unit トランザクション $0.0215/100万Put • PUT Payload Unitは、25KB • シャード1つで、一ヶ月約$14 • Getトランザクションは無料 • インバウンドのデータ転送料は無料 • アプリケーションが走るEC2は通常の料金がかかります
  17. 17. データ入力
  18. 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. 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):
  20. 20. データ入力イメージ Stream Shard-0 Shard-1 Data Record Data Record Data Record Data Recordに設定されたパーティションキーを基にShard に分配 DataRecordの中身 データブロブ (Max 1M) パーティ ションキー (Max 256B) 2015/06/03 Recordサイズが50kから1Mに拡張
  21. 21. データ入力及び分配イメージ • DataRecordに設定されたパーティションキーを基にShardに分配 • Shardは担当するレンジを持ち、パーティションキーをMD5でハッシュ化 した値によって該当のShardに分配される 0 2128 Shard-1 MD5(パーティションキー) Shard-0 データ パーティション キー 値によりどちら かに分配 0 2127
  22. 22. パーティションキーについてのTips • パーティションキーを基にshardに分配される • Shardにはキャパシティがある パーティションキーの数 > shardの数 カーディナリティーの高いパーティションキー を使う
  23. 23. shard シーケンス番号 • KinesisがStream内でユニークなシーケンス番号を付与 • データもシーケンス番号も不変 • シーケンス番号でデータが何回でも取得できる(24時間以内) • 何度取得してもシーケンス番号の順番はかわらない SeqNo (14) SeqNo (17) SeqNo (25) SeqNo (26) SeqNo (32)
  24. 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)
  25. 25. データ入力パターン分類 パターン ユースケース 既存ログ収集パターン 既存あるWebサーバやアプリサーバのログを入力するパターン センサーログ収集パターン センサーが収集したデータを入力するパターン モバイルアプリデータ収集パ ターン モバイルアプリが生み出すデータ(ログ、メッセージなど)を入 力するパターン
  26. 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. 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. 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ブローカー
  29. 29. データの取得と処理
  30. 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
  31. 31. GetShardIteratorでのデータ取得指定方法 • GetShardIterator APIでは、ShardIteratorTypeを指定してポジションを取得 する。 • ShardIteratorTypeは以下の通り – AT_SEQUENCE_NUMBER ( 指定のシーケンス番号からデータ取得 ) – AFTER_SEQUENCE_NUMBER ( 指定のシーケンス番号以降からデータ取得 ) – TRIM_HORIZON ( Shardにある最も古いデータからデータ取得 ) – LATEST ( 最新のデータからデータ取得 ) Seq: xxx LATEST AT_SEQUENCE_NUMBER AFTER_SEQUENCE_NUMBER TRIM_HORIZON GetShardIteratorの動作イメージ
  32. 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. 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; } } }
  34. 34. Kinesis Client Libraryの動き Stream Shard-0 Shard-1 Kinesis アプリケーション (KCL) ワーカー シーケンス番号 Instance A 12345 Instance A 98765 Data Record (12345) Data Record (24680) Data Record (98765) DynamoDB Instance A 1. Kinesis Client LibraryがShardからData Recordを取得 2. 設定された間隔でシーケンス番号をそのワーカーのIDをキーにした DynamoDBのテーブルに格納 3. 1つのアプリが複数Shardからデータを取得し処理を実行 (*)実際のKey, Attribute名は異なります。
  35. 35. Kinesis Client Libraryの動き Stream Shard-0 Shard-1 Kinesis アプリケーション (KCL) ワーカー シーケンス番号 Instance A 12345 Instance B 98765 Data Record (12345) Data Record (24680) Data Record (98765) DynamoDB Instance A Kinesis アプリケーション (KCL) Instance B 1. 複数アプリを実行した場合は、負荷分散される (*)実際のKey, Attribute名は異なります。
  36. 36. Kinesis Client Libraryの動き Stream Shard-0 Shard-1 Kinesis アプリケーション (KCL) ワーカー シーケンス番号 Instance A ↓ Instance B 12345 Instance B 98765 Data Record (12345) Data Record (24680) Data Record (98765) DynamoDB Instance A Kinesis アプリケーション (KCL) Instance B Instance Aがデータ取得されない状況を検知し、Instance Bが、DynamoDBに 格納されているシーケンス番号からデータ取得を行う (*)実際のKey, Attribute名は異なります。
  37. 37. Kinesis Client Libraryの動き–拡張性 Stream Shard-0 Kinesis アプリケーション (KCL) Shard ワーカー シーケンス 番号 Shard-0 Instance A 12345 Shard-1 Instance A 98765 Data Record (12345) Data Record (24680) DynamoDB Instance A Shard-1を増やしたことを検知し、データ取得を開始し、Shard-1のチェックポ イント情報をDynamoDBに追加 Shard-1 Data Record (98765) New (*)実際のKey, Attribute名は異なります。
  38. 38. 目的に応じてKinesisアプリケーションを 追加可能 ストリーム シャード シャード データ レコード (12345) データ レコード (98765) データ レコード (24680) データ レコード (12345) データ レコード (98765) データ レコード (24680) アーカイブアプリ (KCL) DynamoDB Instance A Shard ワーカー シーケンス 番号 Shard-0 Instance A 12345 Shard-1 Instance A 98765 集計アプリ (KCL) Instance A Shard ワーカー シーケンス 番号 Shard-0 Instance A 24680 Shard-1 Instance A 98765 各アプリ毎に別テーブルで管理される Archive Table Calc Table
  39. 39. Kinesis Client Library (KCL)対応言語 • Java • Node.js • .Net • Python 複数の言語でビジネスロジックを記述し、KCLのMultiLangDaemonが Kinesisとのやりとりを行う。
  40. 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. 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. 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. 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. 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. 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
  46. 46. Kinesisアプリケーションの運用 • AutoScaling • アプリケーションをモニター – KCLメトリック • シャードごとのメトリック • プロセシングのレイテンシー • Record数・スループット • 関連するサービスのモニター – DynamoDBなどのリトライの数、レーテンシー • CloudWatchコンソール • トラブルシューティング – アプリケーションが遅延してる場合は「MillisBehindLatest」を確認
  47. 47. データ処理デザインパターン
  48. 48. 【前提】データ処理デザインパターン • データ処理を行うアプリケーション側でリカバリーやロードバランシン グを考慮した設計が必要 • Kinesisの特徴であるシリアル番号を利用しチェックポイントを打つこと が重要 • 1つのデータを複数のアプリケーションで利用できるためアプリケー ション毎に追加・削除できる設計 • 本番データを用いて開発中のロジックの評価や複数のロジックを同じ データを用いて評価することが可能 データ ソース ロジック A ロジック BSeqNo (14) SeqNo (17) SeqNo (25) SeqNo (26) SeqNo (32)
  49. 49. データ処理パターン分類 分類 ユースケース 基本構成パターン Kinesisアプリケーションを構成する基本的なパターン Simple ETL処理パターン KinesisでIngestされたデータをS3、DynamoDB、Redshiftにアーカイブするパ ターン - フィルタリング+データアーカイブ ETL/MapReduce処理パターン KinesisでIngestされたデータをHadoop、Spark、Storm を用いてデータ処理するパターン - データクレンジング - ETL+簡易集計 Filterパターン 複数のKinesisをパイプラインのようにつなぎあわせてFiltering/MapReduceを行 うパターン - フィルタリング - ロジックルーティング 機械学習インテグレーションパターン オンラインとオフラインを組み合わせた機械学習インテグレーションパターン − 異常検知、リコメンデーション
  50. 50. 基本構成パターン • 目的毎にアプリケーションを構成するパターン • KCLを用いることで可用性の高いアプリの導入が可能 • それぞれのアプリの可用性・信頼性に合わせた設計 • 本番システムに影響されず開発検証のためにデータを利用することも可能 センサー センサー センサー アプリ2 Dashboardアプリ1 Redshift DynamoDB 例:リアルタイムダッシュボード
  51. 51. Simple ETL処理パターン • DynamoDB、Redshift、S3などとのインテグレーションを容易にするKinesis Connector Libraryを利用可能 https://github.com/awslabs/amazon-kinesis-connectors センサー センサー センサー Redshift データロード S3 アーカイブ S3
  52. 52. • Data Recordの取得、変換、フィルタ、バッファ、書き出しを簡単に実装できる。 ITransformer •Kinesisか らユーザが 使いやすい モデルへの 変換 IFilter •データのフィ ルタリング。 フィルタリン グして残った ものがバッ ファーへ行く IBuffer •指定のレコー ド数か、バイ ト数までバッ ファー IEmitter •他AWS サービスの コール実施 S3 DynamoDB Redshift Kinesis Kinesis Connector Library ElasticSearch
  53. 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に対して書き込み
  54. 54. ETL/MapReduce処理パターン(1) • Hadoopを用いたパターン • Kinesisに集積されたデータをHive、PigなどのHadoopツールを用いてETL処理(Map Reduce 処理)が可能 • 別のKinesis Stream, S3, DynamoDB, HDFSのHive Tableなどの他のデータソースのテーブ ルとJOINすることなども可能 • Data pipeline / Crontabで定期実行することにより、定期的にKinesisからデータを取り込み、 処理することが可能 EMR AMI 3.0.4以上を用いることでKinesisインテグレーションが可能 EMR Cluster S3 Data Pipeline 構成例 DataPipelineで定期的にHiveを実 行しKinesisにあるデータを処理。 結果をS3に格納 Kinesis
  55. 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. 56. EMR Connector : Hive利用例 Hiveテーブル作成 Kinesis Streamを 指定 HQLの実行(例) 通常のHQLを実行するだけ。 内部的には、Kinesisからデー タを取得し、処理を行う
  57. 57. • 一度処理済みのデータをスキップするためにDynamoDBを使ってチェックポイントの管理さ れる • Data pipeline / Crontabで定期実行することにより、定期的にKinesisからデータを取り込 み、処理することが可能 EMR Connector : Hive利用例
  58. 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. 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. 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 (例)
  61. 61. 機械学習インテグレーションパターン • ストリーミングデータの分類、異常検知などを機械学習を用いて実行 • 機械学習への教師データの反映を定期的に実行 • 機械学習器は、Apache Spark、Apache Stormなどの上で機械学習アルゴ リズムを動作させインテグレーションすることも可能 Data Sources Data Sources Data Sources 機械学習 Jubatus Dashboar d アーカイブ 教師データ分析 例:オンライン機械学 習(Jubatus)の例
  62. 62. Amazon Kinesisの運用
  63. 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. 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. 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 分割
  66. 66. SpritShardとMergeShardsの運用例 • 取り扱うデータの特性に合わせてShardを運用する – Shardは時間単位で課金されるため無駄なく利用するためにSpritとMergeを行うことを 推奨 • 以下は、業務量が多くなる時間帯にShardを分割し、業務が一段落したら マージする例
  67. 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. 68. MergeShards API • MergeShards APIでは、基とするShardとマージされるShardを指定する。 conn = KinesisConnection() conn.merge_shards(stream_name,targetShard, mergedShard) Botoを利用した例
  69. 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
  70. 70. Amazon Kinesisの使いドコロ
  71. 71. SQSとKinesisの使い分け • Kinesisは、Pub-Subメッセージモデルを構築でき、Stream内でユニーク なシーケンス番号がDataRecordに付与されるためオーダ順に処理するこ とができる SQS 送信者 Worker Worker 単一の処理に対して複数のWorkerが処理 Kinesis 送信者 Worker A Worker B 目的に応じたWorker(Kinesisアプリ) が同一の送信者のデータを利用可能
  72. 72. リアルタイムダッシュボード • Webログ、センサーデータなどのリアルタイム情報の可視化用途 • 短期状況の可視化だけでなく長期分析にデータを流す センサー センサー センサー Kinesis App [アーカイブ] Dashboard Kinesis App [集計、異常検 知など] Redshift DynamoDB
  73. 73. ETL処理 ログ ログ ログ • 後続に続くデータ処理の事前処理として利用 Kinesis App [ETL処理] S3 EMR
  74. 74. バッファー Data Sources Data Sources Data Sources Kinesis App [Worker] • 大量データの一次バッファとして利用 • SQSでも同様の構成を構築可能 • Workerの部分にStormを配備する組み合わせも可能 Kinesis App [Worker]
  75. 75. 事例紹介
  76. 76. あきんどスシロー様
  77. 77. JMAS様 アプリの Beacon 対応を簡単・迅速に実現する 法人向けクラウドサービスであるBeacappをAWSを使って実現 設備管理や点検に 出退勤,受付,予約に 行動解析,状況把握に エリア限定の 機能制限に ショールーム等の 自動ガイドに 施錠,照明,空調管理に
  78. 78. ネビラボ様
  79. 79. Ripplation様 クロスプラットフォームデータ収集
  80. 80. 株式会社イー・エージェンシー様 Audienceデータをリアルタイムに収集・処理する解析基盤にAmazon Kinesisを利用 用途に応じて、アプリケーションを追加していく Agilityが高いアーキテクチャを実現 エンジニア2名:4ヶ月で構築 マネージドサービスとSDKを 利用することで圧倒的な早さ で開発を実現。運用の手間な く開発にフォーカスでき、ア プリケーションエンジニアの みでサービスを構築。
  81. 81. ガリバー様 Drive+
  82. 82. Pencil様 • Kinesisを利用したリアルタイムユーザーモニター • Kinesisで構想が現実に。開発にかかった時間は1/4以下 – http://www.pencil.co.jp/newsrelease/2014070200001.html
  83. 83. スマートインサイト様 センサー、モバイルデバイス、ログサーバーなど非常に膨大なデータを業務 上意味のある情報にするためのSMART/InSight Cloud Real Time M2M Analyticsを開発!  Phase I 消費者の店舗内行動の可視化  Phase II 店長へのセンターからの指示  Phase III ダイレクトなコンシューマへのアプローチ展開 Platform for Customer Behavior Analytics Pushing recommendation Kinesis 入店検知 位置情報特定 滞在時間など 大規模レコメンデーション ネット ショップ 購買履歴 店舗 購買履歴 各種カー ド会員情 報 レコメンドのプッシュな ど iBeacon パートナー協業による拡張
  84. 84. イベント会場での騒音チェック 騒音 センサー ぷらっとホーム社 OpenBlocks IoT BX1 認証: Amazon Cognito データ収集: Amazon Kinesis レポート登録 - 通知 - ワークフロー イベントエンジン: AWS Lambda リアルタイムモニタ: Amazon EC2 カスタマイズビュー 3日間:約259,200レコード
  85. 85. Supercell様
  86. 86. MediaMath様 (Marketing Tech ) • 毎日1,200億のイベント • 最高毎秒2million event • 30+のAd exchange • 30 ms avg response time • 毎日3TB(圧縮後) MediaMath様のFirehoseと呼ばれる複数の Kinesis Streamを使い、バッチとリアルタイ ム処理を実施
  87. 87. DataXu様 ( Digital AdTech ) • リアルタイムビディングデータのパイプラインとプロセシング • ペタバイトスケール • 毎秒120万リクエスト • 継続的オフライン学習、リアルタイム予測継続的にアルゴリズムを改善 • 複数のプロセシングフレームワーク (The right tool for the right job) • データはビッドの確認情報, 詐欺行為レコードなど • すべてのデータはS3に保存
  88. 88. Ad Profile DB GREE: Multiplatform Gaming • イベントのサイズは1KB • 毎日5億のイベント • 毎日5GBのデータ(ピーク1TB)
  89. 89. Kinesisの使いドコロ
  90. 90. SQSとKinesisの使い分け • Kinesisは、Pub-Subメッセージモデルを構築でき、Stream内でユニーク なシーケンス番号がDataRecordに付与されるためオーダ順に処理するこ とができる SQS 送信者 Worker Worker 単一の処理に対して複数のWorkerが処理 Kinesis 送信者 Worker A Worker B 目的に応じたWorker(Kinesisアプリ) が同一の送信者のデータを利用可能
  91. 91. リアルタイムダッシュボード • Webログ、センサーデータなどのリアルタイム情報の可視化用途 • 短期状況の可視化だけでなく長期分析にデータを流す センサー センサー センサー Kinesis App [アーカイブ] Dashboard Kinesis App [集計、異常検 知など] Redshift DynamoDB
  92. 92. ETL処理 ログ ログ ログ • 後続に続くデータ処理の事前処理として利用 Kinesis App [ETL処理] S3 EMR
  93. 93. バッファー Data Sources Data Sources Data Sources Kinesis App [Worker] • 大量データの一次バッファとして利用 • SQSでも同様の構成を構築可能 • Workerの部分にStormを配備する組み合わせも可能 Kinesis App [Worker]
  94. 94. まとめ
  95. 95. 簡単管理 リアルタイムストリーミング のデータ収集、処理のマネー ジド・サービス 簡単にStreamの構築が可能 リアルタイム ストリーミングタイプのビッ クデータの継続処理 数分・数時間のバッチ処理と 比較して数秒以内で処理でき る 伸縮自在 シームレスにスループット レートやボリュームを変える ことができる ビジネスニーズに合わせてス ケールのアップ・ダウンが変 更できる S3, Redshift, & DynamoDB インテグレーション データの収集、変換、処理し、 S3, Redshift及びS3に格納す ることが容易に可能 リアルタイム処理 アプリケーション Kinesis Client Libraryを用い ることで容易にリアルタイム ストリーミングデータの処理 の実装が可能 Low Cost あらゆる規模のワークロード に対してコスト効率が高い Amazon Kinesis 特徴まとめ
  96. 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#
  97. 97. Webinar資料の配置場所 • AWS クラウドサービス活用資料集 – http://aws.amazon.com/jp/aws-jp-introduction/

×