flink 处理迟到数据(Trigger、设置水位线延迟时间、允许窗口处理迟到数据、将迟到数据放入侧输出流、代码示例、迟到数据触发窗口计算重复结果处理)

flink数据延迟原因及详细处理方案 在java开发中flink遇到数据延迟到达的问题及解决方案 阅读详情


前言

  迟到数据,是指在watermark之后到来的数据,事件时间在水位线之前。所以只有在事件时间语义下,讨论迟到数据的处理才有意义。对于乱序流,可以设置一个延迟时间;对于窗口计算,可以设置窗口的允许延迟时间;另外可以将迟到数据输出到Side Outputs


1.Trigger

  Trigger决定窗口调用窗口函数的时间,抽象类Trigger含有的方法

onElement() called for each element that is added to a window.

onEventTime() called when a registered event-time timer fires.

onProcessingTime() called when a registered processing-time timer fires.

onMerge() elevant for stateful triggers and merges the states of two triggers when their corresponding windows merge, e.g. when using session windows.

clear() performs any action needed upon removal of the corresponding window.

在这里插入图片描述
前三个方法返回TriggerResult,对应下列枚举,决定window操作

    /** No action is taken on the window. */
    CONTINUE(false, false),

    /** {@code FIRE_AND_PURGE} evaluates the window function and emits the window result. */
    FIRE_AND_PURGE(true, true),

    /**
     * On {@code FIRE}, the window is evaluated and results are emitted. The window is not purged,
     * though, all elements are retained.
     */
    FIRE(true, false),

    /**
     * All elements in the window are cleared and the window is discarded, without evaluating the
     * window function or emitting any elements.
     */
    PURGE(false, true);

2.处理迟到数据

2.1 设置水位线延迟时间

In order to work with event time, Flink needs to know the events timestamps, meaning each element in the stream needs to have its event timestamp assigned. This is usually done by accessing/extracting the timestamp from some field in the element by using a TimestampAssigner.Timestamp assignment goes hand-in-hand with generating watermarks, which tell the system about progress in event time. You can configure this by specifying a WatermarkGenerator.

  watermark标记了event time的进展,是整个应用的全局逻辑时钟。水位线会随着数据在任务间流动,从而给每个任务指明当前的事件时间。生成水位线需要设置TimestampAssigner(分配事件时间的时间戳)和WatermarkGenerator(生成水位线的方法,on events 或者 periodically)
  当设置水位线的延迟后,所有定时器就都会按照延迟后的水位线来触发,注意一般情况不应该把延迟设置得太大,否则会大幅度降低流处理的实时性,视需求一般设在毫秒~秒级

如 处理无序流常用:

WatermarkStrategy
        .<Tuple2<Long, String>>forBoundedOutOfOrderness(Duration.ofSeconds(20))
        .withTimestampAssigner((event, timestamp) -> event.f0);

BoundedOutOfOrdernessWatermarks源码

public class BoundedOutOfOrdernessWatermarks<T> implements WatermarkGenerator<T> {

    /** The maximum timestamp encountered so far. */
    private long maxTimestamp;

    /** The maximum out-of-orderness that this watermark generator assumes. */
    private final long outOfOrdernessMillis;

    /**
     * Creates a new watermark generator with the given out-of-orderness bound.
     *
     * @param maxOutOfOrderness The bound for the out-of-orderness of the event timestamps.
     */
    public BoundedOutOfOrdernessWatermarks(Duration maxOutOfOrderness) {
        checkNotNull(maxOutOfOrderness, "maxOutOfOrderness");
        checkArgument(!maxOutOfOrderness.isNegative(), "maxOutOfOrderness cannot be negative");

        this.outOfOrdernessMillis = maxOutOfOrderness.toMillis();

        // start so that our lowest watermark would be Long.MIN_VALUE.
        this.maxTimestamp = Long.MIN_VALUE + outOfOrdernessMillis + 1;
    }

    // ------------------------------------------------------------------------

    @Override
    public void onEvent(T event, long eventTimestamp, WatermarkOutput output) {
        maxTimestamp = Math.max(maxTimestamp, eventTimestamp);
    }

    @Override
    public void onPeriodicEmit(WatermarkOutput output) {
        output.emitWatermark(new Watermark(maxTimestamp - outOfOrdernessMillis - 1));
    }
}

