Flink 时间概念和水位

flink生成Watermark之assignTimestampsAndWatermarks 在DataStreamSource对象上调用assignTimestampsAndWatermarks方法,自定义Timestamp提取规则和Watermark生成规则。 文章目录基于AssignerWithPeriodicWatermarks接口 基于AssignerWithPeriodicWatermarks接口 AssignerWithPeriodicWatermarks接口扩展自TimestampAssigner类,其中extractTimestamp方法定义抽取Timestamp,getCurre 阅读详情

Flink 时间概念和水位

Flink 时间语义和水位相关博客

Flink_window

Flink-时间语义与Wartmark及EventTime在Window中的使用

一、Flink中的时间语义

在这里插入图片描述

Flink中包括三种时间。

  1. Event Time:事件(数据)创建时间。
  2. Ingetstion Time:数据进入Flink的时间。
  3. Processing Time:执行操作算子的本地系统时间,与机器无关。

Event Time是事件创建的时间。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink通过时间戳分配器访问事件时间戳。

在这里插入图片描述

不同的时间语义有不同的应用场合。

一般更关心事件时间(Event Time)。

在这里插入图片描述

这里假设玩游戏,一分钟内如果过5关就有奖励。用户坐地铁玩游戏,进入隧道前已经过3关,在隧道中又过了2关。但是信号不好,后两关通关的信息,等到出隧道的时候(8:23:20)才正式到达服务器。

如果为了用户体验,那么应该按照Event Time处理信息,保证用户获得游戏奖励。

Event Time可以从日志数据的时间戳(timestamp)中提取

2017-11-02 18:37:15.624 INFO Fail over to rm2

二、Event Time的引入

在Flink的流式处理中,绝大部分的业务都会使用eventTime ,一般只在eventTime无法使用时,才会被迫使用ProcessingTime或者IngestionTime。

虽然默认环境里使用的就是ProcessingTime,使用EventTime需要另外设置。如果要使用EventTime,那么需要引入EventTime的时间属性,引入方式如下所示:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

这里只是设置使用EventTime,具体的时间还需要提取数据的时间戳。

三、WaterMark 水印

相关博客:

Flink流计算编程–watermark(水位线)简介

Flink-时间语义与Wartmark及EventTime在Window中的使用

3.1 概念

  • Flink对于迟到数据有三层保障,先来后到的保障顺序是:
    1. WaterMark => 约等于放宽窗口标准
    2. allowedLateness => 允许迟到(ProcessingTime超时,但是EventTime没超时)
    3. sideOutputLateData => 超过迟到时间,另外捕获,之后可以自己批处理合并先前的数据

Flink中,流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的,大部分情况下,流到operator的数据都是按照时间产生的时间顺序来的,但是有可能由于网络、分布式等原因,导致乱序的产生所谓乱序,就是指Flink接受到的事件的前后顺序是乱序的,不是按照Event Time来排序的。

在这里插入图片描述

那么此时出现一个问题,一旦出现乱序,如果只根据 eventTime 决定 window 的运行,我们不能明确数据是否全部到位,但又不能无限期的等下去,此时必须要有个机制来保证一个特定的时间后,必须触发 window 去进行计算了,这个特别的机制,就是 Watermark。

在这里插入图片描述

  • 当Flink以Event Time模式处理数据流时,它会根据数据里的时间戳来处理基于时间的算子。

    比如5s一个窗口,那么理想情况下,遇到时间戳是5s的数据时,就认为[0,5s)时间段的桶bucket就可以关闭了。

  • 实际由于网络、分布式传输处理等原因,会导致乱序数据的产生。

  • 乱序数据会导致窗口计算不准确

    如果按照前面说法,获取到5s时间戳的数据,但是2s,3s乱序数据还没到,理论上不应该关闭桶。


  • 怎样避免乱序数据带来的计算不正确?

    遇到一个时间戳达到了窗口关闭时间,不应该立即触发窗口计算,而是等待一段时间,等迟到的数据来了再关闭窗口。

    这个更待一段时间的机制,就是WaterMark水位的机制。

  • 那什么是WaterMark水位?

    1. Watermark是一种衡量Event Time进展的机制,可以设定延迟触发。

    2. Watermark是用于处理乱序事件的,而正确的处理乱序事件,通常用Watermark机制结合window来实现。

    3. 数据流中的Watermark用于表示”timestamp小于Watermark的数据,都已经到达了“,因此,window的执行也是由Watermark触发的。

    4. Watermark可以理解成一个延迟触发机制,我们可以设置Watermark的延时时长t, 每次系统会校验已经到达的数据中最大的maxEventTime,然后认定eventTime小于maxEventTime - t的所有数据都已经到达 , 如果有窗口的停止时间等于maxEventTime – t,那么这个窗口被触发执行。

      Watermark = maxEventTime-延迟时间t

    5. watermark 用来让程序自己平衡延迟和结果正确性。

