Flink Streaming (DataStream API) Event Time

Flink Streaming专题 -1 FlinkStreaming 概述和事件时间EventTime解读 1.Streaming 1.1 Overviewer (1)Data Sources DataSources 操作 可以通过StreamExecutionEnvironment.addSource(sourceFunction) 方式将source加入到集群内部中,Flink预先提供了很多Source方法来帮助你来实现数据操作。当然也可以通过实现SourceFunction 的方式来实现非并行数据... 阅读详情

其它译文可连接如下:
🧩 State & Fault Tolerance。Flink 中的状态及容错
🧩 Flink Streaming (DataStream API) Operators - Windows。介绍 Flink 中的 Window 函数,含 Watermark 的理解
🧩 Flink Streaming (DataStream API) Operators。基于 1.7 官方文档,算子介绍。


DataStream API / Event Time




Oveiview

Event Time

在本节中,您将学习编写时间感知的 Flink 程序。请看下时间流处理(Timely Stream Processing)以了解时间流处理背后的概念。

有关如何在Flink程序中使用时间的知识请参阅窗口和 ProcessFunction。

使用事件时间处理的先决条件是设置正确的时间特性,该设置定义了数据流源的行为方式(例如它们是否将分配时间戳)以及诸如KeyedStream.timeWindow(Time.seconds(30))之类的窗口操作应使用什么时间概念。

您可以使用 StreamExecutionEnvironment.setStreamTimeCharacteristic() 设置时间特征:

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

DataStream<MyEvent> stream = env.addSource(new FlinkKafkaConsumer<MyEvent>(topic, schema, props));

stream
    .keyBy( (event) -> event.getUser() )
    .timeWindow(Time.hours(1))
    .reduce( (a, b) -> a.add(b) )
    .addSink(...);

请注意,为了在事件时间中运行此示例,程序需要使用直接为数据定义事件时间并自己发出水位线的源,或者程序必须在源之后注入Timestamp Assigner&Watermark Generator。 这些功能描述了如何访问事件时间戳,以及事件流呈现出何种程度的乱序。


生成水位线(Generating Watermarks)

在本节中,您将了解 Flink 提供的用于处理事件时间时间戳和水位线的 API。 有关事件时间、处理时间和摄取时间的介绍,请参阅introduction to event time。

水位线策略简介(Introduction to Watermark Strategies)

为了使用事件时间 Flink 需要知道事件时间戳,这意味着流中的每个元素都需要分配其事件时间戳。通常这是通过使用 TimestampAssigner 从元素中的某些字段访问或提取时间戳来完成的。

时间戳分配与生成水位线密切相关的,水位线告诉系统事件时间的进展,您可以通过指定 WatermarkGenerator 进行配置。

Flink API 需要一个同时包含 TimestampAssigner 和 WatermarkGenerator 的 WatermarkStrategy,作为 WatermarkStrategy 上的静态方法有许多常见的策略可以直接使用,但用户也可以在需要时构建自己的策略。

为了完整起见,以下是接口:

public interface WatermarkStrategy<T> extends TimestampAssignerSupplier<T>, WatermarkGeneratorSupplier<T>{

    /**
     * 实例化一个 {@link TimestampAssigner}, 以此分配时间戳策略
     */
    @Override
    TimestampAssigner<T> createTimestampAssigner(TimestampAssignerSupplier.Context context);

    /**
     * 实例化一个 WatermarkGenerator ,以此生成水位线策略
     */
    @Override
    WatermarkGenerator<T> createWatermarkGenerator(WatermarkGeneratorSupplier.Context context);
}

如前所述您通常不会自己实现此接口,而是将WatermarkStrategy上的静态 helper 方法用于常见的水位线策略,或者将自定义的 TimestampAssigner 与 WatermarkGenerator 捆绑在一起。 例如要使用无序水位线和 lambda 函数作为时间戳分配器,请使用以下代码:

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