2.2 允许窗口处理迟到数据

When working with event-time windowing, it can happen that elements arrive late, i.e. the watermark that Flink uses to keep track of the progress of event-time is already past the end timestamp of a window to which an element belongs. See event time and especially late elements for a more thorough discussion of how Flink deals with event time.
By default, late elements are dropped when the watermark is past the end of the window. However, Flink allows to specify a maximum allowed lateness for window operators. Allowed lateness specifies by how much time elements can be late before they are dropped, and its default value is 0. Elements that arrive after the watermark has passed the end of the window but before it passes the end of the window plus the allowed lateness, are still added to the window. Depending on the trigger used, a late but not dropped element may cause the window to fire again. This is the case for the EventTimeTrigger.
In order to make this work, Flink keeps the state of windows until their allowed lateness expires. Once this happens, Flink removes the window and deletes its state, as also described in the Window Lifecycle section.
By default, the allowed lateness is set to 0. That is, elements that arrive behind the watermark will be dropped.

  对于窗口计算,如果水位线已经到了窗口结束时间,默认窗口就会关闭,那么迟到数据就要被丢弃,因此可以设置延迟时间,允许继续处理迟到数据的。默认情况下延迟时间为0,若设置延迟时间后,watermark超过窗口结束时间戳,但未超过 延迟后的时间戳,迟到数据仍然可添加到窗口中,触发计算。
  中间过程可视为,在水位线到达窗口结束时间时,先快速地输出一个近似正确的计算结果;然后保持窗口继续等到延迟数据,每来一条数据,窗口就会再次计算,并将更新后的结果输出。逐步修正计算结果,最终得到准确的统计值。

注:对于GlobalWindows,不会存在迟到数据,因为全局窗口的结束时间戳为Long.MAX_VALUE.

DataStream<T> input = ...;

input
    .keyBy(<key selector>)
    .window(<window assigner>)
    .allowedLateness(<time>)
    .<windowed transformation>(<window function>);

2.3 将迟到数据放入侧输出流

Using Flink’s side output feature you can get a stream of the data that was discarded as late.
You first need to specify that you want to get late data using sideOutputLateData(OutputTag) on the windowed stream. Then, you can get the side-output stream on the result of the windowed operation:

  窗口后关闭,仍然有迟到数据,则用侧输出流来收集关窗后的迟到数据,保证数据不丢失。因为窗口已经真正关闭,只能将之前的窗口计算结果保存下来,然后获取侧输出流中的迟到数据,判断数据所属的窗口,手动对结果进行合并更新

3.实操

3.1 代码示例

pojo对象

public class Event {
    public String user;
    public String url;
    public long timestamp;

    public Event() {
    }

    public Event(String user, String url, Long timestamp) {
        this.user = user;
        this.url = url;
        this.timestamp = timestamp;
    }

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public Long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }

    @Override
    public String toString() {
        return "Event{" +
                "user='" + user + '\'' +
                ", url='" + url + '\'' +
                ", timestamp=" + new Timestamp(timestamp) +
                '}';
    }
}

核心代码
(1) 从kakfa抽取数据,并处理为Event数据流
(2) 设置watermark
(3) window窗口操作
(4) 输出到控制台

public class LaterDataTest {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env =
                StreamExecutionEnvironment.getExecutionEnvironment();
        //设置并行度
        env.setParallelism(1);

        //读取kafka
        Properties properties = new Properties();
        properties.setProperty("bootstrap.servers", "192.168.42.102:9092,192.168.42.103:9092,192.168.42.104:9092");
        properties.setProperty("group.id", "consumer-group");
        properties.setProperty("key.deserializer",
                "org.apache.kafka.common.serialization.StringDeserializer");
        properties.setProperty("value.deserializer",
                "org.apache.kafka.common.serialization.StringDeserializer");
        properties.setProperty("auto.offset.reset", "latest");
        DataStream<Event> stream = env
                .addSource(new
                        FlinkKafkaConsumer<String>(
                        "clicks",
                        new SimpleStringSchema(),
                        properties
                ))
                .flatMap(new FlatMapFunction<String, Event>() {
                    @Override
                    public void flatMap(String s, Collector<Event> collector) throws Exception {
                        String[] split = s.split(",");
                        collector.collect(new Event(split[0], split[1], Long.parseLong(split[2])));
                    }
                });

