Jorgen's blog Jorgen's blog
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

jorgen

Love it, make mistakes, learn, keep grinding.
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 大数据入门
  • flink
  • flink第二弹
  • Flink-Config
  • Flink架构原理:深入理解分布式数据处理引擎
  • Flink API编程模型-掌握DataStream与Table API
  • Flink SQL与Table API - 结构化数据处理的新范式
  • Flink SQL与Table API - 结构化数据处理的高级接口
  • Flink Table API & SQL - 关系型数据处理在流计算中的应用
  • Flink核心API详解-掌握流处理编程模型
    • 前言
    • DataStream API:流处理的基石
      • 基础转换算子
      • 高级转换算子
    • Table API & SQL:声明式计算的利器
      • Table API基础
      • SQL特性
    • Process Function:精细化控制的利器
      • KeyedProcessFunction示例
      • 核心能力
    • 状态管理:流处理的灵魂
      • 状态类型对比
      • 状态一致性保障
    • 窗口操作:时间与数据的艺术
      • 窗口类型详解
      • 1. 滚动窗口(Tumbling Window)
      • 2. 滑动窗口(Sliding Window)
      • 3. 会话窗口(Session Window)
      • 窗口函数选择
    • 结语
  • Flink核心编程模型与DataStream API实践指南
  • Flink流批统一模型-批处理是流处理的一种特殊情况
  • Flink状态管理-流处理应用的核心支柱
  • Flink状态管理与容错机制-保证流处理可靠性的核心
  • Flink状态管理与容错机制-构建可靠的数据处理管道
  • Flink状态管理与容错机制-构建可靠的流处理应用
  • Flink状态管理与容错机制
  • HDFS架构原理-大数据存储的基石
  • Flink性能优化与调优-构建高效流处理应用的关键
  • Flink连接器详解-无缝集成外部系统的桥梁
  • Flink部署与运维-构建稳定可靠的流处理平台
  • Flink的窗口机制与时间语义-流处理的核心支柱
  • Flink的Watermark机制-流处理中的时间控制器
  • Flink CEP详解-流数据中的复杂事件处理
  • Flink作业提交与资源管理-构建高效流处理应用的关键
  • Flink与机器学习:构建实时智能数据处理管道
  • Flink的测试与调试-构建健壮流处理应用的关键
  • Flink Exactly-Once语义实现-构建高可靠流处理应用的核心
  • Flink的监控与可观测性-构建健壮流处理系统的眼睛
  • Flink CDC入门与实践:构建实时数据同步管道
  • big_data
Jorgen
2023-11-15
目录

Flink核心API详解-掌握流处理编程模型

# 前言

在之前的文章中,我们已经深入探讨了Flink的架构原理和配置管理。🏗️ 当我们搭建好了基础环境,配置好了参数,接下来最关键的就是如何使用Flink的API来构建我们的流处理应用。💡

提示

"API是连接开发者与框架的桥梁,掌握核心API是流处理工程师的必备技能"

本文将系统性地介绍Flink三大核心API:DataStream API、Table API/SQL和Process Function,帮助大家建立完整的编程模型认知。📡


# DataStream API:流处理的基石

DataStream API是Flink最核心的API,提供了最底层的流处理能力。它支持Java和Scala两种语言,提供了丰富的转换算子。

# 基础转换算子

// 创建数据流
DataStream<String> text = env.socketTextStream("localhost", 9999);

// 基础转换
DataStream<Tuple2<String, Integer>> wordCounts = text
    .flatMap(new Splitter())      // 分词
    .keyBy(0)                     // 按单词分组
    .sum(1);                      // 求和
1
2
3
4
5
6
7
8

# 高级转换算子

  • 窗口操作:时间窗口、计数窗口、会话窗口
  • 状态管理:ValueState、ListState、MapState
  • 连接器:Kafka、Redis、Elasticsearch等

THEOREM

DataStream API的特点:

  1. 声明式API:通过链式调用描述数据处理流程
  2. 无状态/有状态操作:支持简单转换和复杂状态计算
  3. 低延迟:毫秒级处理延迟
  4. 容错性:基于检查点的Exactly-Once语义

# Table API & SQL:声明式计算的利器

随着业务复杂度提升,越来越多的开发者倾向于使用声明式语言。Table API和SQL应运而生,让数据工程师能够用熟悉的SQL语法处理流数据。

# Table API基础

// 创建表环境
TableEnvironment tEnv = TableEnvironment.create();

// 注册数据源
tEnv.executeSql("CREATE TABLE clicks (" +
    "user STRING, " +
    "url STRING, " +
    "ts TIMESTAMP(3), " +
    "WATERMARK FOR ts AS ts - INTERVAL '5' SECOND" +
    ") WITH (" +
    " 'connector' = 'kafka'," +
    " ... " +
    ")");