指定一个 TimestampAssigner 是可选的,在大多数情况下您实际上并不想指定一个。 例如当使用 Kafka 或 Kinesis 时,您将直接从 Kafka 或 Kinesis 记录中获得时间戳。

我们将在稍后的编写 WatermarkGenerators 中查看 WatermarkGenerator 接口。

注意:时间戳和水位线都指定为自1970-01-01T00:00:00Z 的Java纪元以来的毫秒数。

使用水位线策略(Using Watermark Strategies)

Flink 应用程序中有两个地方可以使用 WatermarkStrategy:1)直接在 source 上,2)在非Source 操作之后。

第一种选择是更可取的,因为它允许source利用水位线逻辑中有关 分片/分区/切分(shards/partitions/splits)的知识,然后 source 通常可以在更精细的级别上跟踪水位线,并且 source 产生的整体水位线将更加准确。直接在 source 代码上指定 WatermarkStrategy 通常意味着您必须使用特定于source的接口(请参阅水位线策略和Kafka连接器)了解如何在Kafka连接器上使用水位线策略和Kafka连接器,以获取有关每个分区水位线如何工作的更多详细信息。

仅当无法直接在source代码上设置策略时,才应使用第二个选项(在任意操作之后设置 WatermarkStrategy):

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

DataStream<MyEvent> stream = env.readFile(
        myFormat, myFilePath, FileProcessingMode.PROCESS_CONTINUOUSLY, 100,
        FilePathFilter.createDefaultFilter(), typeInfo);

DataStream<MyEvent> withTimestampsAndWatermarks = stream
        .filter( event -> event.severity() == WARNING )
        .assignTimestampsAndWatermarks(<watermark strategy>);

withTimestampsAndWatermarks
        .keyBy( (event) -> event.getGroup() )
        .timeWindow(Time.seconds(10))
        .reduce( (a, b) -> a.add(b) )
        .addSink(...);

使用 WatermarkStrategy以这种方式获取一个流并产生带有时间戳记的数据和水位线的新流。如果原始流已经具有时间戳 和/或 水位线,则时间戳分配器将覆盖它们。

处理空闲 Sources(Dealing With Idle Sources)

如果输入的 分片/分区/切分(shards/partitions/splits)中的一个在一段时间内未携带事件,则意味着 WatermarkGenerator也不会获得任何新信息作为水位线基础。我们称其为空闲输入或空闲 Sources,这是一个问题,因为您的某些分区可能仍然承载事件,在那种情况下水位线将被保留,因为它是在所有不同的并行水位线上计算的最小值。

为了解决这个问题,您可以使用 WatermarkStrategy 来检测空闲状态并将输入标记为空闲,WatermarkStrategy为此提供了一个方便的帮手:

WatermarkStrategy
        .<Tuple2<Long, String>>forBoundedOutOfOrderness(Duration.ofSeconds(20))
        .withIdleness(Duration.ofMinutes(1));

编写水位线生成器(Writing WatermarkGenerators)

TimestampAssigner 是一个简单的函数,可从事件中提取字段,因此我们无需详细查看它们。另一方面 WatermarkGenerator 的编写要复杂一些,我们将在接下来的两节中介绍如何做到这一点,这是 WatermarkGenerator 接口:

/**
 * The {@code WatermarkGenerator} 根据时间 或周期性的(以固定的间隔)生成水位线
 *
 * <p><b>注意:</b> 此 WatermarkGenerator 包含了之前的 {@code AssignerWithPunctuatedWatermarks} 和 {@code AssignerWithPeriodicWatermarks}.
 */
@Public
public interface WatermarkGenerator<T> {

    /**
     * 每个事件调用,允许水位线生成器检查并记住时间时间戳,或基于事件本身发出水位线
     */
    void onEvent(T event, long eventTimestamp, WatermarkOutput output);