        //水位线  乱序流 需要设置Duration和timestampAssigner
        SingleOutputStreamOperator<Event> watermarks = stream.assignTimestampsAndWatermarks(WatermarkStrategy.<Event>forBoundedOutOfOrderness(
                Duration.ofSeconds(2)).withTimestampAssigner(
                new SerializableTimestampAssigner<Event>() {
                    @Override
                    public long extractTimestamp(Event element, long recordTimestamp) {
                        return element.timestamp;
                    }
                }));
        watermarks.print("input");

        //定义一个输出标签
        OutputTag<Event> late = new OutputTag<Event>("late") {
        };

        //设置延迟时间
        SingleOutputStreamOperator<UrlViewCount> aggregate = watermarks
                .keyBy(new KeySelector<Event, String>() {
                    @Override
                    public String getKey(Event value) throws Exception {
                        return value.url;
                    }
                })
                .window(TumblingEventTimeWindows.of(Time.seconds(5)))
                .allowedLateness(Time.minutes(1))
                .sideOutputLateData(late)
                .aggregate(new AggregateFunction<Event, Long, Long>() {
                               @Override
                               public Long createAccumulator() {
                                   return 0L;
                               }

                               @Override
                               public Long add(Event value, Long accumulator) {
                                   return accumulator + 1;
                               }

                               @Override
                               public Long getResult(Long accumulator) {
                                   return accumulator;
                               }

                               @Override
                               public Long merge(Long a, Long b) {
                                   return null;
                               }
                           }
                        ,
                        new ProcessWindowFunction<Long, UrlViewCount, String, TimeWindow>() {
                            @Override
                            public void process(String s, Context context, Iterable<Long> elements, Collector<UrlViewCount> out) throws Exception {
                                long start = context.window().getStart();
                                long end = context.window().getEnd();
                                Long next = elements.iterator().next();
                                long currentWatermark = context.currentWatermark();
                                out.collect(new UrlViewCount(s + " 水位线" + currentWatermark, next, start, end));
                            }
                        }
                );

        //输出
        aggregate.print("result");
        aggregate.getSideOutput(late).print("late");
        
        env.execute();

    }
}
final OutputTag<T> lateOutputTag = new OutputTag<T>("late-data"){};

DataStream<T> input = ...;

SingleOutputStreamOperator<T> result = input
    .keyBy(<key selector>)
    .window(<window assigner>)
    .allowedLateness(<time>)
    .sideOutputLateData(lateOutputTag)
    .<windowed transformation>(<window function>);

DataStream<T> lateStream = result.getSideOutput(lateOutputTag);

3.2 中间遇到的异常

(1) 泛型擦除

Caused by: org.apache.flink.api.common.functions.InvalidTypesException: The types of the interface org.apache.flink.util.OutputTag could not be inferred. Support for synthetic interfaces, lambdas, and generic or raw types is limited at this point

在这里插入图片描述

处理:
在这里插入图片描述
改为
在这里插入图片描述

(2) 未设置并行度为1,窗口操作和预期不符
在这里插入图片描述
在这里插入图片描述
处理:
在这里插入图片描述

原因:
  在水位线的传递过程中,所有的上游并行任务符合木桶原理,最短的那一块决定了桶的水位。

3.3 结果演示

kafka生成数据

./kafka-console-producer.sh  --broker-list 192.168.42.102:9092,192.168.42.103:9092,192.168.42.104:9092 --topic clicks

水位线允许2秒延迟,窗口允许1分钟迟到数据,之后的迟到数据发送到late标签的侧输出流中
(1) 消费到时间戳7000的数据,此时窗口水位线时间戳4999
在这里插入图片描述
在这里插入图片描述
(2)时间戳7000之后的迟到数据,仍然触发窗口计算
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(3)接收到时间戳67000窗口关闭后,迟到数据写入侧输出流,需要手动合并

在这里插入图片描述
在这里插入图片描述

4. 迟到数据触发窗口计算重复结果处理

When specifying an allowed lateness greater than 0, the window along with its content is kept after the watermark passes the end of the window. In these cases, when a late but not dropped element arrives, it could trigger another firing for the window. These firings are called late firings, as they are triggered by late events and in contrast to the main firing which is the first firing of the window. In case of session windows, late firings can further lead to merging of windows, as they may “bridge” the gap between two pre-existing, unmerged windows.
The elements emitted by a late firing should be treated as updated results of a previous computation, i.e., your data stream will contain multiple results for the same computation. Depending on your application, you need to take these duplicated results into account or deduplicate them.

  late firings更新计算结果后,数据流中将包含同一窗口计算的多个结果,需要对重复数据进行删除

