![[レポート] サーバレスストリーム処理、パイプラインのベストプラクティス #SVS317 #reInvent](https://devio2023-media.developers.io/wp-content/uploads/2019/10/1200x630_reinvent2019.jpg)
[レポート] サーバレスストリーム処理、パイプラインのベストプラクティス #SVS317 #reInvent
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こちらはラスベガスで開催されている AWS re:Invent2019のセッション
Serverless stream processing pipeline best practices
のレポートとなります。
目次
セッション情報
Streaming data pipelines are increasingly used to replace batch processing with real-time decision-making for use cases including log processing, real-time monitoring, data lake analytics, and machine learning.
Join this session to learn how to leverage Amazon Kinesis and AWS Lambda to solve real-time ingestion, processing, storage, and analytics challenges.
We introduce design patterns and best practices as well as share a customer journey in building large-scale real-time serverless analytics capabilities.
▼意訳
- 以下のようなリアルタイムタイムの意思決定は バッチ処理 から
ストリーミングデータのパイプライン処理 に取って替わりつつある。
- ログ処理
 - リアルタイムモニタリング
 - データレイク分析
 - 機械学習
 
 - このセッションで Amazon Kinesis と AWS Lambda の活用方法を学ぶ
 - リアルタイムの取り込み、処理、ストレージ、分析の課題を解決する
 - デザインパターンとベストプラクティス を紹介するとともに、 実際の大規模なリアルタイム サーバレス分析環境の構築を行った事例を紹介する
 
▼スピーカー
- Justin Pirtle: Principal Solutions Architect, Amazon Web Services
 - Ranga Muvavarirwa: VP, Entertainment Technology, Comcast
 - Anushri shenoy: Director, Comcast
 
ストリーム処理の概要
昔のデータ解析はこんな感じ
- リレーショナルデータベース
 - ギガバイト〜テラバイトのスケール
 - データがロードされる前にスキーマ定義
 - 大規模な初期投資
 
タイムリーな意思決定におけるデータの価値
- Time-critical 意思決定において、データの価値は数分で激減する
 
そもそもストリーミングデータとは?
主な特性
- ハイボリューム
 - 継続的
 - 時系列
 - 低遅延
 
バッチ処理、ストリーム処理の違い
| バッチ処理 | ストリーム処理 | 
|---|---|
| 数時間ごとのサーバログ | リアルタイムのメトリクス | 
| 週次/月次の請求 | リアルタイムのアラート | 
| 日次のアプリ利用記録 | リアルタイムのアプリ利用解析 | 
| 日次の不正報告 | リアルタイムの異常検知 | 
Amazon Kinesis
サーバレスなモデルの特徴
- プロビジョニング・管理不要
 - 自動スケーリング
 - 従量課金制
 - 高可用性
 - セキュア
 
AWSでストリーム処理
- Kinesis Data Streams: データストリームを検知・補完
 - Kinesis Data Analytics: データストリームをリアルタイムに分析
 - Kinesis Data Firehose: ストリーミングデータのロード、データレイク/データウェアハウスへの保管
 - Managed Streaming for Kafka: データストリームを検知・補完 (マネージドなApache Kafka サービス)
 
リアルタイム分析
データストリーミングの技術によって 様々なソース の 高ボリューム・高流速のデータの取得、処理、解析 が リアルタイムで できるようになる。
Kinesis Data Streams
特徴
- 容易な操作、低コスト
 - リアルタイム、柔軟なパフォーマンス
 - セキュア、耐久性のあるストレージ
 - 複数のリアルタイム分析アプリケーションの利用が可能
 
Kinesis Data Firehose
特徴
- シームレス
 - 直接データストアに保存
 - 継続的なデータの変換処理
 - ニア(Near)リアルタイム
 
ストリームデータパイプライン
ストリームの取得方法
AWS ツールキット/ライブラリ
- AWS SDK
 - Amazon Kinesis Producer Library
 - AWS Mobile SDK
 - Amazon Kinesis Agent
 
AWS サービスとの統合
- AWS IoT Core
 - Amazon CloudWatch Logs and Amazon CloudWatch Events
 - Amazon EventBridge
 - AWS Database Migration Service
 
3rd パーティ
- Log4j
 - Flume
 - Fluentd
 
ストリームの処理
Amazon Kinesis
- Kinesis Data Firehose
 - Kinesis Client Library
 
AWS サービス
- AWS Lambda
 - Amazon EMR
 
3rd パーティ
- Spark
 - mongoDB
 - splunk
 - など
 
Lambda を利用すること
メリット
- マネージド
 - 新しいストリームが来ない限り課金されない
 - 自動スケーリング
 
実行モデル
- 同期(push): Amazon API Gateway → AWS Lambda
 - 非同期(event): Amazon SNS, Amazon S3 → AWS Lambda
 - Poll-based: Amazon DynamoDB, Amazon Kinesis Data Streams → AWS Lambda
 
Kinesis Data Streams との連携
- データが生成される都度、継続的に Kinesis Data Streams へレコード登録
 - Lambda でレコードを定期的にポーリング
 
パイプラインのベストプラクティス、最適化
バッチ処理
- データ生成元
- レコードをローカルに貯める
 - バッチで Kinesis Data Streams へPUTリクエスト
 
 - Lambda
- Kinesis Data Streams からレコードを取得
 - 複数の Lambda functions で並列に処理
 
 
リトライ処理、失敗処理の設定 (New Lambda Update)
失敗時の行き先
- 自動的にレコードを SNS or SQS へ送信
 
リトライ
- バッチごとに最大のリトライ回数をコントロール可能
 
レコードの最大寿命(Maximum Record Age)の設定
- 一定期間(Maximum Record Age) 経ったレコードは処理対象外に
 
実行中のストリーム処理の監視
Kinesis のメトリクス/アラーム
- GetRecords.IteratorAgeMillseconds: Kinesis ストリームに対して行われたすべての GetRecords 呼び出しの最後のレコードの期間
 - IncomingRecords/IncomingBytes: 指定された期間に、Kinesis ストリームに正常に送信されたバイト数
 - ReadProvisionedThroughputExceeded: 指定された期間のストリームで調整された GetRecords 呼び出し回数
 - WriteProvisionedThroughputExceeded: 指定された期間にストリームのスロットリングにより拒否されたレコードの数
 
など (参考/詳細 : monitoring-with-cloudwatch )
Lambda のメトリクス/アラーム
- Errors
 - IterarorAge
 - Throttles
 
など (参考/詳細 : monitoring-functions-metrics.html )
Lambda のストリーム処理がうまく行かないとき
- 原因: ステートフルなストリーム処理: 検討: Kinesis Data Analytics、カスタム Kinesis Client Library(KCL)、 OSS(Apache Flinkなど)
 - 原因: 書き込み前に大容量のストリーミングデータをバッファしている: 検討: Kinesis Data Firehose
 
Kinesis Data Firehose: レコードフォーマット変換
- S3へ配信する前に Parquet もしくは ORCへ変換する
 - ファイルの圧縮
 
[事例紹介] Comcast社
後半はずっと Xfinity X1 というストリーミングサービスの事例紹介でした。
パイプライン構成
Ingest- X1 UIからのリクエストを Kinesis Data Streams へ
 
Process- Lambda でデータ整形し、 再度 Kinesis Data Streamsへ
 - Kinesis Data Analytics でリアルタイム分析
 
Store- Kinesis Data Firehose 経由で Elasticsearch Service へ配信
 