watermark可以理解为把原本的窗口标准稍微放宽了一点。比如原本5s,设置延迟时间=2s,那么实际等到7s的数据到达时,才认为是[0,5)的桶需要关闭了。


有序流的Watermarker如下图所示:(延迟时间设置为0s)

此时以5s一个窗口,那么EventTime=5s的元素到达时,关闭第一个窗口,下图即W(5),W(10)同理。

在这里插入图片描述

乱序流的Watermarker如下图所示:(延迟时间设置为2s)

乱序流,所以可能出现EventTime前后顺序不一致的情况,这里延迟时间设置2s,第一个窗口则为 5s+2s,当EventTime=7s的数据到达时,关闭第一个窗口。第二个窗口则是 5*2+2=12s,当12s这个EventTime的数据到达时,关闭第二个窗口。

在这里插入图片描述

当Flink接收到数据时,会按照一定的规则去生成Watermark,这条 Watermark就等于当前所有到达数据中的maxEventTime - 延迟时长 ,也就是说, Watermark是基于数据携带的时间戳生成的 ,一旦Watermark比当前未触发的窗口的停止时间要晚,那么就会触发相应窗口的执行。

由于event time是由数据携带的,因此,如果运行过程中无法获取新的数据,那么没有被触发的窗口将永远都不被触发 。

上图中,我们设置的允许最大延迟到达时间为2s,所以时间戳为7s的事件对应的Watermark是5s,时间戳为12s的事件的Watermark是10s,如果我们的窗口1是 1s~5s,窗口2是 6s~10s,那么时间戳为7s的事件到达时的Watermarker恰好触发窗口1,时间戳为12s的事件到达时的Watermark恰好触发窗口2。

Watermark 就是触发前一窗口的“关窗时间”, 一旦触发关门,那么以当前时刻为准,在窗口内的所有数据都会收入窗口中。

只要没有达到水位那么不管现实中的时间推进了多久都不会触发关窗。

3.2 Watermark 的特点及传递

在这里插入图片描述

  • watermark 是一条特殊的数据记录
  • watermark 必须单调递增 ,以确保任务的事件时间时钟在向前推进,而不是在后退
  • watermark 与数据的时间戳相关

在这里插入图片描述

  1. 图一,当前Task有四个上游Task给自己传输WaterMark信息,通过比较,只取当前最小值作为自己的本地Event-time clock,上图中,当前Task[0,2)的桶就可关闭了,因为所有上游中2s最小,能保证2s的WaterMark是准确的(所有上游Watermark都已经>=2s)。这时候将Watermark=2广播到当前Task的下游。
  2. 图二,上游的Watermark持续变动,此时Watermark=3成为新的最小值,更新本地Task的event-time clock,同时将最新的Watermark=3广播到下游
  3. 图三,上游的Watermark虽然更新了,但是当前最小值还是3,所以不更新event-time clock,也不需要广播到下游
  4. 图四,和图二同理,更新本地event-time clock,同时向下游广播最新的Watermark=4

3.3 Watermark的引入

watermark的引入很简单,对于乱序数据,最常见的引用方式如下:

dataStream.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<SensorReading>(Time.seconds(2)) {
    @Override
    public long extractTimestamp(SensorReading sen) {
        return sen.getTimestamp() * 1000L;
    }
});

Event Time的使用一定要指定数据源中的时间戳。否则程序无法知道事件的事件时间是什么(数据源里的数据没有时间戳的话,就只能使用Processing Time了)

上面的例子中创建了一个看起来有点复杂的类,这个类实现的其实就是分配时间戳的接口。Flink暴露了TimestampAssigner接口供我们实现,使我们可以自定义如何从事件数据中抽取时间戳

dataStream.assignTimestampsAndWatermarks(new MyAssigner());

MyAssigner有两种类型

  • AssignerWithPeriodicWatermarks
  • AssignerWithPunctuatedWatermarks

