Flink + Scala 实战进阶:窗口函数、水印与容错机制全讲透

Flink实时计算核心机制与生产实践:从状态管理到Kafka数据链路 流处理是大数据实时计算的核心范式,与批处理不同,它在数据到达时立即处理,能够满足秒级甚至毫秒级延迟要求。实现稳定的流式计算,必须解决状态维护、故障恢复、乱序数据和消费背压等关键问题。Flink通过统一的状态管理、分布式检查点、事件时间与水印机制以及背压设计,将流式计算构建为稳定可恢复的工程系统。实际应用中,Flink SQL可高效打通Kafka到Elasticsearch的实时链路,配合窗口聚合和精确一次语义,支撑实时报表与监控场景。同时,合理的并行度规划直接影响资源效率与状态分布,工程化代码组织、连接器异 阅读详情

第一章:Flink + Scala 流处理核心概念解析

流处理与批处理的统一模型

Apache Flink 是一个支持高吞吐、低延迟的分布式流处理框架,其核心理念是将批处理视为流处理的特例。在 Flink 中,无论是有限数据集还是无限数据流,均通过统一的运行时引擎进行处理。这种模型使得开发者可以使用相同的 API 构建批处理和流处理应用。

DataStream API 与函数式编程

Flink 提供了基于 Scala 的 DataStream API,充分利用了函数式编程特性。用户可以通过 map、filter、keyBy 等操作对数据流进行转换。
// 定义一个简单的流处理作业
val env = StreamExecutionEnvironment.getExecutionEnvironment
val stream = env.socketTextStream("localhost", 9999)

val wordCounts = stream
  .flatMap(_.split("\\s"))     // 将每行文本拆分为单词
  .map((_, 1))                 // 每个单词映射为 (word, 1)
  .keyBy(_._1)                 // 按单词分组
  .sum(1)                      // 对计数求和

wordCounts.print()             // 输出结果到标准输出
env.execute("Word Count")      // 触发执行
上述代码展示了如何从 socket 读取文本流并实现词频统计。每个操作符都返回一个新的 DataStream,形成链式调用结构。

时间语义与窗口机制

Flink 支持三种时间语义:事件时间(Event Time)、摄入时间(Ingestion Time)和处理时间(Processing Time)。窗口机制允许按时间或数量对无限流进行切片处理。
时间类型特点适用场景
事件时间基于数据本身的时间戳精确处理乱序事件
处理时间基于系统时钟低延迟但可能不精确
  • 事件时间需配合 Watermark 处理延迟数据
  • 滚动窗口(Tumbling Window)适用于固定周期聚合
  • 滑动窗口(Sliding Window)可用于重叠时间段分析

第二章:窗口函数深度解析与应用实践

2.1 窗口机制原理与时间语义详解

在流处理系统中,窗口机制是实现数据分段计算的核心。它将无界数据流划分为有界片段,以便进行聚合、统计等操作。窗口的划分依赖于时间语义,常见的时间类型包括事件时间(Event Time)、处理时间(Processing Time)和摄入时间(Ingestion Time)。
时间语义对比
时间类型定义优点缺点
事件时间数据产生时的时间戳精确反映真实顺序需处理乱序和延迟
处理时间系统接收到数据的时间实现简单,低延迟受系统调度影响
基于事件时间的滚动窗口示例

stream.keyBy("userId")
    .window(TumblingEventTimeWindows.of(Time.seconds(10)))
    .sum("clicks");
上述代码将每10秒按用户ID进行点击量统计。TumblingEventTimeWindows 表示基于事件时间的滚动窗口,每个元素只能属于一个窗口。该方式能准确反映用户行为的时间分布,但需配合水位线(Watermark)机制处理乱序事件。

2.2 滚动窗口与滑动窗口的Scala实现

在流处理场景中,窗口机制用于将无限数据流切分为有限块进行聚合计算。Scala结合Apache Spark Streaming提供了对滚动窗口和滑动窗口的高效支持。
滚动窗口(Tumbling Window)
滚动窗口是无重叠的时间窗口,每个数据仅属于一个窗口。适用于周期性统计任务。

