gydtep 发表于 2022-10-13 17:14:59
上面提到,流计算的输入数据是没有边界的,这符合我们传统上对流计算认知。在《System Streaming》一书中,作者提出了一个将流批统一考虑的流计算理论抽象gydtep 发表于 2022-10-14 08:28:00
如果定义流计算的输入集合为:E,t 时刻以来的输入集合为 E(t),输出集合为 Sink(t),引擎此时状态为 State(t),State(t) 包括各个算子的状态(包括上面提到的不确定性计算)、数据源的消费偏移量(或文件读取偏移等)等:gydtep 发表于 2022-10-14 14:10:52
则需定期以事务的方式进行批量存储。对于每一个 O(t) 存储后, 恢复函数 R 的实现就简单多了:任务恢复时,将 O(t) 重新加载,使用 F 执行重算操作。gydtep 发表于 2022-10-14 19:01:04
,如果考虑吞吐率不能存储每一条,则需定期批量存储,上述条件中去掉了对「事务」的要求的原因:如果在提交这一批数据的提交过程中又发生了异常,gydtep 发表于 2022-10-15 16:46:10
如上图所示,Flink 引擎会定时(每个周期称之为一个 epoch)以 2PC 的方式提交结果。事实上,即便不考虑结果输出,Flink 「分布式一致性快照」的快照的实现也是一个 2PC 的过程gydtep 发表于 2022-10-16 10:18:38
所以平均事务大小由提交间隔确定,当流量相同时,较短的提交间隔将导致较小的事务,但太小的间隔将导致吞吐下降,因此吞吐量与端到端处理延迟之间需要有一个折衷。gydtep 发表于 2022-10-17 09:03:44
则流计算中的数据一致性同关系型数据库事务 ACID 理论中的 Consistency 有异曲同工之妙,后者指的是在事务开始或结束时,数据库中的记录应该在一致状态gydtep 发表于 2022-10-17 19:15:08
流计算中的确定性指的是,给定相同的一组数据,重复运行多次或者打乱数据进入引擎的顺序,计算完成后将会输出相同的结果,否则就是非确定性计算。gydtep 发表于 2022-10-18 09:22:53
前者的语义约束弱于后者。Exactly-once State Consistency 只是表达了:流计算要求对状态的更新只提交一次到持久后端存储,但这里的状态一般不包括「输出到下游结果」,gydtep 发表于 2022-10-18 15:58:01
如果定义流计算的输入集合为:E,t 时刻以来的输入集合为 E(t),输出集合为 Sink(t),引擎此时状态为 State(t),State(t) 包括各个算子的状态(包括上面提到的不确定性计算)、数据源的消费偏移量(或文件读取偏移等)等: