質問: 大規模なデータ収集といった話になるときに、よくストリーミング処理が必要になり、 Amazon KinesisやApatch Streamなどの話題が出ます。 複数台のサーバー -> Amazon Kinesis -> Amazon Redshift といった具合に。 複数台のサーバー -> Amazon Redshift といったように、複数台のサーバーから直接DBに保存するのはトランザクションの問題?や処理が追いつかなかったりするため、ストリーミング処理をするのだと私の中では認識しております。 ただ、結局、間にストリーミングサーバーを入れたところで、左から右へデータを流しているだけで、結局、処理が追いつかなかったりするのではないかと思っております。 実際はそんなことはなく、ストリーミングサーバーはそこら辺を上手くやっているのかと思われますが、そのあたりの知見をつけたく、調べているのですが、なかなか良い資料が見当たりませんでした。 ※一つ、思い浮かぶのは、ある程度、ストリーミングサーバー側でデータをためて、一定以上貯まるとデータをDBへ入れるといったこととかですかね。 皆様のご経験などを踏まえ、ご教授頂けますと幸いです。 宜しくお願いします。
回答: 保存している理由で思いつく点は 1. 非同期の処理で 入力データの処理量と、出力先の処理能力がイコールで無いなら、どこかで一時的に貯めておくのは 一般的な仕組みだと思います。(キューイング、キャッシュなど) 2. データの順序性を担保して、大量の入力データに対して並列にバッチ処理を可能にするためには一時的に保存していると思います。 3. 同じデータを何度でも取り出せるという点もProxy的なデータ転送の仕組みでは難しいのではと思います。 出力処理が追いつかない事があるという点は、リソースは有限であることを考えるとご指摘のとおりだと思います。KinesisにPutされたデータは24時間まで保持するという制限もあるので それまでに 一度も取り出せず 出力側の処理がされない場合は、取りこぼすことになると思います。 また、Kinesisのスループットに制限はありませんが デフォルトでは10シャードまでしかスケールしません。スループットが足りない場合は 申請で緩和する必要があります。 ご参考)FAQ ストリーミング処理の役目ということであれば大量発生する入力データをリアルタイムに処理してデータウェアハウス等に出力することだと思いますが。Apache Spark Stream サイトの資料が概要としてわかりやすかったです。 この資料によるとストリーム処理フレームワークへの要件を次の5つとしています。 ストリーミング処理の役目は、これらを実現することと言えるかもしれません。 * Scalable to large clusters * Achieves second-scale latencies * Has simple programming model * Integrates with batch & interactive workloads * Ensures efficient fault-tolerance in stateful computations