val tumblingStream = stream.window(Seconds(10), Seconds(10))
// 窗口长度10秒,滑动步长10秒,无重叠
该配置每10秒生成一个独立窗口,适合按固定周期统计PV、UV等指标。
滑动窗口(Sliding Window)
滑动窗口允许窗口间存在重叠,提升数据实时感知能力。

val slidingStream = stream.window(Seconds(10), Seconds(5))
// 窗口长度10秒,每5秒滑动一次
每5秒触发一次最近10秒内的数据聚合,适用于延迟敏感的监控系统。
窗口类型窗口大小滑动步长数据重叠
滚动窗口10s10s否
滑动窗口10s5s是

2.3 会话窗口与动态间隔窗口实战

在流处理场景中,会话窗口常用于捕捉用户行为的活跃周期。当事件之间的间隔超过设定的超时时间时,窗口即关闭。
会话窗口实现示例
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Event> stream = env.addSource(new EventSource());

stream.keyBy(event -> event.userId)
    .window(ProcessingTimeSessionWindows.withGap(Time.minutes(5)))
    .aggregate(new UserActivityAgg())
    .print();
上述代码定义了一个基于处理时间的会话窗口,窗口间隙为5分钟。每个用户的事件流在间隔超过5分钟时触发聚合计算。
动态间隔窗口策略
通过自定义WindowAssigner可实现动态间隔,根据用户等级或行为类型调整超时时间:
  • 高价值用户:10分钟超时
  • 普通用户:3分钟超时
  • 匿名用户:1分钟超时
该策略提升分析精度,避免一刀切的固定间隔导致的行为误判。

2.4 窗口聚合函数的自定义开发

在流式计算场景中,内置的窗口聚合函数往往难以满足复杂业务需求,因此自定义窗口聚合函数成为关键能力。通过扩展聚合接口,开发者可实现特定的数据合并与输出逻辑。
实现步骤
  • 定义聚合状态结构体,用于保存中间计算值
  • 实现初始化、累加和输出三个核心方法
  • 注册函数至执行环境并绑定窗口策略

public class CustomSumAgg implements AggregateFunction<Integer, Integer, Double> {
    @Override
    public Integer createAccumulator() {
        return 0; // 初始状态
    }

    @Override
    public Integer add(Integer value, Integer accumulator) {
        return accumulator + value; // 累加逻辑
    }

    @Override
    public Double getResult(Integer accumulator) {
        return accumulator * 1.0; // 转换为高精度结果
    }
}
上述代码定义了一个整型累加并返回双精度结果的聚合函数。createAccumulator 初始化累加器为 0;add 方法在每次数据到达时更新状态;getResult 在窗口触发时输出最终值。该函数可无缝集成到基于事件时间的滚动或滑动窗口中,支持精确的流式数值统计。

2.5 窗口触发器与驱逐策略调优实践

在流处理系统中,窗口触发器与驱逐策略直接影响计算的实时性与准确性。合理配置可避免数据积压或结果延迟。
常见触发器类型
  • 事件时间触发器:基于事件发生时间推进窗口计算;
  • 处理时间触发器:依赖系统时钟,延迟低但可能牺牲精确性;
  • 连续触发器:支持周期性输出中间结果,适用于监控场景。
驱逐策略配置示例

window.evictor(TimeEvictor.of(Time.milliseconds(100)))
      .trigger(ProcessingTimeTrigger.create());
上述代码设置每100毫秒驱逐过期元素,并使用处理时间触发。TimeEvictor可减少状态大小,提升性能,但需权衡数据完整性。
调优建议
场景推荐策略
高吞吐日志分析周期触发 + 时间驱逐
精准计费系统事件时间触发 + 无驱逐

第三章:事件时间与水印机制精讲

3.1 事件时间、处理时间与摄入时间对比分析

在流式计算中,时间语义的选择直接影响数据结果的准确性。Flink 支持三种时间类型:事件时间(Event Time)、处理时间(Processing Time)和摄入时间(Ingestion Time),各自适用于不同场景。
核心时间语义解析
  • 事件时间:事件实际发生的时间,由数据自带的时间戳标识,具备可重现性。
  • 处理时间:系统处理该事件的本地时间,延迟低但可能丢失事件顺序。
  • 摄入时间:数据进入 Flink 源算子时的时间,为事件时间与处理时间的折中方案。