以上两个接口都继承自TimestampAssigner。

时间戳分配器

  • AssignerWithPeriodicWatermarks

    • 周期性的生成watermark,系统会周期性的将watermark插入到流中。
    • 默认的周期是200毫秒,可以使用ExecutionConfig.setAutoWatermarkInterval()方法进行设置。
    • 升序和乱序的处理的函数BoundedOutOfOrderness,都是基于周期性watermark的。
  • AssignerWithPunctuatedWatermarks

    • 没有时间周期规律,可打断的生成 watermark(即可实现每次获取数据都更新watermark)

3.4 Watermark的设定

  • 在Flink中,Watermark由应用程序开发人员生成,这通常需要对相应的领域有一定的了解
  • 如果Watermark设置的延迟太久,收到结果的速度可能就会很慢,解决办法是在水位线到达之前输出一个近似结果
  • 如果Watermark到达得太早,则可能收到错误结果,不过Flink处理迟到数据的机制可以解决这个问题

一般大数据场景都是考虑高并发情况,所以一般使用周期性生成Watermark的方式,避免频繁地生成Watermark。

注:一般认为Watermark的设置代码,在里Source步骤越近的地方越合适。

3.5 测试代码

测试Watermark和迟到数据

package com.root.window;

import com.root.SensorReading;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.timestamps.AscendingTimestampExtractor;
import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.OutputTag;

/**
 * @author Kewei
 * @Date 2022/3/6 16:32
 */

public class WindowTest2_Watermark {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 新版Flink1.12.x不需要设置了,默认是使用的EventTime。这里使用的是旧版,所以需要设置一下。
        env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
        env.setParallelism(1);

        DataStreamSource<String> inputStream = env.socketTextStream("localhost", 7777);

        SingleOutputStreamOperator<SensorReading> dataStream = inputStream.map(line -> {
            String[] field = line.split(",");
            return new SensorReading(field[0], new Long(field[1]), new Double(field[2]));
        });

        //旧版 (新版官方推荐用assignTimestampsAndWatermarks(WatermarkStrategy) )
        // 乱序数据设置事件时间和watermark
        SingleOutputStreamOperator<SensorReading> dataStreamWithWater = dataStream.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<SensorReading>(Time.seconds(2)) {
            @Override
            public long extractTimestamp(SensorReading sen) {
                return sen.getTimestamp() * 1000L;
            }
        });

        // 升序数据设置事件时间和watermark
//        dataStream.assignTimestampsAndWatermarks(new AscendingTimestampExtractor<SensorReading>() {
//            @Override
//            public long extractAscendingTimestamp(SensorReading element) {
//                return element.getTimestamp() * 1000L;
//            }
//        })

        OutputTag<SensorReading> outputTag = new OutputTag<SensorReading>("late") {
        };

        // 基于id分组开窗,统计15s内的最低温度。
        SingleOutputStreamOperator<SensorReading> resultStream = dataStreamWithWater.keyBy("id")
                .timeWindow(Time.seconds(15))
                .allowedLateness(Time.seconds(1))
                .sideOutputLateData(outputTag)
                .minBy("temperature");

        resultStream.print("min");
        resultStream.getSideOutput(outputTag).print("late");

        env.execute();
    }
}

启动本地socket,输入数据,查看结果

nc -lk 7777

输入:

sensor_1,1547718199,35.8
sensor_6,1547718201,15.4
sensor_7,1547718202,6.7
sensor_10,1547718205,38.1
sensor_1,1547718207,36.3
sensor_1,1547718211,34
sensor_1,1547718212,31.9
sensor_1,1547718212,31.9
sensor_1,1547718212,31.9
sensor_1,1547718212,31.9

输出

注意:上面输入全部输入后,才突然有下面4条输出!

min> SensorReading{id='sensor_1', timestamp=1547718212, temperature=31.9}
min> SensorReading{id='sensor_10', timestamp=1547718205, temperature=38.1}
min> SensorReading{id='sensor_7', timestamp=1547718202, temperature=6.7}
min> SensorReading{id='sensor_6', timestamp=1547718201, temperature=15.4}

