Samza是依赖Kafka作为通信层的流计算框架。本文主要分析其state的管理。
概述
增量
存储粒度:增量。这里的存储粒度指的是对状态的容错处理,在分布式环境中,保存在本地(内存OR硬盘)的状态随时可能丢失,所以需要把状态定期checkpoint到可靠的存储引擎中,增量还是全量取决于checkpoint的方式。
目前Trident靠HBase等数据库产品帮它做了增量的状态管理,但是当状态量过大时,内存装不下,这时状态的所有操作都只能退化到HBase的操作。
Flink目前虽然提供RocksDb+HDFS的状态容错管理,但是还是全量的checkpoint。
at-least-once
事务保证:at-least-once。由于Samza没有把版本号(数据的批次ID等)和状态结合起来,所以当计算失败时,状态却不能回溯到以前的状态。
Trident和Flink均可保证exactly-once。
状态应用
1.聚合:比如wordcount、uv、pv等,持续变化的值就是需要容错管理的状态。
2.Join:如果需要对两条stream进行join,就需要对这些实时产生的中间结果进行容错处理。
etc..
实现
如果像Trident把状态全部缓存到内存中(等到批次处理完才进行增量checkpoint),有些场景内存却撑不住,比如stream join stream的场景。
这时需要一个无界的存储机制来保存状态。