    /**
     * 周期调用,并可能发出新的水位线。
     *
     * <p>调用此方法和生成水位线的时间间隔取决于 {@link ExecutionConfig#getAutoWatermarkInterval()}.
     */
    void onPeriodicEmit(WatermarkOutput output);
}

有两种不同的水位线生成方式:周期和每事件。

周期性生成器通常通过 onEvent() 观察传入的事件,然后在框架调用onPeriodicEmit 时发出水位线。

每事件生成器将查看 onEvent() 中的事件,并等待在流中携带水位线信息的特殊标记事件或标点,当看到这些事件之一时,它将立即发出水位线。通常没事件生成器不会从 onPeriodicEmit() 发出水位线。

接下来,我们将研究如何为每种样式实现生成器。

编写周期性水位线生成器(Writing a Periodic WatermarkGenerator)

周期生成器观察流事件并定期生成水位线(可能取决于流元素或仅基于处理时间)。

通过 ExecutionConfig.setAutoWatermarkInterval(...)定义生成水位线的时间间隔(每n毫秒),生成器的onPeriodicEmit()方法每次都会被调用,如果返回的水位线非空且大于前一个水位线,则将发出新的水位线。

在这里,我们显示了两个使用定期水位线生成的水位线生成器的简单示例,请注意 Flink 附带了 BoundedOutOfOrdernessWatermarks,它是一个 WatermarkGenerator,其工作原理与下面显示的 BoundedOutOfOrdernessGenerator 相似,您可以在此处阅读有关使用它的信息。

/**
 * 这个生成器会生成水位线,假设元素的到达顺序不确定,但是只是在一定程度上。
 * 特定时间戳 t 的最新元素将在时间戳 t 的最早元素之后最多 n 毫秒到达。
 */
public class BoundedOutOfOrdernessGenerator implements WatermarkGenerator<MyEvent> {

    private final long maxOutOfOrderness = 3500; // 3.5秒

    private long currentMaxTimestamp;

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

    @Override
    public void onPeriodicEmit(WatermarkOutput output) {
        // 将水位线作为当前最高时间戳减去无序边界值发出
        output.emitWatermark(new Watermark(currentMaxTimestamp - maxOutOfOrderness - 1));
    }

}

/**
 * 该生成器生成的水位线滞后与处理时间一定量的(fixed amount).
 * 它假设元素在有界延迟后到达 Flink。
 */
public class TimeLagWatermarkGenerator implements WatermarkGenerator<MyEvent> {

    private final long maxTimeLag = 5000; // 5 seconds

    @Override
    public void onEvent(MyEvent event, long eventTimestamp, WatermarkOutput output) {
        // 不需要做任何事情,因为我们在 processing time 上执行
    }

    @Override
    public void onPeriodicEmit(WatermarkOutput output) {
        output.emitWatermark(new Watermark(System.currentTimeMillis() - maxTimeLag));
    }
}

编写每事件水位线生成器(Writing a Punctuated WatermarkGenerator)

符号水位线生成器(有时也叫做每事件生成器)将观察事件流,并在看到带有水位线信息的特殊元素时发出水位线。

这样,您就可以实现一个符号生成器,该符号生成器在事件表明它带有特定标记时会发出水位线:

public class PunctuatedAssigner implements WatermarkGenerator<MyEvent> {

    @Override
    public void onEvent(MyEvent event, long eventTimestamp, WatermarkOutput output) {
        if (event.hasWatermarkMarker()) {
            output.emitWatermark(new Watermark(event.getWatermarkTimestamp()));
        }
    }

    @Override
    public void onPeriodicEmit(WatermarkOutput output) {
        // 不需要做任何处理,因为我们对上述事件作出反应
    }
}

注意:可以在每个事件上生成水位线。但是,由于每个水位线都会在下游引起一些计算,因此过多的水位线会降低性能。

水位线策略和 Kafka 连接器(Watermark Strategies and the Kafka Connector)