理解Flink窗口机制 如何理解窗口,如何使用窗口,如何设置水位线,如何优化窗口性能 阅读详情

相关推荐

Flink实时计算核心原理与实践:从时间状态到流处理架构深度解析

流处理技术是处理海量、高速、持续数据流的核心架构范式,其核心在于对无界数据的有序处理与状态管理。其基本原理是通过事件时间、水位线等机制处理乱序数据,并借助状态管理和检查点机制保障计算的一致性与容错性。这项技术的核心价值在于实现从传统批处理的事后分析到实时流处理的事中决策的跨越,支撑低延迟、高吞吐的数据处理需求。典型应用场景包括实时风控、实时监控、实时推荐和实时ETL等。本文以Apache Flink为例,深入剖析其四大基石——时间、状态、检查点和窗口,并结合生产环境中的状态后端选型与检查点调优等热词,提供从

weixin_30323631的博客 346

Flink应如何处理窗口中迟到的数据?

Flink如何处理迟到的数据? 1 设置水位线延迟时间 2.允许窗口处理迟到数据 3.将迟到数据放入窗口侧输出流

qq_43147161的博客 2370

Kafka消息时间戳 - 如何在Kafka中设置和使用消息时间戳

Kafka消息时间戳是消息处理和分析中的关键要素。本文详细介绍了在Kafka中设置和使用消息时间戳的方法。对于生产者时间戳,我们可以通过在生产者代码中设置属性来指定时间戳类型。示例代码展示了如何在Java中设置生产者时间戳,并将当前时间附加到消息中。对于服务端时间戳,Kafka会自动为消息分配时间戳,无需任何额外配置。在消费者代码中,我们可以通过方法访问服务端时间戳。示例代码展示了如何获取服务端时间戳并对消息进行进一步处理。通过使用适当的时间戳类型,我们可以在Kafka中实现基于时间的排序和处理。

YazIdris的博客 1427

Flink之窗口 (Window) 下篇

定义了窗口分配器,我们只是知道了数据属于哪个窗口,可以将数据收集起来了;至于收集起来到底要做什么,其实还完全没有头绪。所以在窗口分配器之后,必须再接上一个定义窗口如何进行计算的操作,这就是所谓的“窗口函数”(window functions)。 经窗口分配器处理之后,数据可以分配到对应的窗口中,而数据流经过转换得到的数据类型是 WindowedStream。这个类型并不是 DataStream,所以并不能直接进行其他转换,而必须进一步调用窗口函数,对收集到的数据进行处理计算之后,才能最终再次得到 Data

四维大脑的博客 1128

彻底搞懂 Flink 乱序:Watermark、Allowed Lateness 与 Side Output 的三角博弈

很多开发同学在写代码时,习惯性地忽略,觉得这就几条数据,丢了就丢了。大错特错。在金融结算、广告计费这种对数据精度要求极高的场景下,万分之一的丢数率都可能导致对账对不上,最后是你背锅扣绩效。Side Output 的价值不在于“实时计算”,而在于“证据保留”。它的工作机制非常直白:凡是错过了 Allowed Lateness 宽限期的数据,都会被 Flink 打上一个特殊的标签(Tag),扔进一条独立的流里。主流(Main Stream)里你看不到它们,窗口计算逻辑也不理它们。但你需要把它们“捞”出来。

大模型大数据攻城狮的专栏 1162

Obsidian跨设备同步实战:阿里云OSS与Remotely Save插件配置指南

本文详细介绍了如何利用阿里云OSS对象存储与Remotely Save插件,为Obsidian笔记软件搭建一个低成本、高可靠性的私有化多端同步方案。从创建OSS Bucket、配置CORS规则、生成子账户密钥,到插件安装与多设备同步策略,提供了完整的实战配置指南,有效解决Obsidian用户的跨设备同步痛点。

qsc901234567的博客 1284

Flink之迟到的数据

