type
Post
status
Published
date
Apr 11, 2020 13:12
slug
summary
本文全面介绍Apache Flink流处理框架的部署与开发实践,涵盖Flink核心概念、与Spark的对比分析、单机及集群部署方案、高可用配置、以及完整的Kafka到PostgreSQL的开发案例。通过实战演示,帮助开发者快速掌握Flink的部署架构与编程模式。
tags
Flink
Kafka
Infrastructure
category
Data Engineering
icon
password
wordCount
4611
前言
Apache Flink 作为新一代流处理框架,正在逐步改变大数据处理的格局。与传统的批处理不同,Flink 从设计之初就坚持"万物皆是流"的理念——批处理只是流处理的特例。这种思想让 Flink 在实时计算领域展现出强大的生命力。
核心要点
- Flink 是真正的流处理框架,支持事件驱动的实时计算
- 提供完善的状态管理和 Exactly-Once 语义保证
- 可部署在 Standalone、YARN、Kubernetes 等多种环境
- 支持 Java、Scala、Python 等多种开发语言
本文将带你从零开始搭建 Flink 环境,并通过实战案例掌握 Flink 开发的核心技巧。
实验环境
- CentOS 7
- HDP 3.1
- Scala 2.11
- Flink 1.10.0
Flink 核心概念
什么是 Flink?
Apache Flink 是一个分布式流处理引擎,专为无界和有界数据流上的有状态计算而设计。它能在各种集群环境中运行,以内存速度处理任意规模的数据。
听起来很抽象?简单来说,Flink 就像是一个永不停歇的数据处理工厂——数据像流水一样源源不断地进来,Flink 实时加工处理,然后输出结果。
Flink 的三大特点
1. 万物皆是流
Flink 将数据分为两种类型:
数据类型 | 特点 | 处理方式 |
无界流(Unbounded) | 有开始无结束,数据持续产生 | 必须实时处理,按事件顺序摄取 |
有界流(Bounded) | 有明确的开始和结束 | 可以等数据到齐再处理,即批处理 |
无界流的典型场景是用户点击流、传感器数据等,这些数据永远不会"结束"。而有界流就像一个 CSV 文件,数据是有限的。
2. 分布式架构
Flink 不是孤军奋战,它能与各种集群资源管理器无缝集成:
- Hadoop YARN - 大数据生态的老朋友
- Apache Mesos - 通用集群管理器
- Kubernetes - 云原生时代的新宠
- Standalone - 独立部署模式
无论你的团队使用哪种基础设施,Flink 都能优雅地融入其中。
3. 内存级性能
Flink 将任务状态保存在内存中,这让它能够以惊人的速度处理数据。想象一下,每秒处理数百万条记录,同时还能保证数据不丢失、不重复——这就是 Flink 的魔力。
Flink vs Spark:谁更胜一筹?
在流处理领域,Flink 和 Spark 经常被拿来比较。让我们看看它们的核心差异。
处理模型对比
Spark 的做法:
Spark 采用"微批处理"(Micro-Batching)模式。简单说就是把流数据攒一小批,然后用批处理的方式处理。就像超市收银员,不是顾客一来就结账,而是等几个人排队后一起处理。

Spark 的 DAG 执行模型
虽然 Spark 2.x 推出了 Structured Streaming,支持连续处理模式,但在功能完整性和 Exactly-Once 语义支持上仍有提升空间。
Flink 的做法:
Flink 是真正的流处理。每一条数据到来都能立即触发计算,就像流水线上的工人,看到零件就开始组装,不需要等待。这让 Flink 在延迟方面具有天然优势。

Flink 的流处理工作流
哲学思想的差异
- Spark:批是本质,流是特例(Batch-first)
- Flink:流是本质,批是特例(Stream-first)
这种思想上的差异,决定了两者在架构设计上的根本不同。
API 生态对比
层次 | Spark | Flink |
底层 API | RDD | Process Function |
核心 API | DataStream / DataSet / Structured Stream | DataStream / DataSet |
SQL 层 | Spark SQL | Table API & SQL |
机器学习 | MLlib | FlinkML |
图计算 | GraphX | Gelly |
特色功能 | - | CEP(复杂事件处理) |
Flink 的 CEP(Complex Event Processing)是其独特优势,特别适合金融风控、IoT 异常检测等场景。
语言支持对比
语言 | Spark | Flink |
Java | ✅ | ✅ |
Scala | ✅ | ✅ |
Python | ✅ | ✅ |
R | ✅ | ❌(需第三方支持) |
SQL | ✅ | ✅ |
单机部署:5 分钟启动 Flink
让我们从最简单的单机部署开始,感受 Flink 的魅力。
下载与安装
访问 Flink 官网下载页,选择
flink-1.10.0-bin-scala_2.11.tgz。
解压后,你会看到整齐的目录结构。Flink 的设计哲学之一就是简洁——不需要复杂的配置,开箱即用。
启动服务
启动成功后,使用
jps 命令可以看到 StandaloneSessionClusterEntrypoint 进程:
这个长长的类名虽然看起来吓人,但它就是 Flink 的主进程。有了它,你的 Flink 就已经在运行了!
配置防火墙
Flink 的 Web UI 运行在 8081 端口,我们需要开放这个端口:

