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

你可能感兴趣的文章
PHP查找数组中最大值与最小值
查看>>
php查最大值,在PHP数组中查找最大值
查看>>
php标签筛选,关于PHP CodeIgniter框架中通过<a>标签和url做多条件分类筛选
查看>>
php根据年月日计算年龄
查看>>
RabbitMQ - 单机部署(超详细)
查看>>
php检查注册,PHP检查注册的电子邮件地址是一个’school.edu’地址
查看>>
php模拟发送GET和POST请求
查看>>
RabbitMQ - 以 MQ 为例,手写一个 RPC 框架 demo
查看>>
php模板引擎smarty
查看>>
php正则表达式模式
查看>>
php正则表达式的特殊字符含义
查看>>
PHP正则表达式获取武汉市的实时pm2.5数据并邮件发送phpmailer
查看>>
RabbitMQ + JMeter组合,优化你的中间件处理方式!
查看>>
PHP水仙花问题解法之一
查看>>
php没有解析是怎么回事,linux下php文件没有被剖析怎么办?_后端开发
查看>>
php注册页面实现注册后跳转页面
查看>>
PHP消息队列的实现方式与详解,值得一看
查看>>
PHP混合Go协程并发
查看>>
php源码中如何添加滚动公告,给WordPress网站添加滚动公告的方法
查看>>
PHP源码安装后如何新增模块
查看>>