分析代码:

  1. 计算窗口的起始位置Start和结束位置End

    从 TumblingProcessingTimeWindows类里的 assignWindows方法,我们可以得知窗口的起点计算方法如下:
    窗口起点start = timestamp - (timestamp -offset+WindowSize) % WindowSize
    由于我们没有设置offset,所以这里 start=**第一个数据的时间戳1547718199-(1547718199-0+15)%15=1547718195**

    计算得到窗口初始位置为 Start = 1547718195,那么这个窗口理论上本应该在1547718195+15的位置关闭,也就是 End=1547718210

    @Override
    public Collection<TimeWindow> assignWindows(
      Object element, long timestamp, WindowAssignerContext context) {
      final long now = context.getCurrentProcessingTime();
      if (staggerOffset == null) {
        staggerOffset =
          windowStagger.getStaggerOffset(context.getCurrentProcessingTime(), size);
      }
      long start =
        TimeWindow.getWindowStartWithOffset(
        now, (globalOffset + staggerOffset) % size, size);
      return Collections.singletonList(new TimeWindow(start, start + size));
    }
    
    // 跟踪 getWindowStartWithOffset 方法得到TimeWindow的方法
    public static long getWindowStartWithOffset(long timestamp, long offset, long windowSize) {
      return **timestamp - (timestamp - offset + windowSize) % windowSize**;
    }
    
    1. 计算修正后的window输出结果的时间

      测试代码中Watermark设置的maxOutOfOrderness最大乱序程度是2s,所以实际获取到End+2s的时间戳数据时(达到Watermark),才认为Window需要输出计算的结果(不关闭,因为设置了允许迟到1min)

      所以实际应该是1547718212的数据到来时才触发Window输出计算结果。

      .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<SensorReading>(Time.seconds(2)) {
        @Override
        public long extractTimestamp(SensorReading element) {
          return element.getTimestamp() * 1000L;
        }
      });
      
      // BoundedOutOfOrdernessTimestampExtractor.java
      public BoundedOutOfOrdernessTimestampExtractor(Time maxOutOfOrderness) {
        if (maxOutOfOrderness.toMilliseconds() < 0) {
          throw new RuntimeException(
            "Tried to set the maximum allowed "
            + "lateness to "
            + maxOutOfOrderness
            + ". This parameter cannot be negative.");
        }
        this.maxOutOfOrderness = maxOutOfOrderness.toMilliseconds();
        this.currentMaxTimestamp = Long.MIN_VALUE + this.maxOutOfOrderness;
      }
      @Override
      public final Watermark getCurrentWatermark() {
        // this guarantees that the watermark never goes backwards.
        long potentialWM = currentMaxTimestamp - maxOutOfOrderness;
        if (potentialWM >= lastEmittedWatermark) {
          lastEmittedWatermark = potentialWM;
        }
        return new Watermark(lastEmittedWatermark);
      }
      
    2. 为什么上面输入中,最后连续四条相同输入,才触发Window输出结果?

      • Watermark会向子任务广播
        • 我们在map才设置Watermark,map根据Rebalance轮询方式分配数据。所以前4个输入分别到4个slot中,4个slot计算得出的Watermark不同(分别是1547718199-2,1547718201-2,1547718202-2,1547718205-2)
      • Watermark传递时,会选择当前接收到的最小一个作为自己的Watermark
        • 前4次输入中,有些map子任务还没有接收到数据,所以其下游的keyBy后的slot里watermark就是Long.MIN_VALUE(因为4个上游的Watermark广播最小值就是默认的Long.MIN_VALUE)
        • 并行度4,在最后4个相同的输入,使得Rebalance到4个map子任务的数据的currentMaxTimestamp都是1547718212,经过getCurrentWatermark()的计算(currentMaxTimestamp-maxOutOfOrderness),4个子任务都计算得到watermark=1547718210,4个map子任务向4个keyBy子任务广播watermark=1547718210,使得keyBy子任务们获取到4个上游的Watermark最小值就是1547718210,然后4个KeyBy子任务都更新自己的Watermark为1547718210。
      • 根据Watermark的定义,我们认为>=Watermark的数据都已经到达。由于此时watermark >= 窗口End,所以Window输出计算结果(4个子任务,4个结果)

3.6 窗口起始点和偏移量

相关博客:flink-Window Assingers(窗口分配器)中offset偏移量

时间偏移一个很大的用处是用来调准非0时区的窗口,例如:在中国你需要指定一个8小时的时间偏移。