性能与一致性对比
时间类型延迟准确性适用场景
事件时间高高精确窗口计算、乱序数据处理
处理时间低低实时监控、容忍误差的聚合
摄入时间中中无事件时间戳的数据源
代码配置示例
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); // 设置事件时间
env.getConfig().setAutoWatermarkInterval(5000); // 每5秒生成水位线
上述代码启用事件时间语义,并配置水位线生成间隔,用于控制延迟与容错平衡。事件时间需配合水位线机制处理乱序事件,确保窗口触发的正确性。

3.2 有序与乱序数据流中的水印生成策略

在流处理系统中,水印(Watermark)用于衡量事件时间的进展,区分数据的延迟程度。针对有序数据流,可采用单调递增的时间戳生成水印,确保所有早于水印的事件已到达。
有序流中的水印生成
DataStream<Event> stream = env.addSource(new EventSource());
stream.assignTimestampsAndWatermarks(
    WatermarkStrategy.<Event>forMonotonousTimestamps()
        .withTimestampAssigner((event, timestamp) -> event.getTimestamp())
);
该策略假设事件按时间顺序到达,水印为当前最大时间戳,适用于传感器等高时序性数据源。
乱序流的容错处理
对于存在延迟的乱序流,需设置容忍窗口:
WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5))
    .withTimestampAssigner(...);
系统允许最多5秒的延迟,水印为当前最大时间戳减去边界,超出则视为迟到数据。
策略类型适用场景延迟容忍
单调递增有序流无
有界乱序弱序流固定窗口

3.3 自定义水印分配器在Scala中的实现

在流处理场景中,事件时间的精确控制依赖于水印机制。Flink允许通过自定义水印分配器实现灵活的时间语义处理。
实现AssignerWithPeriodicWatermarks接口
需继承`AssignerWithPeriodicWatermarks`并重写`extractTimestamp`和`getCurrentWatermark`方法:

class CustomWatermarkGenerator extends AssignerWithPeriodicWatermarks[Event] {
  private var maxTimestamp: Long = Long.MinValue
  private val maxOutOfOrderness = 5000L // 允许的最大乱序时间

  override def extractTimestamp(event: Event, previousElementTimestamp: Long): Long = {
    val eventTime = event.timestamp
    maxTimestamp = math.max(maxTimestamp, eventTime)
    eventTime
  }

  override def getCurrentWatermark: Watermark = {
    new Watermark(maxTimestamp - maxOutOfOrderness)
  }
}
上述代码中,`extractTimestamp`提取事件时间并更新最大值,`getCurrentWatermark`周期性生成水印,延迟5秒以容忍乱序数据。
注册水印分配器
在数据流上应用该分配器:
  • 使用.assignTimestampsAndWatermarks()绑定实例
  • 确保源数据已启用事件时间模式

第四章:容错机制与状态管理实战

4.1 Checkpoint机制原理与配置优化

Checkpoint机制是保障分布式系统容错性的核心手段,通过周期性保存运行时状态,确保故障恢复时能回退到最近的一致性检查点。
工作原理
Flink等流处理框架在数据流中插入Barrier,触发算子状态快照。所有状态信息被持久化至外部存储(如HDFS),形成全局一致的检查点。
关键配置参数
  • checkpoint-interval:两次检查点最小间隔时间
  • checkpoint-timeout:检查点超时时间
  • min-pause-between-checkpoints:检查点间最小暂停时间
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.enableCheckpointing(5000, CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setCheckpointTimeout(60000);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);
上述代码设置每5秒触发一次Exactly-Once语义的检查点,超时时间为60秒,两次检查点间至少间隔500毫秒,防止资源争抢。合理配置可平衡容错成本与性能开销。

4.2 状态后端选择与性能对比(Memory、FS、RocksDB)

在Flink中,状态后端的选择直接影响作业的性能与容错能力。常见的状态后端包括Memory、FileSystem(FS)和RocksDB。
内存状态后端(MemoryStateBackend)
适用于小状态场景,数据全量存储在JVM堆内存中,读写极快但受限于内存容量。
文件系统状态后端(FsStateBackend)
状态数据保存在堆外内存,并通过检查点持久化到远程文件系统,适合大状态且对性能要求适中的应用。
RocksDB状态后端
基于本地磁盘存储,支持超大状态,利用异步快照机制降低对任务延迟的影响。
env.setStateBackend(new RocksDBStateBackend("hdfs://checkpoint-dir"));
该代码配置RocksDB作为状态后端,数据检查点将写入HDFS。RocksDB通过分层存储缓解内存压力,适合TB级状态处理。
状态后端存储位置吞吐恢复速度
MemoryJVM堆内存高快
FS堆外+远程存储中中
RocksDB本地磁盘+远程存储低慢

