Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

AWS Black Belt Tech シリーズ 2015 - Amazon Kinesis

19.077 Aufrufe

Veröffentlicht am

AWS Black Belt Tech Webinar 2015
Amazon Kinesis

次回のWebinarは、下記よりご確認ください。
http://aws.amazon.com/jp/about-aws/events/#webinar

★AWS Black Belt Tech Webinarとは
AWSのソリューションアーキテクト、TechメンバがAWSのプロダクト/ソリューションを深堀りして解説し、参加されている皆さまからの質問にお答えする無料のWebinar(Webセミナー)です。
毎週水曜日(祝日などを除く)、日本時間の18:00から約1時間にわたってお送りしています。

Veröffentlicht in: Technologie
  • There is a useful site for you that will help you to write a perfect and valuable essay and so on. Check out, please ⇒ www.HelpWriting.net ⇐
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
  • I'd advise you to use this service: ⇒ www.WritePaper.info ⇐ The price of your order will depend on the deadline and type of paper (e.g. bachelor, undergraduate etc). The more time you have before the deadline - the less price of the order you will have. Thus, this service offers high-quality essays at the optimal price.
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
  • Writing a good research paper isn't easy and it's the fruit of hard work. For help you can check writing expert. Check out, please ⇒ www.HelpWriting.net ⇐ I think they are the best
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
  • Dating for everyone is here: ♥♥♥ http://bit.ly/369VOVb ♥♥♥
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
  • Sex in your area is here: ❤❤❤ http://bit.ly/369VOVb ❤❤❤
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier

AWS Black Belt Tech シリーズ 2015 - Amazon Kinesis

  1. 1. Amazon Kinesis AWS Black Belt Tech Webinar 2015 パートナーソリューションアーキテクト 榎並 利晃
  2. 2. Agenda • Kinesis概要 • データの入力 • データの取得と処理 • Kinesisの運用 • まとめ • 補足資料: 事例紹介 2
  3. 3. Agenda • Kinesis概要 • データの入力 • データの取得と処理 • Kinesisの運用 • まとめ • 補足資料: 事例紹介 3
  4. 4. Amazon Kinesis概要 4
  5. 5. Amazon Kinesisとは? • ハイボリュームな連続したデータをリアルタイ ムで集計・変換などの処理を可能にするフルマ ネージドサービス • Kinesisは、数十万のデータソースからの1時間 辺り数テラバイトのデータを処理することがで き、かつ、格納されたデータは、複数のAZに格 納する信頼性と耐久性をもつサービス 5
  6. 6. AWS のビッグデータ・プラットフォーム S3 Kinesis DynamoDB AWS Lambda KCL Apps EMR EMR Redshift Machine Learning Collect Process Analyze Store Data Collection and Storage Data Processing Event Processing Data Analysis 6
  7. 7. データのタイプ ファイル: media, log files (sets of records) ストリーム: records (eg: device stats) トランザクション: DBへのRead/Write 7
  8. 8. データのタイプ と AWSサービス S3 Kinesis DynamoDB 8
  9. 9. Kinesis概要 データ入力側 データ処理側 HTTP Post AWS SDK LOG4J Flume Fluentd Get* APIs Kinesis Client Library + Connector Library Apache Storm Amazon Elastic MapReduce AWS Mobile SDK Apache Spark Streaming 9 Kinesis Producer Library
  10. 10. 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 10
  11. 11. セットアップとモニタリング • Management Console/APIで簡単セットアップ Stream名とShard数を入力して Streamが作成できる。 キャパシティ、レイテン シーをモニタリング。 Cloud Watchで監視も可能 11
  12. 12. Kinesisコスト 従量課金 & 初期費用不要 課金項目 単価 シャード利用料 $0.0195/shard/時間 PUT Payload Unit トランザクション $0.0215/100万Put • PUT Payload Unitは、25KB • シャード1つで、一ヶ月約$14 • Getトランザクションは無料 • インバウンドのデータ転送料は無料 • アプリケーションが走るEC2は通常の料金がかかります アップデートあり (※)東京リージョンの費用(2015年8月時点) 12
  13. 13. データ入力 13
  14. 14. データ入力方法 • 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): 14
  15. 15. データ入力方法 $ 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): 15
  16. 16. データ入力イメージ 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に拡張 アップデートあり 16
  17. 17. データ入力及び分配イメージ • DataRecordに設定されたパーティションキーを基にShardに分配 • Shardは担当するレンジを持ち、パーティションキーをMD5でハッシュ化 した値によって該当のShardに分配される 0 2128 Shard-1 MD5(パーティションキー) Shard-0 データ パーティション キー 値によりどちら かに分配 0 2127 17
  18. 18. パーティションキーについてのTips • バッファとしてKinesisを利用する場合 – パーティションキーの数 > shardの数 – カーディナリティーの高いパーティションキーを使う 18 • Streaming Map ReduceとしてKinesisを利用する場合 – パーティションキーに意味を持たせてShardを振り分ける Data Shard-0 Shard-1 Data DataData 均等に振り分け 共通処理 共通処理 Data Shard-0 Shard-1 Data DataData 意味に応じて振り分け 処理A 処理B
  19. 19. shard シーケンス番号 • KinesisがStream内でユニークなシーケンス番号を付与 • データもシーケンス番号も不変 • シーケンス番号でデータが何回でも取得できる(24時間以内) • 何度取得してもシーケンス番号の順番はかわらない SeqNo (14) SeqNo (17) SeqNo (25) SeqNo (26) SeqNo (32) 19
  20. 20. その他Tips • ExplicitHashKeyの使い方 – Partition Keyを使わずExplicitHashKeyを使って明示的にShardの振り分けができる 20 • SequenceNumberForOrderingの使い方 – SequenceNumberForOrdering パラメーターを使用すると、同じクライアントが PutRecord を呼 び出したときに、パーティションキーが同じであっても、シーケンス番号は厳密に大きくなるように なります。SequenceNumberForOrdering を使用しても、複数の同時実行のアプリケーションから 追加されたレコード間、または複数のパーティションキー間では、順序が正しくなるとは限りません。 [ CLIの例] % aws kinesis put-record --stream STREAM --data "shardId-000000000000" --partition-key test { "ShardId": "shardId-000000000000", "SequenceNumber": "49553779153805478375276164659904167464197973775715663986" } % aws kinesis put-record --stream STREAM --data "shardId-000000000007" --partition-key test --explicit-hash-key 170141183460469231731687303715884105728 { "ShardId": "shardId-000000000001", "SequenceNumber": "49553779153827779120474695283200445687381298107557871746" } Partition keyだけを指定 した場合は、Kinesisが自 動的にハッシュ値を使っ てShardに振り分け 明示的に別なShardの ハッシュ値を指定してい するとその値を優先して 振り分ける
  21. 21. その他Tips • PutRecords API – レコード数は、500レコードまで格納してコールすることが可能 – 但し、Shardの上限(put 1000 レコード/秒/shard)に注意 – レスポンスにそれぞれのレコードに対する結果が返ってくるため、正常終了されているかを ループ処理などで確認すること { "FailedRecordCount”: 1, "Records": [ { "SequenceNumber": "21269319989900637946712965403778482371", "ShardId": "shardId-000000000001" }, { “ErrorCode":”ProvisionedThroughputExceededException”, “ErrorMessage": "Rate exceeded for shard shardId-000000000001 in stream exampleStreamName under account 111111111111." }, { "SequenceNumber": "21269319989999637946712965403778482985", "ShardId": "shardId-000000000002" } ] } 例)PutRecords Response 21
  22. 22. データ入力 エコシステム 22
  23. 23. 主なツール一覧 • Amazon Kinesis Producer Lib • Fluentd for Amazon Kinesis • MQTT-Kinesis Bridge その他にもツールがありますので以下をご確認ください。 https://aws.amazon.com/kinesis/developer-resources/ 23
  24. 24. Kinesis Producer Library: KPL • Kinesisにデータを送信する補助ライブラリ • KPL は、C++ で書かれており、メインプロセスの子プロセスとして実行されます。 [ドキュメント] http://docs.aws.amazon.com/ja_jp/kinesis/latest/dev/developing-producers-with-kpl.html https://blogs.aws.amazon.com/bigdata/post/Tx3ET30EGDKUUI2/Implementing-Efficient-and-Reliable- Producers-with-the-Amazon-Kinesis-Producer-L <特徴> 1. 1つのレコードにユーザデータを集約 2. レコードを束ねてputRecordsの形に自動変換 3. 非同期実行 <サポートプラットフォーム> • カーネルバージョン 2.6.18(2006 年 9 月)の Linux ディストリビューション • Apple OS X 10.9 以降 • Windows Server 2008 以降 KPL は、64 ビット版のみ 24 KPLの集約機能を利用するためにはあとで説明するKCLのバージョンを 1.4以上にする必要があります。 使用するバージョンなどは以下のサイトご覧ください。 http://docs.aws.amazon.com/ja_jp/kinesis/latest/dev/kinesis-kpl- integration.html
  25. 25. Fluent Plugin for Amazon Kinesis • Kinesisへデータを投入してくれるfluentdのoutputプラグイン • https://github.com/awslabs/aws-fluent-plugin-kinesis • Fluentdをログ収集に使っている環境下なら、このプラグインを追加する だけでKinesisへのデータ投入ができる! $ gem install fluent-plugin-kinesis $ vi fluentd.conf <match YOUR.TAG> type kinesis stream_name YOUR_STREAM_NAME region ap-northeast-1 flush_interval 1 random_partition_key </match> $ fluentd –c fluentd.conf 25
  26. 26. MQTT Broker Kinesis-MQTT Bridge MQTT-Kinesis Bridge • センサーデバイスなどライトウェイトなプロトコル(MQTT)を利用し、データを アップロードする場合に利用 • EC2上に本MQTT Bridgeをデプロイして利用。 • GithubからMQTT-Kinesis Bridgeサンプルソースが取得可能 https://github.com/awslabs/mqtt-kinesis-bridge MQTT Broker Kinesis-MQTT Bridge センサー センサー センサー Auto scaling Group 26
  27. 27. データの取得と処理 27
  28. 28. データ取得方法 • 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 28
  29. 29. 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の動作イメージ 29
  30. 30. Kinesis Client Library (KCL) Client library for fault-tolerant, at least-once, Continuous Processing • Shardと同じ数のWorker • Workerを均等にロードバランシング • 障害感知と新しいWorkerの立ち上げ • シャードの数に応じてworkerが動作する • AutoScalingでエラスティック • チェックポインティングとAt least once処理 これらの煩雑な処理を意識することなく ビジネスロジックに集中することができる。 30
  31. 31. 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; } } } 31
  32. 32. 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名は異なります。 32
  33. 33. 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 同一アプリを複数インスタンスで実行した場合は、負荷分散される (*)実際のKey, Attribute名は異なります。 33
  34. 34. 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名は異なります。 34
  35. 35. 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名は異なります。 35
  36. 36. 目的に応じて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 36
  37. 37. Kinesis Client Library (KCL)対応言語 • Java • Node.js • .Net • Python 複数の言語でビジネスロジックを記述し、KCLのMultiLangDaemonが Kinesisとのやりとりを行う。 37
  38. 38. MultiLangDaemonについて • KCL for Python/Node.js/.Netは、KCL for Javaの“MultiLangDaemon” を常駐プロセスとして利用し、データ処理のメインロジックを各種言語 で記述できるライブラリ • データ処理は、サブプロセスとして起動される • “MultiLangDaemon”とサブプロセス間のデータ通信は、定義されたプロ トコルでSTDIN/STDOUTを使って行われる KCL(Java) Shard-0 Shard-1 Worker Thread Worker Thread Python Logic Process Python Logic Process 【Pythonの例】 38
  39. 39. 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() 39
  40. 40. 【参考情報】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" 40
  41. 41. 【参考情報】 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の最大スレッド数 41
  42. 42. 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 が実行されます42
  43. 43. KCLが使用するリソース • DynamoDB – チェックポイントの情報などのステート管理 – デフォルトでRead/WriteのProvisioned Throughputが10 で作成される • http://docs.aws.amazon.com/kinesis/latest/dev/kinesis- record-processor-ddb.html • Cloudwatch – KCLアプリケーションのカスタムメトリックス – 取得できるメトリックスは以下を確認してください • http://docs.aws.amazon.com/kinesis/latest/dev/monitori ng-with-kcl.html 43
  44. 44. Kinesisアプリケーションの運用 • AutoScaling • アプリケーションをモニター – KCLメトリック • シャードごとのメトリック • プロセシングのレイテンシー • Record数・スループット • 関連するサービスのモニター – DynamoDBなどのリトライの数、レーテンシー • CloudWatchコンソール • トラブルシューティング – アプリケーションが遅延してる場合は「MillisBehindLatest」を確認 44
  45. 45. データ処理 基本デザイン 45
  46. 46. 基本デザイン 1/2 データ ソース ロジック A ロジック BSeqNo (14) SeqNo (17) SeqNo (25) SeqNo (26) SeqNo (32) 46 データ処理を行うアプリケーション側でリカバリーやロードバランシング を考慮した設計が必要 Kinesisの特徴であるシリアル番号を利用しチェックポイントを打つことが 重要 1つのデータを複数のアプリケーションで利用できるためアプリケーショ ン毎に追加・削除できる設計 本番データを用いて開発中のロジックの評価や複数のロジックを同じデー タを用いて評価することが可能
  47. 47. 基本デザイン 2/2 Shardのキャパシティを意識する • Kinesisからのデータ読み出しは、5TPSか2MBps • Kinesisにデータが書き込まれてから24時間はShardから読み出し可能 • ただし、Shardのキャパシティ(5TPSか2MBps)を超えて配置する場合は、ウ エイトをいれる、または、Shardを増やす必要がある データ ソース アプリA アプリB キャパシティを超えてアクセスす るとProvision Throughput Exceed Exceptionになる。
  48. 48. 基本構成パターン例 センサー センサー センサー アプリ2 Dashboardアプリ1 Redshift DynamoDB 48
  49. 49. データ処理 パターン 49
  50. 50. データ処理パターン 50 • Kinesis Connector Library • AWS Lambda • Amazon EMR Integration – Hadoop • Amazon EMR Integration – Spark • Apache Storm Integration • その他
  51. 51. Kinesis Connector Library 51
  52. 52. • Data Recordの取得、変換、フィルタ、バッファ、書き出しを簡単に実装できるJava のライブラリ。 • KCLを利用しているため、Workerの可用性などはKCLにお任せ。 ITransformer •Kinesisか らユーザが 使いやすい モデルへの 変換 IFilter •データのフィ ルタリング。 フィルタリン グして残った ものがバッ ファーへ行く IBuffer •指定のレコー ド数か、バイ ト数までバッ ファー IEmitter •他AWS サービスの コール実施 S3 DynamoDB Redshift Kinesis Kinesis Connector Library ElasticSearch 52
  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に対して書き込み 53
  54. 54. Kinesis Connector LibraryでEmitできるサービス • S3 • DynamoDB • Redshift • Elasticsearch 1.2.1 54
  55. 55. Kinesis Connector Libraryに関するTips • Kinesis Connector Libでは最低限の実装のみ提供して いるため、要件に応じた実装が必要 – com.amazonaws.services.kinesis.connectors.interfaces内にあるイ ンタフェースに対する実装 – 例) • フィルタ – 標準では、IFilterの実装は、フィルタしないAllPassFilterのみ実装として提供 • S3 Emitter – バッファリングしたデータを1つのファイルとして指定したS3バケットの直下に Emitされます – 階層構造などをとる必要がある場合は、S3Emitter.javaを改修してご利用くださ い 55
  56. 56. 【参考情報】 Blog: CloudWatch Logs Subscription Consumer + Elasticsearch + Kibana Dashboards • VPC Flow LogをKinesis Connector Libraryを経由して Elasticsearch/Kinabaで可視化する方法の記事 – http://aws.typepad.com/aws_japan/2015/08/cloudwatch-logs-subscription- consumer-elasticsearch-kibana-dashboards.html 56 CloudWatch Logs Kinesis Kinesis Application VPC Flow Logs Elasticsearch Kibana
  57. 57. AWS Lambda 57
  58. 58. AWS Lambdaとは イベントをトリガーに独自コードをインフラを意識することなく実行 できるマネージドサービス AWSサービス / API からのイベント呼び出し コードの持ち込み オートスケール Node.js, Java データ ソース PullモデルでLamdaがデータ取得 詳細はこちら http://www.slideshare.net/AmazonWebServicesJapan/20150701-run-codeinthecloud 58
  59. 59. Kinesis WorkerとしてLambdaを利用する場合のTips • Shard Iterator Typeは、LatestかTrim horizonのみ指定可能 – LambdaのEvent Sourceの設定で指定 – シーケンス指定での実行ができないのでreplayしたい場合は、Trim horizonのみ – エラー発生時のリトライ処理は別な仕組みを合わせて検討が必要。例えば、シーケ ンス番号をSQSなどに格納するなど。 • Kinesisからのデータ取得の最適化は、Batch Sizeで実施。 – デフォルトは、100レコード – Lambdaでの処理内容に依存するが、レコード数が大きいほうが効率的に処理でき る • ShardのSplit, Mergeに追随してLambdaのWorkerが各 Shardからデータ取得を行い、処理してくれる 59
  60. 60. Amazon EMR - Hadoop 60
  61. 61. Amazon EMR - Hadoop • EMR AMI 3.0.4以上のバージョンからKinesis Integrationが可能 ■ 利用用途 • Kinesisに集積されたデータをHive、PigなどのHadoopツールを用いてETL処理(Map Reduce処理)が可能 • 別のKinesis Stream, S3, DynamoDB, HDFSのHive Tableなどの他のデータソースの テーブルとJOINすることなども可能 • Data pipeline / Crontabで定期実行することにより、定期的にKinesisからデータを取り 込み、処理することが可能 EMR Cluster S3 Data Pipeline 構成例 DataPipelineで定期的にHiveを実 行しKinesisにあるデータを処理。 結果をS3に格納 Kinesis 61
  62. 62. Amazon EMR - Hadoop 62 実行などは、以下のドキュメント・FAQサイトをみてください • ドキュメント – http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr- kinesis.html • FAQ – http://aws.amazon.com/elasticmapreduce/faqs/#kinesis-connector Kinesis Stream EMR Hive Table Data Storage Table Mapping (Hive利用例)
  63. 63. Amazon EMR – Hadoop : Hiveの例 Hiveテーブル作成 Kinesis Streamを 指定 HQLの実行(例) 通常のHQLを実行するだけ。 内部的には、Kinesisからデー タを取得し、処理を行う 63
  64. 64. • 一度処理済みのデータをスキップするためにDynamoDBを使ってチェックポイントの管理さ れる • Data pipeline / Crontabで定期実行することにより、定期的にKinesisからデータを取り込 み、処理することが可能 Amazon EMR – Hadoop : Hiveの例 64 [Provisioned Capacity] Read Capacity Units: j*s/5 Write Capacity Units: j*s (*) j = Num of Job, s = Num of Shard
  65. 65. Amazon EMR - Spark 65
  66. 66. Amazon EMR - Spark EMR Cluster Amazon Kinesis センサデータ PutRecords() Data Sources DStream Spark SQL Spark Shell http://spark.apache.org/docs/latest/streaming-kinesis-integration.html66 • Apache SparkをEMRクラスタ上に構築し、Kinesisのデータを収集・処理する • Apache Spark 1.2.0以上からKCLが実装。 • EMR 4.0.0にApache Spark1.4.1が同梱 ( 2015年8月時点 ) • Spark Streamingでデータ処理を実装
  67. 67. Apache Storm 67
  68. 68. Apache Storm Integration • 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
  69. 69. 【参考】Apache Storm Integration AWS Bigdata Blog: • Amazon KinesisとApache Stormを使ったリアルタイムスライディン グウィンドウの実装について記述されている https://blogs.aws.amazon.com/bigdata/post/Tx36LYSCY2R0A9B/Implemen t-a-Real-time-Sliding-Window-Application-Using-Amazon-Kinesis-and- Apache 69
  70. 70. その他のパターン 70
  71. 71. 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 (例)
  72. 72. Presto-Amazon Kinesis connector by Qubole • KinesisのStreamに対 して直接PrestoのSQL を実行できる – QuboleというPresto as a Serviceなら簡単に設 定可能 • チェックポイントを 使ってリアルタイム検 出やダッシュボード等 http://aws.typepad.com/sajp/2015/07/presto-amazon-kinesis-connector-for-interactively-querying-streaming- data.html 72
  73. 73. Amazon Kinesisの運用 73
  74. 74. 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に成功したレコード数 74
  75. 75. 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% 75
  76. 76. 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 Availabilit y Zone Availabilit y Zone Shard -1 Shard -2 Shard -1 Shard -2 Shard -3 Shard -4 分割 76
  77. 77. SpritShardとMergeShardsの運用例 • 取り扱うデータの特性に合わせてShardを運用する – Shardは時間単位で課金されるため無駄なく利用するためにSpritとMergeを行うことを 推奨 • 以下は、業務量が多くなる時間帯にShardを分割し、業務が一段落したら マージする例 77
  78. 78. 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 上記、実行例) 78
  79. 79. MergeShards API • MergeShards APIでは、基とするShardとマージされるShardを指定する。 conn = KinesisConnection() conn.merge_shards(stream_name,targetShard, mergedShard) Botoを利用した例 79
  80. 80. 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 80
  81. 81. まとめ 81
  82. 82. 簡単管理 リアルタイムストリーミング のデータ収集、処理のマネー ジド・サービス 簡単にStreamの構築が可能 リアルタイム ストリーミングタイプのビッ クデータの継続処理 数分・数時間のバッチ処理と 比較して数秒以内で処理でき る 伸縮自在 シームレスにスループット レートやボリュームを変える ことができる ビジネスニーズに合わせてス ケールのアップ・ダウンが変 更できる S3, Redshift, & DynamoDB インテグレーション データの収集、変換、処理し、 S3, Redshift及びS3に格納す ることが容易に可能 リアルタイム処理 アプリケーション Kinesis Client Libraryを用い ることで容易にリアルタイム ストリーミングデータの処理 の実装が可能 Low Cost あらゆる規模のワークロード に対してコスト効率が高い Amazon Kinesis 特徴まとめ
  83. 83. 参考資料 • 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# 83
  84. 84. Webinar資料の配置場所 • AWS クラウドサービス活用資料集 – http://aws.amazon.com/jp/aws-jp-introduction/ 84
  85. 85. 補足資料: 事例紹介 85
  86. 86. 株式会社サイバーエージェント様 KinesisをPipelineでつないでデータ運 搬フローの仕組みを実現し、収集基盤と 分析基盤を分離 KCLを使い、ETL処理やRTB配信などの リアルタイム処理を実現 86 http://media.amazonwebservices.com/jp/summit2015/docs/Dev-07d-Tokyo- Summit-2015.pdf リ アルタ イムな処理と バッ チ処理 ~ Overview ~ A d v e r tis in g S ite Tr a c k in g A d Tr a c k in g f eed b a ck f eed b a ck ca m p a ig n m a n a g em en t x rep o rtin g f o r A d vertiser Ru n n in g Sp a rk w ith YA RN o n EM R Clu ster リ アルタ イムデータ 処理アプリ ケーショ ンの導入例 a d -ca n d id a te co n su m er . . . a d -strea m . . . . . . b id -strea m . . . b id -ca n d id a te co n su m er 複数のs tr e a m のデータ を使いたい状況でどう する? - a d -s tr e a m の流量は 2 ,0 0 0 r p s , s h a r d 数4 - b id -s tr e a m の流量は 4 0 ,0 0 0 r p s , s h a r d 数5 0 ca n d id a te co n su m er リアルタイムターゲティング広告の 配信・分析基盤にKinesisを利用
  87. 87. 株式会社イー・エージェンシー様 Audienceデータをリアルタイムに収集・処理する解析基盤にAmazon Kinesisを利用 用途に応じて、アプリケーションを追加していく Agilityが高いアーキテクチャを実現 エンジニア2名:4ヶ月で構築 マネージドサービスとSDKを 利用することで圧倒的な早さ で開発を実現。運用の手間な く開発にフォーカスでき、ア プリケーションエンジニアの みでサービスを構築。 87
  88. 88. あきんどスシロー様 88 回転すしのタグ情報をKinesisを経由してRedshiftに蓄積し、分析することで業務分 析に利用
  89. 89. Ripplation様 ゲームログなどクロスプラットフォームデータ 収集基盤にKinesisを利用 参考資料 http://media.amazonwebservices.com/jp/summit2015/docs/Dev-05s_01-Tokyo-Summit-
  90. 90. JMAS様 アプリの Beacon 対応を簡単・迅速に実現する 法人向けクラウドサービスであるBeacappをAWSを使って実現 設備管理や点検に 出退勤,受付,予約に 行動解析,状況把握に エリア限定の 機能制限に ショールーム等の 自動ガイドに 施錠,照明,空調管理に 90
  91. 91. ネビラボ様 14種類のセンサーを選択し、プラグインしたデバイスからMQTTブリッジを経由して Kinesisにデータを収集、DynamoDBなど他のAWSサービスを使ってセンサーデータ の保存・可視化に利用
  92. 92. イベント会場 騒音監視システム 騒音 センサー ぷらっとホーム社 OpenBlocks IoT BX1 認証: Amazon Cognito データ収集: Amazon Kinesis レポート登録 - 通知 - ワークフロー イベントエンジン: AWS Lambda リアルタイムモニタ: Amazon EC2 カスタマイズビュー 3日間:約259,200レコード92 イベント会場の騒音をセンサーを通してKinesisに収集、閾値を超えた場合、kintoneにお知らせ するデモシステム
  93. 93. Supercell様 93 https://aws.amazon.com/jp/solutions/case-studies/supercell/
  94. 94. MediaMath様 (Marketing Tech ) 規模 • 毎日1,200億のイベント • 最高毎秒2million event • 30+のAd exchange • 30 ms avg response time • 毎日3TB(圧縮後) MediaMath様のFirehoseと呼ばれる複数の Kinesis Streamを使ったシステムを作り、バッ チとリアルタイム処理を実施 データの提供は、S3を利用 94 http://www.slideshare.net/AmazonWebServices/adv303-beating-the-speed-of-light-with-your-infrastructure- in-aws-aws-reinvent-2014
  95. 95. DataXu様 ( Digital AdTech ) • ペタバイトスケールで、毎秒120万リクエスト • データはビッドの確認情報, 詐欺行為レコードなど • 継続的オフライン学習、リアルタイム予測継続的にアルゴリズムを改善 • 複数のプロセシングフレームワーク (The right tool for the right job) • すべてのデータはS3に保存 95 http://www.slideshare.net/AmazonWebServices/bdt306-missioncritical-stream-processing-with- amazon-emr-and-amazon-kinesis-aws-reinvent-2014 リアルタイムビディングデータのパイプラインとデータ処理システムを構築
  96. 96. Amazon S3 Amazon S3 Spark SQL JDBC Server Dashboard Amazon Redshift Consumer Amazon EMR Consumer Game DB Game Servers Kinesis DynamoDB DSV JSON • イベントのサイズは1KB • 毎日5億のイベント • 毎日5GBのデータ(ピーク1TB) GREE International様 96 http://www.slideshare.net/AmazonWebServices/gam301-realtime-game-analytics-with-amazon-kinesis-amazon-redshift- and-amazon-dynamodb-aws-reinvent-2014 ゲームサーバ、モバイルデバイス及びアドネットワークからのデータ収集・分析基盤を構 築。データ保存、ニアリアルタイム集計、分析機能を実現

×