当使用 Apache Kafka 作为数据源时,每个 Kafka 分区可能都有一个简单的事件时间模式(时间戳增加或有界乱序)。但是,在使用来自 Kafka 的流时,通常会并行使用多个分区,从而将来自分区的事件交错并破坏每个分区的模式(这是 Kafka 的客户端工作方式所固有的)。

在这种情况下,您可以使用 Flink 的可识别 Kafka 分区的水位线。使用该功能,将在Kafka使用者内部针对每个Kafka分区生成水位线,并且每个分区的水位线合并方式与在流 shuffle 时合并水位线的方式相同。

例如,如果事件时间戳严格按照每个 Kafka 分区递增,则使用递增时间戳水位线生成器生成按分区的水位线将产生完美的整体水位线。请注意,我们在示例中未提供 TimestampAssigner,而是将使用 Kafka 记录本身的时间戳。

下图显示了如何使用按 Kafka 分区的水位线生成,以及在这种情况下水位线如何通过流数据流传播。

FlinkKafkaConsumer<MyType> kafkaSource = new FlinkKafkaConsumer<>("myTopic", schema, props);
kafkaSource.assignTimestampsAndWatermarks(
        WatermarkStrategy.
                .forBoundedOutOfOrderness(Duration.ofSeconds(20)));

DataStream<MyType> stream = env.addSource(kafkaSource);

parallel_kafka_watermarks.svg

如何操作处理水位线(How Operators Process Watermarks)

通常,要求 operator 在将给定水位线转发给下游之前完全处理给定水位线。例如 WindowOperator 将首先评估应触发的所有窗口,只有在产生了所有由水位线触发的输出之后,水位线本身才会被发送到下游。换句话说,由于水位线的出现而产生的所有元素将在水位线之前发出。

相同的规则适用于 TwoInputStreamOperator。 但是在这种情况下 operators 的当前水位线被定义为其两个输入的最小值。

此行为的详细信息由 OneInputStreamOperator#processWatermark、TwoInputStreamOperator#processWatermark1 和 TwoInputStreamOperator#processWatermark2 方法的实现定义。

不推荐使用的 AssignerWithPeriodicWatermarks 和 AssignerWithPunctuatedWatermarks

在介绍当前的 WatermarkStrategy、TimestampAssigner 和 WatermarkGenerator 的抽象之前,Flink 使用了 AssignerWithPeriodicWatermarks 和 AssignerWithPeriodicWatermarks。您仍会在API中看到它们,但建议使用新接口,因为它们提供了更清晰的关注点分离(separation of concerns)并且还统一了水位线生成的定期和 punctuated 风格。


内置水位线生成器(Builtin Watermark Generators)

如生Generating Watermarks中所述,Flink提供了抽象,允许编程者分配自己的时间戳并发出自己的水位线,更具体地说,可以通过实现 WatermarkGenerator 接口来实现。

为了进一步简化此类任务的编程工作,Flink 附带了一些预先实现的时间戳分配器。本节提供了它们的列表,除了开箱即用的功能外,它们的实现还可以作为自定义实现的示例。

单调递增时间戳(Monotonously Increasing Timestamps)

周期生成水位线的最简单的特殊情况是给定 source 任务看到的时间戳以升序出现。在这种情况下,当前时间戳始终可以充当水位线,因为没有更早的时间戳会到达。

请注意,每个并行数据源任务的时间戳都仅递增,例如如果在一个特定的设置中,一个并行数据源实例读取一个 Kafka 分区,则仅在每个 Kafka 分区内将时间戳递增是必要的。每当对并行流进行shuffle、union、连接或合并时,Flink 的水位线合并机制将生成正确的水位线。

WatermarkStrategy.forMonotonousTimestamps();

固定延迟量(Fixed Amount of Lateness)