4.3 Keyed State与Operator State编程实践

在Flink流处理中,状态管理是实现精确一次语义的核心。Keyed State基于键值分区,确保每个键的状态隔离,适用于窗口聚合、去重等场景。
Keyed State使用示例

ValueState<Integer> sumState = getRuntimeContext()
    .getState(new ValueStateDescriptor<>("sum", Integer.class));
Integer currentSum = sumState.value() == null ? 0 : sumState.value();
currentSum += value;
sumState.update(currentSum);
该代码定义了一个整型累加状态。通过ValueState维护当前键的累计值,每次输入元素后更新状态,保证故障恢复时状态一致性。
Operator State应用场景
  • Source算子中的偏移量管理
  • 广播配置信息到所有并行实例
  • 动态规则加载等非键控上下文
Operator State与并行算子实例绑定,常用于需要全局视角但无需按键分离的场景,支持列表状态(ListState)等类型。

4.4 精确一次语义保障与两阶段提交实现

在分布式数据处理中,精确一次(Exactly-Once)语义是确保数据不丢失且不重复的关键机制。其实现常依赖于两阶段提交(2PC)协议,通过协调者与参与者的协同操作保障事务一致性。
两阶段提交核心流程
  1. 准备阶段:协调者通知所有参与者预提交事务,参与者锁定资源并写入日志;
  2. 提交阶段:若所有参与者响应“就绪”,协调者下达最终提交指令,否则触发回滚。
// 伪代码示例:两阶段提交协调者逻辑
public void twoPhaseCommit(List<Participant> participants) {
    boolean allReady = true;
    for (Participant p : participants) {
        if (!p.prepare()) allReady = false; // 准备阶段
    }
    if (allReady) {
        for (Participant p : participants) p.commit(); // 提交
    } else {
        for (Participant p : participants) p.rollback(); // 回滚
    }
}
上述代码展示了协调者控制流程:准备阶段收集反馈,仅当全部就绪才进入提交,避免部分更新导致状态不一致。
局限性与优化方向
虽然2PC能保障强一致性,但存在阻塞风险和单点故障问题,后续演进方案如三阶段提交(3PC)与Paxos协议逐步引入超时机制与多数派共识,提升系统可用性。

第五章:进阶总结与生产环境最佳实践

配置管理的自动化策略
在大规模 Kubernetes 集群中,使用 ConfigMap 和 Secret 手动管理配置极易出错。推荐结合 Helm 与 GitOps 工具(如 ArgoCD)实现版本化配置部署。
  • 将所有环境配置存储于 Git 仓库,确保审计可追溯
  • 通过 CI/CD 流水线自动校验配置格式与敏感信息泄露
  • 使用 sealed-secrets 对 Secret 加密,避免明文暴露
高可用性架构设计
生产环境必须避免单点故障。数据库应启用主从复制,并通过 Pod 反亲和性确保副本分布于不同节点。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-ha
spec:
  replicas: 3
  template:
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - redis
                topologyKey: kubernetes.io/hostname
性能监控与告警机制
集成 Prometheus 与 Grafana 构建可视化监控体系。关键指标包括 CPU 请求/限制比、内存泄漏趋势、Pod 重启频率。
指标名称告警阈值处理建议
Container Memory Usage>85% of limit检查是否存在内存泄漏或调整资源限制
Pod Restarts>5 times in 10m排查应用崩溃日志或 Liveness 探针配置
安全加固措施
启用 PodSecurityPolicy 或使用 OPA Gatekeeper 实施策略管控。禁止容器以 root 用户运行,限制 hostPath 挂载权限。

安全发布流程:代码提交 → SAST 扫描 → 镜像构建 → CVE 检测 → 准入控制 → 集群部署

