Apache Flink实战:从5分钟快速入门到高可用集群的完整部署指南

Words 3919Read Time 10 min
2020-4-11
2026-2-11
cover
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)模式。简单说就是把流数据攒一小批,然后用批处理的方式处理。就像超市收银员,不是顾客一来就结账,而是等几个人排队后一起处理。
image
Spark 的 DAG 执行模型
虽然 Spark 2.x 推出了 Structured Streaming,支持连续处理模式,但在功能完整性和 Exactly-Once 语义支持上仍有提升空间。
Flink 的做法:
Flink 是真正的流处理。每一条数据到来都能立即触发计算,就像流水线上的工人,看到零件就开始组装,不需要等待。这让 Flink 在延迟方面具有天然优势。
image
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
image
解压后,你会看到整齐的目录结构。Flink 的设计哲学之一就是简洁——不需要复杂的配置,开箱即用。

启动服务

启动成功后,使用 jps 命令可以看到 StandaloneSessionClusterEntrypoint 进程:
image
这个长长的类名虽然看起来吓人,但它就是 Flink 的主进程。有了它,你的 Flink 就已经在运行了!

配置防火墙

Flink 的 Web UI 运行在 8081 端口,我们需要开放这个端口:
image

访问 Web UI

在浏览器中输入 http://your-ip:8081,你会看到 Flink 漂亮的管理界面:
image
这个界面不仅好看,还非常实用。你可以:
  • 查看任务运行状态
  • 监控资源使用情况
  • 上传并运行 JAR 包
  • 查看任务日志

第一个程序:WordCount 实战

理论说得再多,不如动手试试。让我们运行 Flink 自带的 WordCount 示例。

准备工作:开启 3 个终端

这个实验需要三个终端协同工作,就像乐队的三个乐器:

终端 1:启动数据源

这里的 nc(netcat)命令会创建一个 socket 服务器。你在这个终端输入的任何文本,都会通过网络发送出去。
image

终端 2:启动 Flink 任务

image
这个命令启动了一个 Flink 任务,它会连接到 8888 端口,实时统计单词频率。

终端 3:查看实时日志

image

见证奇迹的时刻

现在,回到终端 1,输入一些文本:
终端 3中,你会实时看到单词统计结果:
image
看到了吗?你输入的文本被实时处理了!这就是流处理的魅力——数据一到,结果就出
🎉

集群部署:构建高可用架构

单机玩得开心,但生产环境需要集群。让我们搭建一个真正的 Flink 集群。

集群规划

我们将搭建一个"一主两从"的架构:
📌

配置集群

1. 修改 flink-conf.yaml

所有节点上编辑配置文件:
💡

2. 配置 masters 文件

3. 配置 workers 文件

4. 开放防火墙端口

Master 节点上:
image

启动集群

只需在 Master 节点执行:
image
使用 jps 检查进程:
  • Master 节点应该有 StandaloneSessionClusterEntrypoint
  • Slave 节点应该有 TaskManagerRunner

高可用配置:永不宕机的秘密

生产环境最怕的就是单点故障。如果 JobManager 挂了,整个集群就瘫痪了。Flink 通过 ZooKeeper 实现高可用。

高可用架构原理

🔄

配置步骤

1. 修改 flink-conf.yaml

添加以下配置:

2. 修改 masters 文件

配置两个 JobManager:

3. 配置 zoo.cfg

4. 分发配置文件

启动与测试

启动集群

使用 jps 检查,会看到两个 StandaloneSessionClusterEntrypoint 进程。
image

查看 Leader

连接 ZooKeeper 客户端:
image
可以看到 10.34.11.70:8899 是当前 Leader。

故障切换测试

让我们模拟 Leader 节点故障:
image
等待几秒后,再次查询 Leader:
image
Leader 已自动切换到 10.34.11.154:8899
整个过程用户无感知,运行中的任务会从最近的检查点恢复,实现真正的高可用。

Flink 开发实战

光会部署还不够,我们还要会写代码。让我们开发一个从 Kafka 读取数据并写入 PostgreSQL 的完整流处理应用。

应用架构

📊

Flink 编程三部曲

Flink 程序由三部分组成:
  1. Source:数据从哪里来?(Kafka、文件、Socket 等)
  1. Transformation:数据如何处理?(过滤、聚合、连接等)
  1. Sink:数据写到哪里去?(数据库、文件、消息队列等)

Maven 依赖配置

主程序:FlinkApp

🔍

自定义 Sink:PostgreSQLSink

Sink 是流处理的终点,负责将数据写入外部系统。我们需要实现三个关键方法:

任务提交与运行

代码写好了,如何部署到集群呢?Flink 提供了两种方式。

方式一:命令行提交

参数说明:
  • -c:指定主类(main 方法所在的类)
  • JAR 文件路径:编译打包后的应用

方式二:Web UI 提交(推荐)

Step 1:上传 JAR 包

访问 Flink Web UI,点击 Submit New Job
notion image

Step 2:选择文件

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

Step 3:配置参数

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

Step 4:提交运行

点击 Submit 按钮,任务开始运行:
notion image
Running Jobs 页面可以看到:
  • 任务拓扑图(DAG)
  • 各算子的吞吐量和延迟
  • 检查点统计
  • 异常日志
🎨

未来展望

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,你将在大数据时代拥有更强的竞争力。
下一步建议:
  1. 深入学习 Flink 的状态管理和检查点机制
  1. 探索 Flink SQL 和 Table API
  1. 研究 Flink CDC(Change Data Capture)实现实时数仓
  1. 尝试 Flink CEP 进行复杂事件处理

参考资料

  • Flink Forward 大会演讲资料
  • 《Flink 基础教程》(Manning 出版社)
Loading...