网站智能云,wordpress程序,公司网站设计教程,网址导航怎么卸载不掉在流数据处理应用中#xff0c;一个很重要、也很常见的操作就是窗口计算。所谓的“窗口”#xff0c;一 般就是划定的一段时间范围#xff0c;也就是“时间窗”#xff1b;对在这范围内的数据进行处理#xff0c;就是所谓的 窗口计算。所以窗口和时间往往是分不开的。
时… 在流数据处理应用中一个很重要、也很常见的操作就是窗口计算。所谓的“窗口”一 般就是划定的一段时间范围也就是“时间窗”对在这范围内的数据进行处理就是所谓的 窗口计算。所以窗口和时间往往是分不开的。
时间语义
1、处理时间Processing Time 处理时间的概念非常简单就是指执行处理操作的机器的系统时间。 在这种时间语义下处理窗口非常简单粗暴不需要各个节点之间进行协调同步也不需要 考虑数据在流中的位置简单来说就是“我的地盘听我的”。所以处理时间是最简单的时间语义。
2、事件时间Event Time 事件时间是指每个事件在对应的设备上发生的时间也就是数据生成的时间。 数据一旦产生这个时间自然就确定了所以它可以作为一个属性嵌入到数据中。这其实 就是这条数据记录的“时间戳”Timestamp。 水位线 在事件时间语义下我们不依赖系统时间而是基于数据自带的时间戳去定义了一个时钟 用来表示当前时间的进展。于是每个并行子任务都会有一个自己的逻辑时钟它的前进是靠数 据的时间戳来驱动的。 我们可以把时钟也以数据的形式传递出去告诉下游任务当前时间的进展而且这个时钟 的传递不会因为窗口聚合之类的运算而停滞。一种简单的想法是在数据流中加入一个时钟标 记记录当前的事件时间这个标记可以直接广播到下游当下游任务收到这个标记就可以 更新自己的时钟了。由于类似于水流中用来做标志的记号在 Flink 中这种用来衡量事件时 间Event Time进展的标记就被称作“水位线”Watermark。 具体实现上水位线可以看作一条特殊的数据记录它是插入到数据流中的一个标记点 主要内容就是一个时间戳用来指示当前的事件时间。而它插入流中的位置就应该是在某个 数据到来之后这样就可以从这个数据中提取时间戳作为当前水位线的时间戳了。
水位线是插入到数据流中的一个标记可以认为是一个特殊的数据水位线主要的内容是一个时间戳用来表示当前事件时间的进展水位线是基于数据的时间戳生成的水位线的时间戳必须单调递增以确保任务的事件时间时钟一直向前推进水位线可以通过设置延迟来保证正确处理乱序数据一个水位线 Watermark(t)表示在当前流中事件时间已经达到了时间戳 t, 这代表 t 之 前的所有数据都到齐了之后流中不会出现时间戳 t’ ≤ t 的数据 水位线生成策略 在Flink 的 DataStream API 中 有 一 个 单 独 用 于 生 成 水 位 线 的 方 法 assignTimestampsAndWatermarks()它主要用来为流中的数据分配时间戳并生成水位线来指 示事件时间。 有序流的水位线生成策略
object f1 {def main(args: Array[String]): Unit {val env StreamExecutionEnvironment.getExecutionEnvironment//设置全局并行度env.setParallelism(1)//获取当前的运行配置//setAutoWatermarkInterval时间戳自动生成水位线的时间间隔env.getConfig.setAutoWatermarkInterval(500L)//数据val stream env.fromElements(Event(4, aa, 1000L),Event(5, bb, 2000L),Event(6, cc, 2500L),Event(7, dd, 4000L))//设置水位线//1、有序流的水位线生成策略stream.assignTimestampsAndWatermarks(WatermarkStrategy.forMonotonousTimestamps[Event]().withTimestampAssigner(new SerializableTimestampAssigner[Event] {override def extractTimestamp(t: Event, l: Long): Long t.time //指定字段中的time为时间戳}))//执行env.execute()}case class Event(id: Int, name: String, time: Long )
}