Flink流计算的概念

流式计算的世界观: 时间不停万物不停
  1. 在批量的时代,我们只记录关键的信息,只在乎当前,不在乎状态是如何一步步变化至当状态的,所以说批时代我们计算所面向的数据是静态的。在分布式环境中批量计算是将计算移动到相应的数据上进行运行。
  2. 在流世界里,我们在乎的是变化,我们计算所面临的将是时时刻刻更新流动的数据。流式计算是将定义好的计算部署到分布式节点上,让数据在上面流动。

不再把数据定性为“处理某天的数据,处理某个季度的数据”,而是随着时间的推移,系统要捕获到用户每分每秒产生的数据,进行计算处理后让业务报告保证最新。

流式处理中的时间
  • 事件时间(Eventtime):事件真实发生的时间,由于...原因,事件发生的时间和到达服务端的时间可能是相差极大的
  • 到达时间:服务端接收到事件的时间
  • 处理时间:系统开始出路到达事件的时间
//创建环境上下文
val env = StreamExecutionEnvironment.getExecutionEnvironment
// 设置在当前程序中使用 ProcessingTime
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
窗口
  • 滚动窗口:按照固定的时间片断划分数据流,将数据流分割成固定大小的片段。
  • 滑动窗口:由固定窗口长度windows-size=1和窗口滑动步长windows-slide=0.5,表示窗口长度为1,每0.5个单位就向前滑动一个新窗口。滑动窗口经常被用来统计诸如“每5分钟统计过去10分钟的访问量”,windows-size=10和windows-slide=5
  • 会话窗口:会话的窗口的大小由用户活动的事件频率决定,没有固定的窗口大小。
流式处理的设计模式
流和表的连接:有时候,我们需要在外部数据中保存一些规则后,需要时将信息完完整整的拉进流中。但是,流式处理系统每秒可以处理10-50W个事件,而数据库每秒的只能处理1W个事件。所以,外部查找不仅会带来严重的延迟性,如果数据刷新的太频繁会对数据库造成很大的压力,如果刷新不及时,那么流式处理中所用的数据就会过期。所以,我们采用通过Canal来捕获Mysql数据库的变化,形成事件流,Flink就可以监听事件流,并及时更新。
State

在Flink中,状态用于缓存用户数据,窗口数据,程序运行状态,数据源偏移量

Checkpoint

定期对State中的数据进行备份并恢复的机制,正是有了State和Checkpoint,Flink才能做到:

  • 备份与恢复,7*24的运行是容错
  • 数据不丢失不重复,Exactly one
  • 低延迟
  • 数据间有关联,通过状态满足业务逻辑
Watermark 和 Trigger

Flink中保持正确性的工具是State和Checkpoint,提供时间推理能力的是Watermark和Trigger。

你可能感兴趣的:(flink)