Flink源码分析-Watermark
简介
窗口机制是Flink流处理的核心,它将无限的流元素分割成有限的窗口。当一个窗口不再增加新元素时,就可以对这个窗口中的所有元素执行计算逻辑。而判断窗口不会再增加新元素的方式有:时间(Watermark)、计数、自定义。其中Watermark
代表事件发生时的时间戳或者Flink收到事件时的时间戳。
窗口机制是Flink流处理的核心,它将无限的流元素分割成有限的窗口。当一个窗口不再增加新元素时,就可以对这个窗口中的所有元素执行计算逻辑。而判断窗口不会再增加新元素的方式有:时间(Watermark)、计数、自定义。其中Watermark
代表事件发生时的时间戳或者Flink收到事件时的时间戳。
当某个operator执行需要很长时间的话,使用异步操作对吞吐量的提升非常有帮助。
ACID是指原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性(Duration)。
BASE是指基本可用(Base Available)、柔性状态(Soft State)、最终一致性(Eventual Consistency)。
ACID和BASE代表了两种截然相反的设计哲学。ACID是传统数据库常用的设计理念,追求强一致性模型;BASE支持的是高效的分布式数据库,通过牺牲强一致性来获得高可用性。不同的业务场景对数据的一致性要求不一样,因此这两种设计理念也可能会结合在一起使用。
一致性(consistence)和共识性(consensus)不是完全一致的概念。
在处理数据时候,需要考虑在三种不同的语义会对业务产生什么影响。程序要实现不同的语言代价也是不同的,而且不同的语义对业务的影响也不一样。
数据处理过程对数据一致性的影响是强相关的。
设计一个流式任务的时候,需要从几个方面考虑:
ACID是一种描述一致性的原则,通常出现在数据库系统中。
单机事务一般是需要满足ACID的。
分布式事务需要多节点协作来完成一个事务,其实现方式和单机事务有很大不同,也很难满足ACID原则,实现方式和单机事务的实现方式也有很大不同。目前分布式事务是通过阶段提交来实现的,阶段提交分为二阶段和三阶段提交。
大部分高可用的场景中都会使用到ZooKeeper,例如:Hdfs,Hbase,Flink。
ZooKeeper应用场景非常广泛
分布式锁
高可用
Hbase的Master选举,Flink的JobMaster选举。。
发布/订阅
微服务注册中心
分布式队列
Flink Job有三种部署模式:
LAZY_FROM_SOURCES
仅当Task的上游都产生数据之后,才会真正的部署Task。LAZY_FROM_SOURCES_WITH_BATCH_SLOT_REQUEST
与LAZY_FROM_SOURCES
逻辑基本一致。不同的是在申请Slot的时候有超时时间限制。EAGER
ExecutionGraph在被调度时会将所有Task一次性到各个TaskManager。Flink中的容错,一致性语义都是靠State来实现的。
State需要结合Checkpoint,Snapshot才能发挥作用。
State 可以按照维度进行划分:
类型:
数据组织格式:
Flink以DAG的方式来执行程序,它会根据用户的代码生成三个Graph,但我认为实际上还有一个Graph,就是用户的程序直接映射出来的。
CheckpointCoordinator会启动一个定时任务触发checkpoint
窗口机制是Flink流处理的核心,它将无限元素的流分割成有限元素的集合(窗口)。当一个窗口不再增加新元素时,就可以对这个窗口中的所有元素执行计算逻辑。
将一条消息从被Flink job消费到最后被sink下来的整个过程划分成两部分,算子的逻辑处理、task之间的消息传递。其中算子的逻辑处理需要用户参与,task之间的消息传递一般是不需要用户参与的,但是了解其实现过程,对理解Flink的原理是非常有帮助的。