根据马斯洛需求层次理论,可以将流处理引擎的需求分为以下几种层次:
1、持续性的流处理 2、低延迟的计算结果,亚秒级别的延迟 3、高效可扩展性,每秒百万级的吞吐量 4、容错性,即失败时的可恢复性 5、精确的可重复性 6、可查询性
流处理就是在延迟、吞吐量和正确性之间做一个平衡。
1、Spark Streaming 2、Storm 3、Flink 4、samza 。。。。
1、连续不断的处理 都具有处理“流”的能力。
2、低延迟 Spark Streaming本质是个“micro-batch”,延迟达到秒级。 如果对“延迟性”要求很高,Spark Streaming不适合。
3、高吞吐高扩展 storm在大规模集群下的吞吐量不行?直接看一组来自Yahoo的benchmark:
4、容错和excactly_once Flink支持excactly_once,通过检查点产生的分布式快照(有状态的operator)+kafka可重发的数据源完成。
5、准确性与可重发 准确性依赖于对Event Time的支持以及kafka的可部分重发的数据源。
6、查询性 将计算结果不断的sink到database或者key/value数据库,虽然这会成为潜在的瓶颈。
不断的sink到nosql数据库,提供了一个实时查询的可能性!!!
Counting in streams: A hierarchy of needs Stateful Stream Processing at In-Memory Speed Yahoo Streaming Benchmarks Apache Flink Presentation