1.Distributed Runtime Environment
1.1Tasks and Operator Chains
tasks:将一些操作符的一些任务连接到一起,放到一个任务中执行,这样的话减少线程间切换以及缓冲的开销,增加吞吐量降低延迟。
1.2Job Managers, Task Managers, Clients
每个都是JVM进程。
- Clients:向job提交作业的客户端,当任务提交后可断开连接,保持连接能够收到返回结果。
- Job Manager(Master):用于调度job,向Task Manager下发指令,做检查点以及故障恢复
- Task Manager(Worker):真正用于执行task作业,并能够缓冲以及和其它Task Manager交换数据
1.3Task Slots and Resources
一个Task Manager(JVM进程)具有一个或多个Task Solt,Task Solts会均分Task Manager的内存,通过调整插槽数,用户可以定义任务之间是如何隔离的,同一个TM下不同的solt任务共享TCP连接以及心跳信息,还可以共享数据集以及数据结构,从而减少每个任务的开销。
Flink允许多个任务共享一个插槽,故一个插槽是能够容纳整个作业的管道。
- 共享插槽的好处
1、当插槽数和任务最高并行度设置一致时,即可不必要计算一个作业有多少个任务 2、更好的利用资源
- 使用建议:
默认将插槽数和cpu的 core数保持一致,若是超线程 则设置为2倍
1.4State Backends
本身KV索引的数据结构就是取决于状态存储,可存储 内存、RockDB、FS。即保存状态的数据数据结构,还保存了状态的时间点快照,该快照是检查点的一部分,后续用于做数据恢复。
1.5 savePoint
用于做恢复执行,可以允许在不丢失任何任何状态的情况下去更新程序以及Flink集群。它是手动触发的,依赖于常规的检查点机制。定期通过快照去生成检查点,对于数据恢复时,只需要最新的一个完成的检查点即可以。可以通过命令行/Rest API创建和取消。
checkpoints
是由用户触发的,在更新检查点完成时不会自动的过期;
2.执行流程图
通过println(env.getExecutionPlan)可获取Flink作业的执行流程图
- StreamGraph :根据用户编写的Stream API代码生成的最初的图,表示程序的拓扑结构
- JobGraph:经StreamGraph 优化后生成的该图,并提交JobManager,优化点:Chain Operators,将多个操作放到一个任务中执行
- ExecutionGraph:JobManager根据JobGrap生成该图,是最核心的数据结构
- 物理执行图:根据ExecutionGraph对Job进行调度后,在每个TaskManager上部署的Task后形成的图。
3.Time
- evnet time : 数据生成时间,应用更广泛,为了避免乱序以及延迟数据,flink引入 watermark概念
- ingestion time: 数据摄入Flink集群的时间,多是用于提供预测的一些结果,相对稳定(只记录一次)
- processing time:Flink实际处理数据的时间,不稳定(同一数据流经不同窗口,可能会存在不同的处理时间戳)
设置方式:
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime)
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime)
4. watermark
watermark(t):断言所有<=t的event全部到达。
Flink为处理Event time引入的概念,实际上还是时间戳;有两种生成机制:Punctuated(间断性)、Periodic(周期性);当时间达到watermark时,即认为所有限定时间内的数据都到了(当数据延迟很高时会丢失数据)
4.1watermark两种生成机制对比
- Periodic(周期性):按照一定时间间隔或者一定数据量产生watermark,(重要)生产中必须结合时间和积累的条数两个维度生成watermark,否则极端情况会出现很大的延迟性。(ExecutionConfig.setAutoWatermarkInterval(…))
- Punctuated(间断性):一般是根据event自身决定是否产生watermark,(重要)生产中只有实时性要求非常高才会选择该方式生成watermark。(AssignerWithPunctuatedWatermarks)
4.2watermark预定义两种方式
参考文章:https://www.ververica.com/blog/watermarks-in-apache-flink-made-easy
基于时间升序(Assigners with ascending timestamps)、 基于延迟数据(Assigners allowing a fixed amount of lateness)
4.2watermark考量点
- 1.第一个数据4到来之后,是否直接输出
- 2.第一个数据2到来之后,是否继续等待?等待多久?还是直接输出
- 3.如何合理的设定延迟时间(N)
- 4.使用何种方式生产watermark(bounded-out-of-orderness、ProcessFunction )
如何处理:
常规数据(watermark时间=event时间):正常处理
延迟数据:窗口[start time, end time],最大的延迟时间(N),watermark = end time + N