第三章Flink高级API开发课程目标掌握Flink的Time分类及各自作用掌握Flink的Window操作及原理掌握Flink的State操作及原理掌握Flink的Checkpoint操作及原理了解Flink的任务链1.Flink的Window操作Flink认为Batch是Streaming的一个特例,所以Flink底层引擎是一个流式引擎,在上面实现了流处理和批处理。而窗口(window)就是从Streaming到Batch的一个桥梁。Flink提供了非常完善的窗口机制。1.1为什么需要Window在流处理应用中,数据是连续不断的,有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的网页。在这种情况下,我们必须定义一个窗口(window),用来收集最近1分钟内的数据,并对这个窗口内的数据进行计算。Windows是处理无限流的核心。Windows将流拆分为有限大小的“桶”,我们可以对其进行计算。1.2Flink窗口应用代码结构Flink的窗口算子为我们提供了方便易用的API,我们可以将数据流切分成一个个窗口,对窗口内的数据进行处理。本文将介绍如何在Flink上进行窗口的计算。一个Flink窗口应用的大致骨架结构如下所示:KeyedWindow//KeyedWindowstream.keyBy(...)<-按照一个Key进行分组.window(...)<-将数据流中的元素分配到相应的窗口中[.trigger(...)]<-指定触发器Trigger(可选)[.evictor(...)]<-指定清除器Evictor(可选).reduce/aggregate/process()<-窗口处理函数WindowFunctionNon-KeyedWindow//Non-KeyedWindowstream.windowAll(...)<-不分组,将数据流中的所有元素分配到相应的窗口中[.trigger(...)]<-指定触发器Trigger(可选)[.evictor(...)]<-指定清除器Evictor(可选).reduce/aggregate/process()<-窗口处理函数WindowFunction在上面,方括号([…])中的命令是可选的。这表明Flink允许您以多种不同的方式自定义窗口逻辑,使其最适合您的需求。首先:我们要决定是否对一个DataStream按照Key进行分组,这一步必须在窗口计算之前进行。经过keyBy的数据流将形成多组数据,下游算子的多个实例可以并行计算。windowAll不对数据流进行分组,所有数据将发送到下游算子单个实例上。决定是否分组之后,窗口的后续操作基本相同,经过windowAll的算子是不分组的窗口(Non-KeyedWindow),它们的原理和操作与KeyedWindow类似,唯一的区别在于所有数据将发送给下游的单个实例,或者说下游算子的并行度为1。1.3Window类型和概念Window可以分成两类:CountWindow:按照指定的数据条数生成一个Window,与时...