flink 时间语义、水位线(Watermark)、生成水位线、水位线的传递   在flink中,当希望对数据按照时间窗口来进行收集计算时,时间的衡量标准就非常重要   如图:在事件发生之后,生成的数据被收集起来,首先进入分布式消息队列,然后被 Flink 系统中的 Source 算子读取消费,进而向下游的转换算子(窗口算子)传递,最终由窗口算子进行计算处理。   在这个过程中,有两个非常重要的时间点:一个是数据产生的时间,把它叫作(Event Time);另一个是数据真正被处理的时刻,叫作(Processing Time);窗口操作以那种时间作为衡量标准,就是所谓的(Notion 阅读详情

相关推荐

flink学习之水位线

flink 水位线是什么

2301_80792800的博客 1389

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

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

qq_43147161的博客 2370

【Flink】Flink 中的时间语义和水位线

水位线是一种特殊的事件,由程序员通过编程插入的数据流里面,然后跟随数据流向下游流动。

克里斯的博客 2803

大数据专家教你学Flink:用EventTime与WaterMark进行流数据处理

最简单的情况下,这也最容易理解:所有进入到Flink处理系统的流数据,都是在外部的其它系统中产生的,它们产生后具有了事件时间,经过传输后,进入到Flink处理系统,理论上(如果所有系统都具有相同系统时钟)该事件时间对应的时间戳要早于进入到Flink处理系统中进行处理的时间戳,但实际应用中会出现数据记录乱序、延迟到达等问题,这也是非常普遍的。WaterMark带有一个时间戳,假设为X,进入到数据处理系统中的数据元素具有事件时间,记为Y,如果Y

2401_83384536的博客 1531

【FLink】水位线(Watermark)

在Flink中,用来衡量事件时间进展的标记,就被称作“水位线”(Watermark)。说白了就是事件时间戳。

lxtx 6044

Flink 源码解读系列 DataStream 带 Watermark 生成的时间戳分配器

这篇文章主要从源码角度讲一下 Flink DataStream 中带 Watermark 生成的时间戳分配器。我们通常通过 DataStream 的 assignTimestampsAndWatermarks 方法分配时间戳并生成 Watermark。这两种时间戳分配器均是 TimestampAssigner 的子类,具体继承关系如下图所示。在为元素分配时间戳的基础之上增加了生成 Watermark 的逻辑,可以理解是一个实现 Watermark 生成逻辑的时间戳分配器。

SmartSi 1422

flink assignTimestampsAndWatermarks两种水印生成方式 源码分析

时间戳和水印的时间生成方式一般有一下两种方式 1、BoundedOutOfOrdernessTimestampExtractor AscendingTimestampExtractor

weixin_40809627的博客 1万+

别再让步进电机‘发烧’了!用FOC闭环驱动实现精准力矩控制(基于P0斩波恒流版)

本文详细介绍了如何利用FOC闭环驱动技术(基于P0斩波恒流版)解决步进电机过热和力矩控制不精准的问题。通过对比传统开环控制的缺陷,展示了FOC在降低温度、提升精度和能效方面的显著优势,并提供了硬件配置、软件实现及性能优化的完整方案。

weixin_30872157的博客 566

【Flink】Flink时间概念与水位线

注意:本篇博客中的所有解释都是在滚动窗口的前提下 目录1 时间概念类型1.1 事件生成时间(Event Time)1.2 事件接入时间(Ingestion Time)1.3 事件处理时间(Processing Time)1.4 指定时间概念2 water_mark(水位线)2.1 water_mark是如何生成的?2.2 最大允许乱序时间如何理解?2.3 Flink中的water_marker机制 1 时间概念类型 1.1 事件生成时间(Event Time)     在事件时间模式下,Flink流式应用处

大白 1157

逆向工程视角:MFI芯片通信协议在Linux环境下的行为分析

本文从逆向工程角度深入分析了MFI芯片在Linux环境下的通信协议行为,重点探讨了树莓派与MFI芯片通过I2C接口交互的技术细节。文章详细介绍了信号捕获、协议栈逆向、动态调试技巧以及安全机制分析,为开发者提供了在Linux驱动层面实现MFI认证的实用方法。

time3的博客 175

OPTI Toolbox v2.28 安装与 3 个求解器补全:SCIP、SeDuMi、MOSEK 配置详解

本文详细介绍了OPTI Toolbox v2.28在MATLAB环境下的完整安装指南,包括SCIP、SeDuMi和MOSEK三个关键求解器的配置与优化技巧。通过分步指导和实战案例,帮助用户高效搭建强大的优化工具包,提升混合整数规划、二次约束二次规划等复杂问题的求解效率。

weixin_29039773的博客 350

Flink 系列之十七 - 高级概念 - 事件时间和水位线

前面已经了解了水位线的生成器,那么接下来通过示例自定义水位线生成器。示例说明:看到BoundedOutOfOrdernessWatermarks是通过onPeriodicEmit定时(200ms)发送水位线,这个自定义的水位线生成器改成在onEvent中发送水位线,这样就形成每来一条数据就生成一次水位线/*** 自定义水位线演示求cpu平均值*/// 1. 创建执行环境// 为了展现方便先设置为1,后续降到多并行度的watermark再开启多并行度。

代码让AI扣 1152

禁止使用服务器 IP 访问 Apache 环境下的 Web 站点

通过在 Apache 的配置文件中添加适当的指令,我们可以轻松地禁止使用服务器 IP 地址访问我们的 Web 站点。在 Apache 环境下,有时我们希望禁止用户使用服务器的 IP 地址直接访问我们的 Web 站点,而只允许使用域名进行访问。现在,当用户尝试使用服务器的 IP 地址来访问你的网站时,他们将会被拒绝访问,只有通过域名才能正常访问。为了实现这个目标,我们可以通过 Apache 的配置文件进行相应的设置。表示禁止对根目录的访问权限,即禁止使用服务器的 IP 地址进行访问。

TpCode的博客 944

【Flink】时间语义和水位线的概念和使用

当Flink接收到数据时,会按照一定的规则去生成Watermark,这条Watermark就等于当前所有到达数据中的maxEventTime - 最大延迟时长 -1ms,也就是说,Watermark是基于数据携带的时间戳生成的,一旦Watermark比当前未触发的窗口的停止时间要晚,那么就会触发相应窗口的执行。的-4001ms的水位线,其不能够跳过这个算子向前传送。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink通过时间戳分配器访问事件时间戳。

weixin_43923463的博客 1018

【四足机器人项目实战】四足机器人支撑腿反作用力规划之VMC解耦控制方法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、基于模型的工作空间控制框图二、原理三、缺点 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对未简化的动力学模型规划反作用力+运动学模型雅可比+虚功原理规划关节扭矩方法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、基于模型的工作空间控制框图 . . 二、原理 基于机器人的动力学模

qq_35635374的博客 6597

rk3588平台USB 3.0 -OAK深度相机适配方法

摘要:本文记录了OAK摄像头设备的配置与测试流程。主要内容包括:1)添加USB设备udev规则;2)拉取相关依赖库;3)安装Python3和pip;4)安装项目依赖;5)安装FFmpeg工具;6)测试摄像头功能并转换视频格式;7)将测试视频拷贝到U盘查看。操作步骤涵盖了从设备驱动配置到功能测试的完整流程,提供了详细的命令行操作指引。通过该文档可快速完成OAK摄像头的环境搭建和基础功能验证。

