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

你可能感兴趣的文章
Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
查看>>
Nginx 学习(一):Nginx 下载和启动
查看>>
nginx 常用指令配置总结
查看>>
Nginx 常用配置清单
查看>>
nginx 常用配置记录
查看>>
nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
查看>>
Nginx 我们必须知道的那些事
查看>>
Nginx 的 proxy_pass 使用简介
查看>>
Nginx 的配置文件中的 keepalive 介绍
查看>>
Nginx 结合 consul 实现动态负载均衡
查看>>
Nginx 负载均衡与权重配置解析
查看>>
Nginx 负载均衡详解
查看>>
nginx 配置 单页面应用的解决方案
查看>>
nginx 配置https(一)—— 自签名证书
查看>>
nginx 配置~~~本身就是一个静态资源的服务器
查看>>
Nginx 配置清单(一篇够用)
查看>>
Nginx 配置解析:从基础到高级应用指南
查看>>
nginx+php的搭建
查看>>
nginx+tomcat+memcached
查看>>
nginx+Tomcat性能监控
查看>>