// 查询数据
Table result = tEnv.sqlQuery("SELECT user, COUNT(url) FROM clicks GROUP BY user, TUMBLE(ts, INTERVAL '1' MINUTE)");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# SQL特性

  • 流式SQL:支持标准SQL语法,自动处理流式特性
  • 时间属性:处理时间、事件时间和摄入时间
  • 连接器:丰富的内置连接器
  • 窗口函数:TUMBLE、HOP、CUMULATE等窗口

🤔 当我们需要快速实现复杂聚合逻辑时,Table API/SQL往往比DataStream API更简洁高效。但要注意,某些复杂的状态操作仍需回退到DataStream API。


# Process Function:精细化控制的利器

当标准API无法满足需求时,Process Function提供了对事件时间和状态的最细粒度控制。

# KeyedProcessFunction示例

public class AverageSensorReadings extends KeyedProcessFunction<String, SensorReading, Tuple3<String, Double, Long>> {
    private ValueState<Double> sumState;
    private ValueState<Long> countState;
    
    @Override
    public void open(Configuration parameters) {
        sumState = getRuntimeContext().getState(
            new ValueStateDescriptor<>("sum", Double.class));
        countState = getRuntimeContext().getState(
            new ValueStateDescriptor<>("count", Long.class));
    }
    
    @Override
    public void processElement(SensorReading value, Context ctx, Collector<Tuple3<String, Double, Long>> out) {
        // 状态更新逻辑
        // 定时器触发逻辑
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 核心能力

  1. 事件时间处理:精确控制时间戳和水位线
  2. 状态管理:访问Keyed State和Operator State
  3. 定时器:处理延迟数据和复杂时间逻辑
  4. 侧输出流:分流处理异常数据

"Process Function是Flink最强大的API,也是最难掌握的API"


# 状态管理:流处理的灵魂

有状态计算是流处理的核心。Flink提供了三种状态类型:

# 状态类型对比

状态类型 适用场景 特点
ValueState 单值状态 每个Key对应一个值
ListState 列表状态 存储可变长列表
MapState 映射状态 Key-Value对存储
ReducingState 聚合状态 内置reduce函数
AggregatingState 聚合状态 自定义聚合逻辑

# 状态一致性保障

// 开启检查点
env.enableCheckpointing(5000); // 5秒间隔

// 配置一致性级别
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
1
2
3
4
5

# 窗口操作:时间与数据的艺术

窗口是流处理中最核心的概念之一,Flink提供了丰富的窗口类型:

# 窗口类型详解

# 1. 滚动窗口(Tumbling Window)

DataStream<SensorReading> readings = ...;
readings
    .keyBy("sensorId")
    .window(TumblingEventTimeWindows.of(Time.minutes(5)))
    .aggregate(new AvgTemp());
1
2
3
4
5

# 2. 滑动窗口(Sliding Window)

readings
    .keyBy("sensorId")
    .window(SlidingEventTimeWindows.of(Time.minutes(10), Time.minutes(5)))
    .process(new WindowProcessFunction());
1
2
3
4

# 3. 会话窗口(Session Window)

readings
    .keyBy("sensorId")
    .window(EventTimeSessionWindows.withGap(Time.minutes(10)))
    .aggregate(new AvgTemp());
1
2
3
4

# 窗口函数选择

  • 增量聚合:reduce()/aggregate()(低延迟)
  • 全量窗口:process()(灵活但高延迟)
  • 窗口API:apply()(已弃用)

# 结语

通过本文的系统介绍,我们掌握了Flink三大核心API的特点和适用场景:

  1. DataStream API:基础流处理,灵活但需要更多编码
  2. Table API/SQL:声明式计算,适合业务逻辑实现
  3. Process Function:精细化控制,解决复杂场景需求

在实际项目中,建议采用组合使用的方式:用Table API/SQL实现业务逻辑,遇到复杂场景时回退到Process Function。🚀

"掌握API只是开始,理解背后的状态管理和时间语义才是流处理工程师进阶的关键"

未来我们将继续探讨Flink的性能优化和实战案例,敬请关注!🤝

#Flink#API#流处理
上次更新: 2026/01/28, 14:21:05
Flink Table API & SQL - 关系型数据处理在流计算中的应用
Flink核心编程模型与DataStream API实践指南

← Flink Table API & SQL - 关系型数据处理在流计算中的应用 Flink核心编程模型与DataStream API实践指南→

最近更新
01
LLM
01-30
02
intro
01-30
03
intro
01-30
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jorgen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式