yy_hear的博客 324

在 Flink 中,水位线(Watermark)是一个非常重要的概念,它用于处理时间相关的操作,尤其是在事件时间(event time)语义下

事件 C 的时间戳大于水位线,但因为它的到达时间是在水位线生成之后,所以它会被缓存起来,直到水位线推进到 15 或更高。2. **指定延迟的水位线**:允许指定一个延迟阈值,Flink 会生成一个表示最大延迟的水位线。水位线是 Flink 流处理中的关键组件,它使得 Flink 能够有效地处理时间相关的操作,即使在面对乱序和延迟的事件流时也能保持正确的处理结果。- **乱序和延迟容忍**:水位线允许 Flink 容忍一定程度的乱序和延迟,使得流处理更加健壮。

靡不有初,鲜克有终 535

基于灰度区域生长算法的红外目标检测算法matlab仿真

基于灰度区域生长算法的红外目标检测算法是一种常用的红外目标检测技术。它通过对红外图像进行灰度区域生长,找到具有相似灰度值的像素区域来检测目标。在本文中,我们将详细介绍基于灰度区域生长算法的红外目标检测算法的原理、步骤和应用。一、原理灰度区域生长算法是一种基于像素相似性的区域分割算法。它通过对图像中具有相似灰度值的像素进行聚类,将它们组合成更大的区域。灰度区域生长算法通常包括以下步骤:1.初始化:选择一个种子点作为起始点,将其作为第一个区域的中心点。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 250

