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

你可能感兴趣的文章
PyQt4 代码在 PyQt5 (QHeaderView) 上不起作用
查看>>
PyQt4 到 PyQt5 ->mainFrame() 已弃用,需要修复才能加载网页
查看>>
PyQt4, class:mouseButtons用法
查看>>
PyQt4参考文档
查看>>
PyTorch Lightning:通过分布式训练扩展深度学习工作流
查看>>
PyQt5 - QThread:在线程仍在运行时被销毁
查看>>
PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件
查看>>
PyQt5 Designer 不工作:此应用程序无法启动,因为无法初始化 Qt 平台插件
查看>>
PyQt5 QLCNumber 没有更新
查看>>
PyQt5 TabWidget选项卡BarClicked TypeError:本机Qt信号不可调用
查看>>
PyQt5 从 PyQt4 转换信号代码
查看>>
PyQt5 和 asyncio:从永不完成的收益
查看>>
PyQt5 和 Django:如何使用 HTTP 请求(Multipart-form)上传图像?
查看>>
PyQt5 按钮运行功能和更新 LCD
查看>>
pyqt5 获取Qlabel中的图片并对其进行处理(包括Qimage转换为Mat)
查看>>
pyqt5 设置控件在最上层或者在下层
查看>>
pyqt5 设置网格布局的间距
查看>>
pyTorch Hub 系列#4:PGAN — GAN 模型
查看>>
PyQt5-基本窗口控件-QMainWindow
查看>>
PyQt5:如何安装/运行 Qt 设计器
查看>>