周期性水位线生成的另一个示例是水位线在流中看到的最大(事件时间)时间戳落后固定时间量的情况,这种情况涵盖了事先知道流中可能遇到的最大延迟的场景,例如当创建包含带有时间戳的元素的自定义源时,该时间戳会在固定的时间段内传播以进行测试。对于这些情况,Flink 提供了 BoundedOutOfOrdernessWatermarks 生成器,该生成器将 maxOutOfOrderness 作为参数,即在计算给定窗口的最终结果时允许元素延迟被忽略之前的最长时间。延迟对应于 t-t_w 的结果,其中t是元素的(事件时间)时间戳,而 t_w 是先前水位线的时间戳。默认情况下,如果 延迟 > 0,则将元素视为延迟,在为其相应窗口计算作业结果时将忽略该元素。有关使用延迟元素的更多信息,请参见有关允许延迟的文档。

WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(10));

大数据实时分析实战:Flink与Spark Streaming 随着大数据时代的到来,实时数据分析已成为企业获取即时洞察、优化操作和增强用户体验的关键工具。在大数据实时分析领域,Apache Flink和Apache Spark Streaming是两个备受瞩目的流处理框架。本文将结合优快云网站上的相关资源,深入探讨Flink与Spark Streaming在大数据实时分析中的实战技巧,并通过代码示例进行详细分析。Flink:Spark Streaming:1. 环境搭建首先,需要搭建Flink的开发环境。可以通过Maven或Gradle等构建工具来管理项目依赖。以下 阅读详情

相关推荐

【Flink】Flink Streaming File Sink

1.概述 类似文章:【Flink】Flink StreamingFileSink 转载:Flink Streaming File Sink 2.背景 Flink 支持将流数据以文件形式存储到外部系统,典型使用场景是将数据写入Hive表所在 HDFS存储路径,通过Hive 做查询分析。随着Flink文件写入被业务广泛使用,暴露出很多问题,因此需要了解 Flink Streaming File sink 的实现逻辑。 3.案例 从Kafka消费JSON数据,转换为 UserInfo 实体类数据流,最终以Par.

九师兄 1870

Flink实战(七) Streaming(DataStreaming) 总览

文章目录Flink DataStream API Programming Guide示例程序数据源 Data Sources基于文件的基于Socket的自定义数据转换 (DataStream Transformations)数据接收器 Data Sinks写入文件终端打印写入Socket自定义接收器Iterations 迭代Execution ParametersFault Tolerance 容...

wuhulala的休息室 1823

[Flink基础]---- Flink学习规划(进阶)

当学习了之前的课程后,我们便有了Flink 的基础,接下来将进行实战,举例各个部分的实现代码。 1 Flink 基础 API 概念 1.1 Scala API 扩展 1.2 Java Lambda表达式 2 Streaming (DataStream API) 2.1 Event Time 2.2 State & Fault Tolerance 2.3 Operator...

欢迎来到我的博客,一起探索代码里的世界! 1143

Flink源码篇-FlinkStreaming执行计划生成流程