IntervalJoin : 以一条流中数据的时间为基准, 设定上界和下界, 形成一个时间范围, 另外一条流中相同key的数据如果能落到对应的时间范围内, 即可join成功。WindowJoin: 在同一个窗口内的相同key的数据才能join成功。解决某条流长时间没有数据,不能推进水位线,导致下游窗口的窗口无法正常计算。

qq_44273739的博客 509

RocketMQ 5.3.1 集成 Spring Boot 3.4.3 就这么简单

RocketMQ 是一个分布式消息中间件,支持发布/订阅模型,具有高吞吐量、高可用性和事务消息等特性。它广泛应用于日志处理、订单系统和异步任务等场景。Spring Boot 3.4.3 集成 RocketMQ 5.3.1 的过程异常简单,仅需少量配置即可实现消息的生产和消费。本文从环境搭建到代码实现,覆盖了核心步骤。

lssffy的博客 1388

Flink窗口机制详解:时间语义、水位线与迟到数据实践

流式计算面对无界数据,如何划分边界是实时计算的核心难题。窗口机制应运而生,将无穷数据流切片为有限区间,支撑每5分钟统计、最近N分钟监控等经典场景。理解窗口必须先厘清事件时间与处理时间,事件时间能真实反映业务发生顺序,但需配合水位线机制判断数据完整度,从而决定窗口何时触发与关闭。乱序、迟到是生产环境的常态,通过allowedLateness或侧输出可优雅补偿,确保结果准确。合理选择滚动、滑动、会话窗口及窗口函数,结合状态清理与触发调优,才能让Flink窗口在真实业务中稳定可靠。本文从原理到工程实践,系统梳理窗

weixin_34208185的博客 293

个人整理的数据集(手写中文数据、发票数据、快递单数据、车牌数据)

本人在工作生活中收集了各个方面比较多的真实的数据集如下: 一、手写中文数据集 1、档案类数据: 此数据集为手写档案数据,数量较大,大约128G,图像均未标注。 ex: 2、手写作文数据: 此数据集为手写作文数据,是大约800M左右,图像按行提供位置和内容标注,十分珍贵。 ex: 二、发票数据集: 1、增值税发票 此数据集包含了大量真实的增值税发票数据,大约9G,标注了发票位置数据,未提供详细标注。 ex: 2、购车发票 此数据集未提供标注。

weixin_43143224的博客 5882

DEA各种模型原理及stata代码实现

DEA各种模型原理及stata代码实现DEA各种模型原理及stata代码实现一、CCR和BCC1.原理2.效率测算stata代码3.Malmquist指数3.1M指数3.2Global-Malmquist指数4.指数计算代码与案例二、SBM模型1.原理2.stata代码实现三、方向性距离函数(DDF)1.原理2.stata代码实现3.非径向DDF模型(NDDF)3.GML指数4.指数测算四、总结 DEA各种模型原理及stata代码实现 一、CCR和BCC 1.原理 CCR模型产出导向下的效率通过求解以下规划

wonder1322的博客 4万+

Flink DataStream 窗口(Windows)完全指南:Assigner、触发器、驱逐器与迟到数据处理

