博客
关于我
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/

你可能感兴趣的文章
SpringBoot中集成screw(螺丝钉)实现数据库表结构文档生成
查看>>
PROFINET 模拟器使用教程
查看>>
Program type already present: android.support.v4.widget.EdgeEffectCompat
查看>>
PyTorch中文版官方教程来啦(附下载)
查看>>
Progress Kemp LoadMaster 远程命令执行漏洞复现(CVE-2024-1212)
查看>>
Project configuration is not up-to-date with pom.xml. Run Maven->Update Project
查看>>
Project Euler 15 Lattice paths
查看>>
Project Euler 48 Self powers( 大数求余 )
查看>>
Project Euler Problem 12: Highly divisible triangular number
查看>>
ProjectEuler 2
查看>>
projection介绍及EPSG:4326和EPSG:3857的投射转换
查看>>
project打开文件时,显示无法识别此文件格式?
查看>>
Prometheus + Grafana on Kubernetes部署
查看>>
prometheus + grafana进行服务器资源监控
查看>>
Prometheus Alertmanager 告警配置详解
查看>>
Prometheus Grafana 展示平台
查看>>
Prometheus pushgateway使用详解
查看>>
Prometheus 云原生 - Prometheus 数据模型、Metrics 指标类型、Exporter 相关
查看>>
Prometheus 云原生 - 基于 file_sd、http_sd 实现 Service Discovery
查看>>
Prometheus 云原生 - 微服务监控报警系统 (Promethus、Grafana、Node_Exporter)部署、简单使用
查看>>