无知不可怕,毁掉自己的是骄傲 1,示例 很多人使用Flink的时候有没有考虑过执行计划是如何生成的,例如Spark的RDD拓扑有向无环图是怎么生成的,打印出来的执行计划应该怎么理解,我们先看一个示例,执行以下System.out.println(env.getExecutionPlan()); { "nodes" : [ { "id" : 1, 图节点ID,也就是transform的ID "type" : "Source: 添加了一个source"...

进阶的成长之路 2286

深入解析ST MC SDK(WorkBench)工程结构:从零搭建FOC电机控制项目

本文深入解析了ST MC SDK(WorkBench)工程结构,详细介绍了如何从零搭建FOC电机控制项目。通过ST MC SDK和WorkBench工具链,开发者可以快速配置电机类型、控制策略等参数,生成完整的FOC控制工程。文章还拆解了工程结构中的核心控制模块、HAL硬件抽象层、芯片系统初始化和电机控制算法库,并提供了无传感器FOC实战技巧和常见问题排查指南,帮助开发者高效掌握STM32F407ZGT6开发板上的FOC电机控制技术。

weixin_29173777的博客 410

RV1126 ISP开发实战:从Tuner调试到IQ文件解析

本文详细介绍了RV1126 ISP开发的完整流程,从Tuner调试到IQ文件解析,涵盖了环境搭建、工具使用、参数配置及性能优化等关键环节。通过实战案例和避坑指南,帮助开发者快速掌握Rockchip芯片的ISP开发技巧,提升图像处理质量。

weixin_29195615的博客 569

Flink1.13批流合一的介绍

概况 DataStream API支持不同的运行时执行模式,我们可以根据实际的需求和任务的特征来选择这些模式。 STREAMING执行模式是DataStream API的“经典”执行行为,应该用于需要持续增量处理并预期无限期在线的无限作业。 此外,还有一种批处理风格的执行模式,我们称之为 BATCH执行模式。 它以一种像批处理框架(如MapReduce)的方式执行作业。 这应用于已知有限的数据源输入并且不会连续运行的有界作业。 Flink对流和批处理的统一方法意味着在有界输入上执行的DataSt.

张伟的专栏 1113

WPS JS宏智能识别代码段并设置样式(完整可用版)

之前,我们已经经历了多次迭代,解决了许多问题,比如识别代码块、处理多行导入、调整样式等。现在他们需要一份全面的文档来解释整个代码的结构和工作原理。(5)智能行分析(含URL和注解检测优化)function analyzeLineEnhanced(rawText,trimmedText,codeSymbols,codePatterns, singleLinePatterns)该解决方案在保持高性能的同时,提供了良好的可扩展性,能够适应不同组织的代码规范需求,是WPS生态中专业文档处理的创新实践。

搏博的专栏 1820

16.FlinkTable & SQL\为什么需要Table & SQL

16.FlinkTable & SQL 16.1.为什么需要Table & SQL 16.2.发展历史 16.3.API 16.4.核心概念 16.5.案例1 16.6.案例2 16.7.案例3 16.8.案例4依赖 https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/table/ 程序结构 https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/table

涂作权的博客 745

手把手教你用微信小程序实现智能硬件音视频通话(含Linux/RTOS适配)

本文详细介绍了如何利用微信小程序硬件框架(WMPF)和音视频SDK,在智能硬件(包括Linux与RTOS设备)上实现音视频通话功能。文章从架构设计、设备端SDK集成、小程序VOIP插件开发到跨平台调试与性能优化,提供了全链路实战指南,帮助开发者打通微信小程序与嵌入式设备间的实时音视频通信。

ooo22的博客 328

Android SurfaceFlinger——概述(一)

对于系统渲染流程的理解是指导 SurfaceFlinger 设计的核心思想,从 Android 4.1 一直到 Android 9.0 都没有太大的变化。只要抓住这五个核心思想,我们阅读 SurfaceFlinger 的难度就会下降不少。下面看一下 SurfaceFlinger 的体系和 Skia 以及 View的绘制流程的关系。framework 面向开发者所有的 View 是便于开发的控件,里面仅仅只是提供了当前 View 各种属性以及功能。

小旭的专栏 2583

Flink DataStream API 编程指南:从执行环境到流式应用的完整实战

Flink DataStream API 是 Apache Flink 中面向**有界与无界数据流**的核心编程接口,本文基于当前仓库 [docs/content.zh/docs/dev/datastream/overview.md](https://link.gitcode.com/i/a1303dbe565e9a268fc63c32587bbc73) 展开,系统讲解 DataStream 程序

gitblog_00976的博客 1002

Visual Studio Code + MCP Server + Claude Code 三件套进行 ABAP 开发

本文介绍了如何在Visual Studio Code中利用Claude Code和SAP官方提供的MCP Server进行ABAP开发。作者分享了19年ABAP开发经验,从手动编码到如今通过自然语言生成高质量代码的技术演进。详细说明了配置步骤:启用ADT MCP Server、安装Claude Code扩展、配置.claude.json文件,并验证MCP Server的14个功能。通过实例演示了如何用自然语言指令让Claude Code创建包含冒泡排序实现和单元测试的ABAP类,展示了MCP Server在

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1295

Flink DataStream API 执行模式(BATCH/STREAMING)完全指南:配置、执行行为与最佳实践

Apache Flink 的 DataStream API 提供 `STREAMING` 与 `BATCH` 两种运行时执行模式:前者面向无界流的持续增量处理,后者面向有界输入、借鉴 MapReduce 式批处理思想的执行方式。本文以 [execution_mode.md](https://link.gitcode.com/i/089a90cd569173b315359c500f7b858e) 为

gitblog_00802的博客 466

Android开发工程师(IOT)面试指南与参考答案

【摘要】绿联科技招聘Android开发工程师(IOT方向),要求5年以上Android开发经验,精通Kotlin/Java,熟悉IOT设备交互及跨平台开发。岗位职责包括客户端开发维护、技术调研及性能优化等。核心考察点包括:Kotlin协程在IOT低功耗场景的应用、多协议设备连接层设计、音视频性能优化及离线架构实现。重点技术涉及蓝牙Mesh群控、BLE功耗优化及ReactNative混合开发。需具备GooglePlay合规经验,熟悉Android13+权限管理,并能提供量化性能优化案例。

郑伟强dev的专栏 719

基于Simulink与MATLAB的七轴OpenArm机械臂逆运动学仿真与轨迹规划完整指南

本文详细介绍了七自由度OpenArm机械臂在MATLAB/Simulink环境下的运动学仿真与轨迹规划实现方法。首先建立了机械臂的DH参数模型,验证了正运动学计算;随后提出了两种逆运动学求解算法(数值迭代法和臂型角参数化解析法)的MATLAB实现方案;最后在Simulink中搭建了完整的轨迹规划与控制系统。研究解决了七自由度冗余机械臂特有的多解性、奇异性和关节限位约束等核心问题,为OpenArm机械臂的运动控制提供了完整的技术方案和可运行代码实现。

AI的内部世界的博客 678

使用 Flink DataStream API 构建数据管道与 ETL 任务

本文以 Apache Flink 中典型的 ETL(抽取、转换、加载)应用场景为主线,系统讲解如何使用 DataStream API 实现数据管道的核心环节:无状态转换(`map()` / `flatmap()`)、按键分区(`keyBy()`)与聚合、有状态转换(Keyed State、Rich Functions)以及双流连接(Connected Streams)。读完本文,你将掌握用 Dat

gitblog_00184的博客 1074

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Flink DataStream API 与 Table API 集成指南:双向转换、Changelog 流与批流统一

在 Flink 中定义数据处理管道时,Table API 与 DataStream API 同等重要:前者提供结构化、声明式的编程模型,抽象掉大量内部细节;后者则在较低的层级上暴露流处理的三大原语——时间(Time)、状态(State)与数据流管理(Dataflow Management)。本文基于当前仓库的官方文档([docs/content/docs/dev/table/data_stream

gitblog_00639的博客 495

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

基于 Flink DataStream API 的有状态流处理实战:信用卡欺诈检测系统开发指南

Apache Flink 的 DataStream API 是构建稳定可靠、有状态流处理应用的核心接口,它提供对状态(State)与时间(Time)的细粒度控制,可用于实现复杂的事件驱动数据处理系统。本文以"信用卡欺诈检测"这一经典实时风控场景为切入点,从 Maven Archetype 项目骨架生成、数据流组装、`keyBy` 分区,到基于 `ValueState` 的托管状态与基于定时器(Ti

gitblog_00793的博客 697

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Windows 文件占用问题如何排查:PowerToys File Locksmith 快速指南

删除文件时,系统提示"无法完成此操作,因为文件正在其他程序中打开"。这类文件占用问题,可以用 PowerToys File Locksmith 处理。它是 Microsoft PowerToys 附带的文件占用检测工具,能定位到具体是哪个进程锁住了目标文件。 ## 🗂️ 工具速览|支持系统、安装方式与使用入口 File Locksmith 是 Microsoft 开源项目 PowerToys

gitblog_00516的博客 829

如何快速录屏做教程:QuickRecorder 免费 macOS 录屏实战指南

QuickRecorder 是一款不到 10MB、免费无水印的 macOS 录屏工具,基于 Apple 的 ScreenCaptureKit 框架,不限时长。录网课、做软件教程、归档线上会议的人都能用它,系统声音、单个窗口、连 iPhone 屏幕都录得了。 ## 第一次跑起来:从克隆仓库到录出第一支视频 1. 拿到软件有两条路:想直接用的执行 `brew install lihaoyun6/t

gitblog_00381的博客 358

Flink DataStream API 编程指南:从执行环境到流式窗口 WordCount 的完整实战

DataStream API 是 Apache Flink 面向无界/有界数据流进行状态计算的核心编程接口。本文以仓库中的 [DataStream API 编程指南](https://link.gitcode.com/i/dae52c8ea7a53c729f6c38960bf08022) 为骨架,结合 `flink-streaming-java` 模块的真实源码,系统讲解如何从零构建一个 Flin

gitblog_01008的博客 491

Flink 测试依赖配置指南:DataStream 与 Table API 的测试工具链

Flink 为开发者提供了一套开箱即用的测试工具,覆盖从 UDF 单元测试到完整作业端到端验证的各个层级。本文以官方文档 [Test Dependencies](https://link.gitcode.com/i/f36b4d311b2169d08ffdcf6c7d096f05) 为核心,系统讲解 `flink-test-utils` 与 `flink-table-test-utils` 两个测

gitblog_00288的博客 192

Flink DataStream 应用测试全指南:从 UDF 单元测试到 MiniCluster 集成测试

Apache Flink 官方为 DataStream API 应用提供了完整的测试工具链,覆盖测试金字塔的各个层级:从最基础的用户自定义函数(UDF)单元测试,到依赖运行时状态与定时器的 Test Harness 测试,再到在本地嵌入式 MiniCluster 上运行完整作业的集成测试。本文基于 Flink 仓库中 [DataStream API 测试官方文档](https://link.git

gitblog_00024的博客 833

秒懂Flink:3分钟入门Apache Flink流处理框架终极指南

Apache Flink作为当前最强大的开源流处理框架,正在彻底改变大数据实时计算领域!🚀 无论你是大数据新手还是经验丰富的开发者,这篇快速入门指南将帮助你在3分钟内掌握Flink的核心概念和基本使用。Flink流处理框架以其卓越的性能和强大的容错机制,成为企业级实时数据处理的首选解决方案。 ## 为什么选择Flink流处理框架? Flink是一个分布式、高性能、高可用的流处理框架,它能够处

gitblog_00372的博客 1135

Flink第一章:Flink概述

Apache Flink是一个分布式流处理框架,支持无界和有界数据流的高性能计算。它以低延迟、高吞吐和精确一次的状态一致性为特点,提供分层API(包括SQL、Table API、DataStream/DataSet API)满足不同开发需求。Flink起源于Stratosphere项目,2014年成为Apache顶级项目,并在阿里巴巴支持下快速发展。相比Spark Streaming的微批处理模式,Flink采用真正的流处理架构,具有更灵活的时间语义和窗口功能。已经成为现代大数据处理的重要工具。

Justicer_Young的博客 506
上一篇: R + RStudio(Server) + Spark/Hive 处理数据集
下一篇: The Pathologies of Big Data(大数据病理)
Yore Yuen
博客等级 码龄9年 8646粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值