【Flink 基础篇】流处理基础概念(二):时间语义(处理时间、事件时间、水位线)

水位线允许我们在结果的准确性和延迟之间做出取舍。激进的水位线策略保证了低延迟,但随之而来的是低可信度。该情况下,延迟事件可能会在水位线之后到来,我们必须额外加一些代码来处理它们。反之,如果水位线过于保守,虽然可信度得以保证,但可能会无谓地增加处理延迟。

Data · Model · Agent · Repeat 2090

【科学文献计量】标准参考出版年谱(Standard RPYS)和多维参考出版年谱(Multi RPYS)

@[TOC](标准参考出版年谱(Standard RPYS)和多维参考出版年谱(Multi RPYS)) 1 标准参考出版年谱与多维参考出版年谱 1.1 标准参考出版年谱(Standard RPYS) 标准参考出版年谱(Standard Reference Publication Year Spectroscopy)是由Marx, Bornmann, Barth, and Leydesdorff(2014)和Marx and Bornmann(2014)提出的一种量化历史出版物对研究领域影响的方法。该方法通

lys_828的博客 1103

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

flink的窗口概念和时间线水位线

ForeverLeiYu的博客 245

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Flink活动时间和Watermark入门

Flink在流处理过程中支持不同的时间概念 1.事件时间(EventTime):事件在生产设备上发生的事件,是事件自身的属性。 2.提取时间(IngestionTime):事件到达Flink source的时间、。 3.处理时间(ProcessingTime):flink算子处理事件的系统时间,不需要流和机器间的协调,具有最佳性能和最低延迟 官方介绍图 什么是水位线(Watermark) 官方解...

weixin_45296097的博客 385

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

flink(四):1.2版本时间、水位线讲解和代码实例

文章目录说明水位线种类顺序事件中的Watermarks乱序事件中的Watermarks并行数据流中的Watermarks时间概念Event Timewatermark指定Timestamps总结 说明 本博客每周五更新一次。 本博客主要讲解讲解flink时间概念和水位线相关知识,这部分是flink实时处理的核心功能,想要处理好实时和延迟数据,必须熟练掌握flink的时间概念和水位线。 水位线 水位线是flink的一种处理延时数据的机制,主要对设定时间内延时数据的自动容错,水位线的本质是时间戳,计算公式

幻神舞的专栏 962

Flink总结之一文彻底搞懂时间和窗口

Flink中时间语义是非常丰富的,总共有三种,分别是事件时间(Event Time)、处理时间(Processing Time)和摄入时间(Ingestion Time),丰富的时间语义加上水位线( Watermarks)功能,让我们在处理流式数据更加轻松。 在Flink中窗口也定义的非常全面,有计数窗口(Count Window)和时间窗口(Time Window),在窗口切分上有份滚动窗口(Tumbling Windows)、滑动窗口(Sliding Windows)、会话窗口等

空城的博客 1388

Flink的时间与watermarks详解

当我们在使用Flink的时候,避免不了要和时间(time)、水位线(watermarks)打交道,理解这些概念是开发分布式流处理应用的基础。那么Flink支持哪些时间语义?Flink是如何处理乱序事件的?什么是水位线?水位线是如何生成的?水位线的传播方式是什么?让我们带着这些问题来开始本文的内容。 时间语义 基本概念 时间是Flink等流处理中最重要的概念之一,在 Flink 中 Time 可以分为三种:Event-Time,Processing-Time 以及 Ingestion-Time,如下图所示

jmx_bigdata的博客 1789

【Flink】Flink 中的时间和窗口之水位线(Watermark)

在事件时间语义下,我们可以不依赖系统时间,而是基于数据自带的时间戳去定义了一个时钟,用来表示当前时间的进展。这样每个并行子任务都会有一个自己的逻辑时钟,它的前进是靠数据的时间戳来驱动的。但是在分布式系统中,会存在一些问题,因为数据本身在处理转换过程中会发生变化,如果遇到窗口聚合的操作,呢么下游的数据就会变少,时间进度的控制就不精细了。另外,数据向下游任务传递时,一般只能传输给一个子任务(除广播外),这样其他的并行子任务的时钟就无法推进了。所以时钟也需要以数据的形式传递出去,告诉下游任务当前时间的进展;

菜鸟sdut的博客 3898
上一篇: Flink 窗口
下一篇: Flink 状态
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

努力生活的黄先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值