访问 Web UI
在浏览器中输入
http://your-ip:8081,你会看到 Flink 漂亮的管理界面:
这个界面不仅好看,还非常实用。你可以:
- 查看任务运行状态
- 监控资源使用情况
- 上传并运行 JAR 包
- 查看任务日志
第一个程序:WordCount 实战
理论说得再多,不如动手试试。让我们运行 Flink 自带的 WordCount 示例。
准备工作:开启 3 个终端
这个实验需要三个终端协同工作,就像乐队的三个乐器:
终端 1:启动数据源
这里的
nc(netcat)命令会创建一个 socket 服务器。你在这个终端输入的任何文本,都会通过网络发送出去。
终端 2:启动 Flink 任务

这个命令启动了一个 Flink 任务,它会连接到 8888 端口,实时统计单词频率。
终端 3:查看实时日志

见证奇迹的时刻
现在,回到终端 1,输入一些文本:
在终端 3中,你会实时看到单词统计结果:

看到了吗?你输入的文本被实时处理了!这就是流处理的魅力——数据一到,结果就出。
恭喜你!
你已经成功运行了第一个 Flink 程序。虽然这只是一个简单的 WordCount,但它展示了 Flink 的核心能力:实时数据摄取、处理和输出。
集群部署:构建高可用架构
单机玩得开心,但生产环境需要集群。让我们搭建一个真正的 Flink 集群。
集群规划
我们将搭建一个"一主两从"的架构:
主机名 | IP 地址 | 角色 |
hdp-m-1 | 10.34.11.70 | Master(JobManager) |
hdp-s-1 | 10.34.11.142 | Slave(TaskManager) |
hdp-s-2 | 10.34.11.154 | Slave(TaskManager) |
角色说明
- JobManager:集群的大脑,负责调度任务、管理资源、协调检查点
- TaskManager:集群的劳动力,负责执行具体的计算任务
一个 JobManager 可以管理多个 TaskManager,形成分布式计算集群。
配置集群
1. 修改 flink-conf.yaml
在所有节点上编辑配置文件:
参数解读
taskmanager.numberOfTaskSlots: 4:每个 TaskManager 可以同时运行 4 个任务
parallelism.default: 16:默认并行度为 16(2 个 TaskManager × 4 槽 × 2 线程)
- 合理的并行度能充分利用集群资源,提升吞吐量
2. 配置 masters 文件
3. 配置 workers 文件
4. 开放防火墙端口
在 Master 节点上:

启动集群
只需在 Master 节点执行:

使用
jps 检查进程:- Master 节点应该有
StandaloneSessionClusterEntrypoint
- Slave 节点应该有
TaskManagerRunner
高可用配置:永不宕机的秘密
生产环境最怕的就是单点故障。如果 JobManager 挂了,整个集群就瘫痪了。Flink 通过 ZooKeeper 实现高可用。
高可用架构原理
工作机制
- 多个 JobManager 同时运行,但只有一个是 Leader
- ZooKeeper 负责选举 Leader 并监控其状态
- 如果 Leader 故障,ZooKeeper 立即选举新的 Leader
- 任务状态存储在共享存储中,新 Leader 能无缝接管
这就像古代的"太子监国"制度——皇帝(Leader)生病了,太子(Standby)立即接管政务,确保国家运转不中断。
配置步骤
1. 修改 flink-conf.yaml
添加以下配置:
2. 修改 masters 文件
配置两个 JobManager:
3. 配置 zoo.cfg
4. 分发配置文件
启动与测试
启动集群
使用
jps 检查,会看到两个 StandaloneSessionClusterEntrypoint 进程。
查看 Leader
连接 ZooKeeper 客户端:

可以看到
10.34.11.70:8899 是当前 Leader。故障切换测试
让我们模拟 Leader 节点故障:

等待几秒后,再次查询 Leader:

