博客
关于我
Flink(十四)—— Flink 中几种 Time 详解
阅读量:59 次
发布时间:2019-02-26

本文共 2164 字,大约阅读时间需要 7 分钟。

Flink 在流程序中支持不同的时间概念,包括 Processing Time、Event Time 和 Ingestion Time。这些概念各自有不同的特点和适用场景,理解它们对于优化流处理程序至关重要。

Processing Time

Processing Time 是最简单的时间概念,它直接使用机器的系统时间。基于时间的操作(如时间窗口)会根据当时机器的系统时间来处理事件。例如,如果流程序在上午 9:15 开始运行,那么第一个每小时的 Processing Time 窗口会包含上午 9:15 到 10:00 之间处理的事件,下一个窗口则会包含 10:00 到 11:00 之间的事件。Processing Time 不需要流和机器之间的时间协调,它提供了最好的性能和最低的延迟。然而,在分布式或异步环境下,Processing Time 的确定性可能受到事件到达速度和系统中断等因素的影响。

Event Time

Event Time 是事件本身携带的时间戳。它通常在事件到达 Flink 之前就已经确定,并且可以直接从事件中获取。Event Time 的时间取决于数据来源,而不受其他因素的影响。在配置 Event Time 时,程序需要指定生成水印的方式,水印用于衡量 Event Time 的进度。

Event Time 在理想情况下可以提供确定性结果,即使在事件无序到达或存在延迟的情况下,处理结果也能保持一致。例如,每小时的 Event Time 窗口会包含带有落入该小时的时间戳的所有事件,无论它们到达的顺序如何。然而,如果事件按时间顺序到达,处理结果会更加准确。

Ingestion Time

Ingestion Time 是事件进入 Flink 的时间。在源操作处,每个事件会使用源当前时间作为时间戳,基于时间的操作会利用这个时间戳。Ingestion Time 在概念上介于 Processing Time 和 Event Time 之间。与 Processing Time 相比,它稍微复杂一些,但结果更可预测,因为它使用稳定的时间戳(由源操作处分配)。Ingestion Time 不需要程序手动指定水印生成方式。

与 Event Time 相比,Ingestion Time 无法处理无序事件或延迟数据,但它的配置相对简单,无需额外设置。Ingestion Time 的一个优势是它能自动分配时间戳并自动生成水印。

设定时间特性

Flink DataStream 程序的第一步通常是设置基本时间特性。这一步定义了数据流源的行为方式,例如它们是否会分配时间戳。此外,还需要确定像 KeyedStream.timeWindow(Time.seconds(30)) 这样的窗口操作应该使用哪种时间概念。

以下示例展示了一个使用 Processing Time 的 Flink 程序,该程序每小时聚合事件:

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);DataStream
stream = env.addSource(new FlinkKafkaConsumer09<>(topic, schema, props));stream.keyBy(event -> event.getUser()) .timeWindow(Time.hours(1)) .reduce((a, b) -> a.add(b)) .addSink(...);

Event Time 和 Watermarks

Flink 实现了数据流模型中的多种技术,尤其是在处理 Event Time 和 Watermarks 时。Watermarks 是衡量 Event Time 进度的机制,它们作为数据流的一部分带有时间戳 t,表示 Event Time 已到达该时间 t。水印的作用是通知流处理程序,提醒其关闭正在进行的窗口操作。

在分布式环境中,水印在源函数处生成,或在源函数之后生成。每个并行子任务独立生成自己的水印,这些水印定义了特定并行源处的事件时间。水印通过流程序传输,提前到达操作员处的事件时间。当一个操作符提前其事件时间时,它会为后续操作生成新的水印。

平行流中的水印

在并行流中,水印的生成和传输至关重要。源函数的每个并行子任务独立生成水印,这些水印定义了特定子任务处的事件时间。水印通过流程序传输,提前到达操作员处的事件时间。当一个操作符处理多个输入流时(例如 union、keyBy 或 partition 函数),其事件时间是输入流事件时间的最小值。

总结

理解 Flink 中的不同时间概念及其适用场景,对于优化流处理程序至关重要。选择合适的时间概念需要综合考虑程序的性能需求、数据源的特点以及流处理的复杂度。在实际应用中,合理配置时间特性和水印机制,可以显著提升流处理程序的效率和准确性。

转载地址:http://cquz.baihongyu.com/

你可能感兴趣的文章
No 'Access-Control-Allow-Origin' header is present on the requested resource.
查看>>
NO 157 去掉禅道访问地址中的zentao
查看>>
no available service ‘default‘ found, please make sure registry config corre seata
查看>>
No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
查看>>
no connection could be made because the target machine actively refused it.问题解决
查看>>
No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
查看>>
No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
查看>>
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
查看>>
No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
查看>>
No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
查看>>
No module named 'crispy_forms'等使用pycharm开发
查看>>
No module named cv2
查看>>
No module named tensorboard.main在安装tensorboardX的时候遇到的问题
查看>>
No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
查看>>
No new migrations found. Your system is up-to-date.
查看>>
No qualifying bean of type XXX found for dependency XXX.
查看>>
No qualifying bean of type ‘com.netflix.discovery.AbstractDiscoveryClientOptionalArgs<?>‘ available
查看>>
No resource identifier found for attribute 'srcCompat' in package的解决办法
查看>>
no session found for current thread
查看>>
No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
查看>>