Flink维表join与异步优化(二) 1. Async I/O介绍  由上文可以发现,需要解决维表join的问题,我们可以采用两种方式来进行,一是Async I/O,二是AsyncSourceTable,今天我们先来聊一下Async I/O吧。  异步方法,通常是用来提供系统吞吐的一种方式,与同步方法不同的在于其支持的qps会高很多,同理,在flink去查找外部维表的过程中需要引入外部数据库来进行查询,那么无可避免,在大多数情况下,I... 阅读详情

相关推荐

Flink SQL + Kafka 实时统计实战:从建表、窗口聚合到踩坑排查

实时计算是处理高并发数据管道的关键技术,而乱序、延迟和状态恢复一直是工程落地的难点。Flink SQL 以声明式开发大幅降低了实时统计的门槛,结合 Kafka 作为消息缓冲层,能构建出从数据接入到指标输出的干净链路。理解事件时间、Watermark、窗口聚合等核心原理,是保证统计结果准确性的基础。该组合广泛适用于订单监控、用户行为分析、实时大屏等场景,尤其适合 Java 后端团队快速产出分钟级 GMV、TopN、UV 等指标。实际搭建时还需关注连接器配置、状态后端选型、Checkpoint 机制及 Sink

weixin_34221775的博客 238

【Flink-Scala】DataStream编程模型之数据源、数据转换、数据输出

Flink-DataStream编程模型的数据转换操作

EenKine的博客 1981

使用scala编写flink消费kafka实时计算pv,uv

实时统计pv、uv是再常见不过的大数据统计需求了,前面出过一篇SparkStreaming实时统计pv,uv的案例,这里用flink实时计算pv,uv。 我们需要统计不同数据类型每天的pv,uv情况,并且有如下要求. 每秒钟要输出最新的统计结果 程序永远跑着不会停,所以要定期清理内存里的过时数据 收到的消息里的时间字段并不是按照顺序严格递增的,所以要有一定的容错机制 访问uv并不一定每秒钟都会变...

大数据技术派 1万+

【大数据】带你理解并使用flink中的Time、Window(窗口)、Windows Function(窗口函数)

这篇文章带你理清大数据开发中flink中time、window使用概念、实战的内容,欢迎大家品读,同时示例代码也是基于最新的flink1.13开发。

Chenftli的博客 4138

flink实战--flink整合kafka (kafka source 与 kafka sink)

简介 Flink提供的Kafka连接器,用于向Kafka主题读取或写入数据。Flink Kafka Consumer集成了Flink的检查点机制,可提供一次性处理语义。为实现这一目标,Flink并不完全依赖kafka的消费者群体偏移跟踪,而是在内部跟踪和检查这些偏移。 Maven 依赖 支持到的版本 生产者和消费者类的名成 Kafka version ...

阿华田的博客 1万+

【Docker】搭建一个媒体服务器插件后端API服务 - MetaTube

本教程基于群晖的NAS设备DS423+的docker功能进行搭建,DSM版为 7.2.1-69057 Update 5。MetaTube是一个媒体服务器插件,主要用于Emby和Jellyfin媒体服务器。它的主要功能是从互联网上抓取内容并响应 JSON 数据,然后通过预安装的 MetaTube 插件请求服务器并下载相应的元数据,以与 Jellyfin/Emby 服务器配合使用。使用 MetaTube 的步骤大致如下:部署后端:首先,需要部署一个名为​ 的后端 API 服务器来抓取内容。

小小笔记大大用处 1万+

聊聊分布式事务,再说说解决方案

前言 最近很久没有写博客了,一方面是因为公司事情最近比较忙,另外一方面是因为在进行 CAP 的下一阶段的开发工作,不过目前已经告一段落了。 接下来还是开始我们今天的话题,说说分布式事务,或者说是我眼中的分布式事务,因为每个人可能对其的理解都不一样。 分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免,本文就分布式事务来简...

weixin_34390105的博客 1895

深入解析DMR协议中的4-CPFSK调制技术与实现

本文深入解析了DMR协议中采用的4-CPFSK调制技术。该技术凭借其连续相位、恒包络的特性,在有限的12.5kHz信道带宽内实现了稳健的通信,有效对抗干扰并提升功放效率,是DMR数字对讲机清晰、稳定通信的核心保障。文章详细阐述了其原理、实现细节及在协议栈中的协同作用。