Leader 已自动切换到
10.34.11.154:8899!整个过程用户无感知,运行中的任务会从最近的检查点恢复,实现真正的高可用。
高可用测试成功!
从 Leader 故障到新 Leader 选举完成,通常只需要几秒钟。这种快速故障转移能力,是 Flink 在生产环境中值得信赖的重要原因。
Flink 开发实战
光会部署还不够,我们还要会写代码。让我们开发一个从 Kafka 读取数据并写入 PostgreSQL 的完整流处理应用。
应用架构
数据流向
Kafka(数据源) → Flink(流处理) → PostgreSQL(数据存储)
这是最经典的流处理架构,适用于日志收集、用户行为分析、实时监控等场景。
Flink 编程三部曲
Flink 程序由三部分组成:
- Source:数据从哪里来?(Kafka、文件、Socket 等)
- Transformation:数据如何处理?(过滤、聚合、连接等)
- Sink:数据写到哪里去?(数据库、文件、消息队列等)
Maven 依赖配置
主程序:FlinkApp
代码亮点
- 检查点机制:
enableCheckpointing(500)每 500ms 保存一次状态,确保故障恢复
- 偏移量管理:从 HBase 读取上次消费位置,实现 Exactly-Once 语义
- 并行处理:
setParallelism(8)使用 8 个并行任务,充分利用集群资源
自定义 Sink:PostgreSQLSink
Sink 是流处理的终点,负责将数据写入外部系统。我们需要实现三个关键方法:
性能优化建议
当前实现是逐条插入,适合学习但性能不佳。生产环境建议:
- 批量插入:攒够 N 条数据后批量写入
- 异步 I/O:使用 Flink 的 AsyncDataStream API
- 连接池:使用 HikariCP 等连接池避免频繁创建连接
- 重试机制:网络抖动时自动重试而不是直接失败
任务提交与运行
代码写好了,如何部署到集群呢?Flink 提供了两种方式。
方式一:命令行提交
参数说明:
-c:指定主类(main 方法所在的类)
- JAR 文件路径:编译打包后的应用
方式二:Web UI 提交(推荐)
Step 1:上传 JAR 包
访问 Flink Web UI,点击 Submit New Job:

Step 2:选择文件
点击 Add New 按钮,选择本地的 JAR 文件:

Step 3:配置参数
上传完成后,可以配置:
- Entry Class:主类名
- Parallelism:并行度
- Program Arguments:程序参数

Step 4:提交运行
点击 Submit 按钮,任务开始运行:

在 Running Jobs 页面可以看到:
- 任务拓扑图(DAG)
- 各算子的吞吐量和延迟
- 检查点统计
- 异常日志
Web UI 的优势
- 可视化:任务执行过程一目了然
- 实时监控:吞吐量、背压、延迟等指标实时展示
- 便捷调试:出错时可以直接查看日志和堆栈跟踪
- 无需登录服务器:在浏览器中完成所有操作
未来展望
Flink 的生态正在快速发展,未来可期:
1. Flink SQL 的崛起
SQL 化是趋势,让更多非开发人员也能使用 Flink。未来的实时数仓、OLAP 分析都将基于 Flink SQL。
2. 批流一体
Flink 1.12+ 版本已经实现批流统一,一套代码同时支持批处理和流处理,彻底打通实时和离线。
3. 机器学习集成
Flink ML 与 TensorFlow、PyTorch 的集成将让实时特征工程和在线学习成为可能。
4. Serverless Flink
云厂商(阿里云、AWS、Azure)纷纷推出 Flink Serverless 服务,按需计费、弹性伸缩,降低使用门槛。
典型应用场景:
- 电商实时推荐:用户浏览行为 → Flink 实时计算 → 个性化推荐
- 金融风控:交易流水 → Flink CEP 规则引擎 → 实时反欺诈
- IoT 监控:传感器数据 → Flink 异常检测 → 告警通知
- 实时数仓:业务数据变更 → Flink CDC → 实时同步到数据仓库
总结
本文从零开始,系统介绍了 Apache Flink 的部署与开发:
核心概念
- Flink 是真正的流处理框架,"万物皆是流"
- 支持 Exactly-Once 语义,保证数据准确性
- 内存级性能,低延迟高吞吐
部署架构
- 单机部署:5 分钟快速体验
- 集群部署:分布式计算能力
- 高可用配置:ZooKeeper 实现故障自动切换
开发实战
- Source-Transformation-Sink 三段式编程模型
- Kafka 数据源接入
- 自定义 Sink 实现数据落地
- Web UI 可视化任务管理
Flink 作为新一代流处理框架,正在成为实时计算领域的事实标准。掌握 Flink,你将在大数据时代拥有更强的竞争力。
下一步建议:
- 深入学习 Flink 的状态管理和检查点机制
- 探索 Flink SQL 和 Table API
- 研究 Flink CDC(Change Data Capture)实现实时数仓
- 尝试 Flink CEP 进行复杂事件处理
参考资料
- Flink Forward 大会演讲资料
- 《Flink 基础教程》(Manning 出版社)