窗口(Window)是 Flink 处理无限数据流的核心机制,它将无界的流切分成有限大小的"桶"(bucket),从而允许在桶上执行聚合、统计等有界计算。本文以 Flink DataStream API 为主线,完整讲解窗口生命周期、Keyed/Non-Keyed 窗口的区别、四种内置窗口分配器(Tumbling / Sliding / Session / Global)、三类窗口函数(`Redu

gitblog_00936的博客 482

NIDS——suricata(一)

NIDS——suricata环境安装和规则编写

weixin_58666006的博客 1273

Flink窗口机制深度解析:从窗口类型选型到水位线与迟到数据处理实战

在流处理领域,无界数据流的聚合与统计需要依赖窗口机制将无限数据切分为有界片段。其核心原理是通过WindowAssigner按时间或数量划分窗口,结合Trigger触发计算,并利用Watermark处理乱序事件,从而在保证结果可复现的同时实现低延迟的实时计算。合理运用窗口机制能够有效支撑实时监控、用户行为分析、计费对账等场景。Flink作为流处理引擎,其窗口API提供了滚动、滑动、会话、全局四种基础窗口类型,并支持Event Time与Processing Time两种时间语义。深入理解窗口生命周期、水位线生

weixin_29056865的博客 236

基于Django+Vue3的智能目标检测系统设计与实现,Vue3前台系统+Django后台管理系统开发,Web前后端分离,YOLOv8 Web目标检测,实现图片、视频和摄像头检测等功能,全网独发

目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。YOLO系列模型由于其高效的检测速度和较高的准确率,成为目标检测任务的首选算法之一。本项目结合 YOLOv8 与 Django + Vue3,构建一个Vue3前台系统+Django后台管理系统开发,便于用户进行目标检测的操作和展示,实现对图片、视频实时目标检测,不仅可以用于大论文的工作量展示,还可以作为毕业设计。支持更换自己模型、图片检测、实时视频检测、置信度调节和IoU参数调节。同时支持目标检测、实例分割、关键点检测等任务

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 5434

全网最强AI辅助课题申报教程!超详细流程拆解,助你快速提高课题申报成功率(附各部分高效提示词)

实验法要详细说明自变量、因变量、实验类型、实验过程、实验步骤、测量工具名称、被试取样方式、无关变量控制方法。这个部分就是让评审专家相信我们有能力把这个项目干成,写的时候要重点突出两块内容:第一是研究基础,包括你或团队在相关领域已有的研究成果,比如发表的论文、承担过的课题、获得过的奖励、相关研究经验等,要具体、有说服力;课题申报专门给我们留了一小节用来突出课题的创新之处,不管是研究角度、研究对象、研究方法,还是应用价值都可以提炼作为我们的创新点,最后的语气成果也要明确具体,且要和课题内容紧密相关。

智能AI让学术科研更容易 665

Flink窗口触发器Trigger深度解析:掌控实时计算输出时机

在流处理中,窗口计算的输出时机并非由时间或数据量单方面决定,而是由触发器(Trigger)这一状态化决策组件精准控制。Trigger作为Flink窗口生命周期内的核心调度单元,通过onElement、onEventTime等回调方法,结合水位线(Watermark)、处理时间与自定义状态,实现事件时间驱动、条数驱动或业务语义驱动的灵活触发。其技术价值在于解耦‘何时计算’与‘如何计算’,支撑毫秒级告警、乱序容忍、延迟补算等关键能力。典型应用场景包括实时风控中的连续失败检测、大屏监控的周期快照、日志分析的阈值告

weixin_30952479的博客 276

NSIS教程(6): 使用第三方插件

NSIS内置了很多指令,这些指令可以满足我们基本需求,但难免会遇到NSIS没有内置的功能,如进程操作,后台运行(即多线程),7z压缩等等,这个时候我们就需要借助第三方插件来满足我们所需要的功能了。 一、插件获取 NSIS官方收录插件的网址是:http://nsis.sourceforge.net/Category:Plugins,我们可以在这个网站上查找和下载我们需要的插件,该网站上针对每

while(1) { smile(); } 9万+

Flink窗口Trigger原理与生产级实战指南

在流式计算中,窗口触发器(Trigger)是决定数据何时输出的核心机制,它基于事件时间、处理时间或元素数量等条件,对窗口生命周期进行精细化控制。其本质是轻量级的条件评估器,而非定时器,需严格遵循低延迟、无I/O、O(1)状态检查等工程约束。正确理解FIRE、FIRE_AND_PURGE、CONTINUE和PURGE四大行为,可避免重复计算、状态膨胀与数据丢失等高频故障。结合ContinuousEventTimeTrigger、自定义防抖动Trigger及sideOutputLateData等技术,能兼顾实时

weixin_29032337的博客 301

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Flink Trigger深度解析:窗口触发机制与生产级定制指南

Flink窗口触发(Trigger)是实时计算中控制数据何时计算、输出与清理的核心机制,其本质是一个带状态的决策状态机,而非简单的时间判断函数。它基于事件时间、处理时间或元素数量等维度,协同Watermark、WindowAssigner和StateBackend共同决定窗口生命周期的关键节点。理解Trigger原理对解决窗口不触发、重复触发、乱序丢数、状态泄漏等高频问题至关重要。本文结合EventTimeTrigger、ContinuousEventTimeTrigger、CountTrigger等内置实

weixin_28235513的博客 270

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于Arc构建自己的时序应用:Python SDK、Grafana数据源与arcli CLI生态完整指南

Arc 是一个开源的 SQL 原生时序数据库:单个静态二进制即可运行,写入吞吐可达 3800万+ 条记录/秒,数据以开放的 Parquet 格式直接落在你的本地磁盘、S3 或 Azure 存储上。本文面向新手,带你用 **Python SDK** 从应用里读写数据、用 **Grafana 数据源插件** 快速搭建时序看板、用 **arcli 命令行** 管理连接与日常运维,几分钟就能拥有自己的时序

gitblog_00056的博客 1025

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Flink乱序数据处理与Watermark机制实战指南

在实时流处理系统中,乱序数据是影响计算准确性的关键挑战。事件时间(Event Time)和处理时间(Processing Time)的偏差会导致统计结果失真,而Watermark机制正是解决这一问题的核心技术。通过设置合理的延迟容忍窗口(如maxOutOfOrderness参数),系统能在保证吞吐量的同时处理迟到数据。Flink框架提供了固定延迟、单调递增及自定义生成器等多样化Watermark策略,结合allowedLateness和SideOutput等特性,可灵活应对物流追踪、实时监控等场景。本文通过

weixin_29058331的博客 320

Flink窗口机制详解:时间语义、水位线与触发器实战

实时计算中,乱序数据与延迟到达是绕不开的挑战,而窗口机制正是解决这类问题的核心手段。理解事件时间与处理时间的区别,是掌握窗口计算的基础;水位线则用于判断数据是否到齐,决定窗口何时触发输出。Flink提供了滚动、滑动、会话和全局四种窗口,分别适用于固定周期统计、最近指标监控、用户行为分析及自定义触发逻辑等场景。增量聚合函数能在内存压力和数据准确性之间取得平衡,而允许延迟与侧输出流则为迟到数据提供了优雅的处理通道。只有透彻理解时间语义、水位线与触发器的配合关系,才能真正避免数据不触发或结果不准的隐患。本文从基础

weixin_29062671的博客 246

Flink窗口机制深度解析:从水位线到状态管理的工程实践

流式计算中的窗口机制,本质是在无限、无序、低延迟约束下实现确定性聚合的核心范式。它依托事件时间语义与水位线(Watermark)建立数据完整性承诺,通过WindowAssigner、Trigger、Evictor和ProcessWindowFunction四层组件协同调度状态生命周期。其技术价值在于平衡准确性、延迟与资源开销三大不可兼得目标,广泛应用于实时风控、GMV统计、用户会话分析等关键场景。本文聚焦Flink窗口的真实运行逻辑,深入剖析EventTime触发原理、allowedLateness与侧输出

weixin_29038345的博客 266

时间窗口:流数据处理中的核心模型与实战应用

在流式计算和实时数据处理领域,对连续无界的数据流进行分段聚合是核心需求。时间窗口作为一种基础且强大的抽象模型,通过定义固定或动态的时间区间,实现了对无限数据流的有限化处理。其技术价值在于能够高效、准确地计算与时间强相关的指标,如移动平均、实时计数和会话分析。从原理上看,时间窗口主要分为滚动窗口、滑动窗口和会话窗口,分别适用于不同的业务场景。在工程实践中,结合事件时间语义和水位线机制,可以有效处理乱序数据,保障计算结果的准确性。这些技术被广泛应用于实时监控、金融风控、用户行为分析等场景,例如,通过滑动窗口实时

chuange6363的博客 469

Flink窗口机制深度解析:状态驱动而非时间切片

Apache Flink的窗口(Window)是流处理中实现时间语义计算的核心抽象,其本质并非简单的时间分片,而是基于事件时间、状态管理和触发条件协同运作的动态计算单元。它依托Watermark对齐乱序数据,通过WindowAssigner分配窗口、Trigger控制计算时机、StateBackend持久化中间结果,从而在分布式环境下保障精确一次(exactly-once)语义。该机制支撑实时统计、会话分析、风控聚合等典型场景,尤其适用于电商大促、物联网轨迹、广告计费等对延迟与准确性双敏感的业务。本文深入剖

weixin_29061821的博客 230
上一篇: flink kafka写入jdbc数据库mysql,JdbcSink源码
下一篇: java应用CPU占用过高分析、C2 Compiler Thread高CPU占用分析
但行益事莫问前程
但行益事莫问前程 新星创作者: 数据库技术领域 新星创作者: 数据库技术领域
博客等级 码龄7年 8490粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值