weixin_29306875的博客 229

大数据:快速入门Scala+Flink

Scala 是一种多范式编程语言,它结合了面向对象编程和函数式编程的特性。Scala 这个名字是“可扩展语言”(Scalable Language)的缩写,意味着它被设计为能够适应不同规模的项目,从小型脚本到大型分布式系统。兼容 Java:Scala 代码可以编译成 Java 字节码,并且可以在任何支持 Java 的平台上运行。这意味着 Scala 可以直接使用大量的 Java 库和框架。简洁性:Scala 提供了一种更加简洁的方式来表达复杂的逻辑。

程序员猫爪 2702

【数电课程设计】---出租车计价器

文章目录1、任务要求2、方案3、收获 1、任务要求 2、方案 3、收获

LZY 1万+

LVS 负载均衡面试题及参考答案

什么是 LVS 负载均衡?它的主要作用是什么? LVS(Linux Virtual Server)是一个基于 Linux 内核的开源负载均衡项目。它通过将请求流量按照一定的算法分发到后端的多个真实服务器(Real Server)上,从而实现负载均衡的功能。 从原理上来说,LVS 工作在网络层和传输层之间。当客户端发起请求时,请求首先到达 LVS 服务器,LVS 会根据预先设定的规则和算法,比如轮询(Round - Robin)、加权轮询(Weighted Round - Robin)、最少连

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

【Flink Scala】Process Function API(底层)

Process Function API(底层)Process Function API(底层)Keyed Process FunctionTimer Service和定时器(Timers)侧输出流(Side Output) Process Function API(底层) 我们之前学习的转换算子是无法访问事件的时间戳信息和水位线信息的。而这 在一些应用场景下,极为重要。例如MapFunction这样的map转换算子就无法访问 时间戳或者当前事件的事件时间。 基于此,DataStream API提供了一系.

HR的博客 1244

华为OD机试双机位C卷:字符串计数匹配 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷 字符串计数匹配,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。 华为OD机试 字符串计数匹配, 华为OD上机考试 - 字符串计数匹配。

qq_45776114的博客 1647

flinkScala

package com. gu.networkflow_analysis import java.sql.Timestamp import java.text.SimpleDateFormat import org.apache.flink.api.common.functions.AggregateFunction import org.apache.flink.api.common.state.{ListState, ListStateDescriptor, MapState, MapStateD

weixin_43705952的博客 3018

国科大学习资料--模式识别与机器学习(黄庆明)--2020期末考试题

国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 ============================================================================================================================================================

无名何许人的博客 2601

苹果生态最佳搭档:Mac mini + OpenClaw + iPhone 远程控制

本文详细介绍如何通过iPhone远程控制Mac mini上的OpenClaw应用,打造高效苹果生态工作流。内容包括:1) 苹果生态整合优势,包括AirDrop、Handoff等功能对比;2) Mac mini配置步骤,涵盖SSH/VNC设置、网络优化及Docker部署OpenClaw;3) iPhone端SSH/VNC客户端选择与Tailscale内网穿透配置;4) 详细SSH密钥设置与连接测试方法。通过这套方案,用户可实现跨设备无缝控制OpenClaw应用,提升远程工作效率。(149字)

一键难忘的博客 793

Flink入门(一)(Java和scala)

Flink批处理 从文件中读取单词,计算频次 Scala版本 import org.apache.flink.api.scala.ExecutionEnvironment object BatchWordCountJob { def main(args: Array[String]) { val env = ExecutionEnvironment.getExecutionEnvi...

微瞰技术的博客 4127

基于STM32L4XX、HAL库的IP101GRI以太网收发器(PHY)驱动程序设计

define IP101GRI_PHY_ADDRESS 0x01 // 根据硬件设计设置PHY地址。#define IP101GRI_PHYSTS 0x10 // PHY状态寄存器。#define IP101GRI_PHYINIR 0x12 // PHY中断寄存器。#define IP101GRI_PHYCR 0x14 // PHY控制寄存器。#define IP101GRI_PHYID2 0x03 // PHY标识符2。

zhusl6688的博客 721

Flink 框架下scala与java混合编程问题

最近在应用Flink做相关业务设计,使用scala与java的混合编程,遇到一些问题,在这里做个记录. 问题1: Error:(85, 23) value foreach is not a member of java.util.ArrayList[com.icsoc.report.model.Message[_]] for (msg &lt;- messages) { 这...

梦想成真那天 6867

VC中sqlite的使用

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

蓝牙模块HM-10手册

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

Flink 系列文章汇总索引

某一知识点,并辅以具体的示例进行说明。本专栏的文章编号可能不是顺序的,主要是因为写的时候顺序没统一,但相关的文章又引入了,所以后面就没有调整了,按照写文章的顺序进行编号。但一个专题的顺序号是统一的,不存在编号跳跃情况。

alanchanchn的专栏 7万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

流处理与批处理:Spark与Flink核心原理、实战用法

对比维度批处理流处理数据边界有界、静态无界、动态计算优先级高吞吐、低实时性低延迟、高准确性运行模式定时触发、跑完即停7*24h常驻、持续运行数据时效历史数据、离线统计增量数据、实时更新误区1:Spark Streaming 是真正实时流 → 错!本质是微批,存在固定批次延迟误区2:Flink 只适合流处理 → 错!Flink 流批一体,批处理完全可生产落地误区3:流批一体就是API统一 → 错!Spark是API统一,Flink是底层运行时统一,才是真正一体。

编写博客,学习交流 326

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Flink SQL入门实战:从零搭建流处理环境与核心概念解析

在实时数据处理领域,流处理技术已成为应对海量、连续数据的关键架构。其核心原理在于将无界数据流视为动态表,通过声明式查询实现低延迟计算。Flink SQL作为流批一体的SQL引擎,显著降低了实时应用开发门槛,让开发者能够使用熟悉的SQL语法处理流式数据。这一技术价值体现在提升开发效率、简化状态管理和保证Exactly-Once语义等方面,广泛应用于实时监控、用户行为分析和实时ETL等场景。本文聚焦Flink SQL的实战入门,详细讲解如何搭建本地开发环境、配置Kafka连接器,并深入解析事件时间、Waterm

weixin_34408717的博客 307

Flink开发语言使用Java还是Scala合适?

在大数据处理领域,Apache Flink是一个备受瞩目的流处理框架。随着Flink的普及,开发者在选择开发语言时常常面临一个问题:究竟是使用Java还是Scala更合适?本文将从多个角度分析Java和Scala在Flink开发中的优劣,帮助你做出更明智的选择。Apache Flink是一个开源的流处理框架,旨在在分布式环境中处理大规模的数据流。它最早由柏林工业大学的一个研究项目衍生而来,并于2014年成为Apache软件基金会的顶级项目。

FLK_9090的博客 1890

如何用Scala打造零数据丢失的流处理管道?10个关键步骤详解

掌握Scala流处理的高可靠架构设计,10步实现零数据丢失。涵盖Kafka集成、背压机制、容错策略与Exactly-Once语义保障,适用于实时计算与大规模数据管道。构建稳定高效系统的必备指南,值得收藏。

QuickDebug的博客 572

从流处理内核到生态融合:深入解析Spark与Flink的架构哲学与选型实践

本文深入解析了Spark与Flink在流处理内核、状态管理、时间语义和生态融合等方面的架构哲学与选型实践。通过对比微批处理与真流处理的本质差异,探讨了两种技术在不同场景下的优劣势,并提供了生产环境中的调优指南和选型决策树,帮助开发者根据实际需求选择最适合的流处理框架。

weixin_34279579的博客 419

Apache Flink Data Source API 完全指南:从分片原理到自定义 Source 实现

本文以 Apache Flink 的 Data Source(数据源)API 为核心,系统讲解 FLIP-27 引入的新 Source API 的架构原理、核心接口(`Source`、`SplitEnumerator`、`SourceReader`)、高层 `SplitReader` 编程模型,以及事件时间与分片级水印的生成机制。无论你是想深入理解 Flink 数据接入的底层工作方式,还是准备基于

gitblog_00732的博客 416
上一篇: Scala开发高手进阶:8大数据类型使用误区及最佳实践(一线专家亲授)
下一篇: Ruby模块到底怎么用?:9个你必须掌握的实战场景与技巧
fastdebug
博客等级 码龄11年 149粉丝 2006原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值