第2章 环境搭建:把Flink跑起来

说实话,搞大数据这行,环境搭建往往是第一道坎。很多同学在IDE里写了一大堆代码,结果部署到集群上就各种报错——说白了,就是环境没搞明白。这一章,我带你把Flink的几种部署方式都过一遍,从本地到集群,从Standalone到YARN,一步不落。

本章核心目标:掌握Flink四种运行模式的搭建与验证,能根据业务场景选择合适的部署方案。

2.1 Flink本地模式安装

本地模式,说白了就是单机跑。我刚开始学Flink时,就是先在本机搭个环境,写几个WordCount练手。这种方式最适合开发调试,不用考虑分布式那些烦心事。

前置条件

  • JDK 8 或 11(我建议用JDK 8,踩坑最少)
  • Maven 3.x(可选,但建议装)
  • Linux/MacOS/WSL(Windows用户我强烈建议用WSL)

安装步骤

  1. 下载Flink安装包
wget https://archive.apache.org/dist/flink/flink-1.17.0/flink-1.17.0-bin-scala_2.12.tgz
tar -xzf flink-1.17.0-bin-scala_2.12.tgz
cd flink-1.17.0
  1. 启动本地集群
./bin/start-cluster.sh

启动后,访问 http://localhost:8081,就能看到Flink的Web UI了。嗯,这里要注意——如果8081端口被占用了,可以去 conf/flink-conf.yaml 里改 rest.port。

我的小习惯:每次启动后,我习惯先看一眼Web UI的"Task Managers"页面,确认至少有一个TaskManager在线。这能帮你快速判断集群是否真的起来了。

验证安装

跑一个官方示例,看看能不能正常执行:

./bin/flink run examples/streaming/WordCount.jar

如果控制台输出了单词计数结果,恭喜你,本地模式搞定了。

2.2 Flink Standalone集群部署

Standalone模式,就是Flink自己管资源,不依赖YARN、K8s这些外部调度器。我在做小规模POC(概念验证)时经常用这种模式,部署简单,排查问题也方便。

集群架构

先看一张图,帮你理解Standalone集群里各个角色的关系:

Flink Standalone 集群架构 JobManager TaskManager 1 Slot: 4 TaskManager 2 Slot: 4 TaskManager 3 Slot: 4 数据源 (Kafka) 数据汇 (MySQL) 说明: JobManager 负责任务调度与协调,TaskManager 负责实际计算。 每个 TaskManager 有多个 Slot,Slot 是资源分配的最小单位。

部署步骤

假设你有三台机器:node1、node2、node3。node1做JobManager,三台都做TaskManager。

  1. 配置 conf/flink-conf.yaml
jobmanager.rpc.address: node1
jobmanager.rpc.port: 6123
taskmanager.numberOfTaskSlots: 4
parallelism.default: 2
  1. 配置 conf/workers
node1
node2
node3
  1. 分发安装包到所有节点
scp -r flink-1.17.0 node2:/opt/
scp -r flink-1.17.0 node3:/opt/
  1. 启动集群
./bin/start-cluster.sh

我曾经踩过的坑:第一次搭Standalone集群时,我忘了配SSH免密登录,结果start-cluster.sh执行到一半就卡住了。后来发现Flink是通过SSH去远程启动TaskManager的。所以,务必先配好 ssh-copy-id。

2.3 Flink on YARN部署

生产环境中,Standalone模式用得不多。为什么?因为资源没法动态调整。你想想看,公司集群上跑着Spark、Hive、Flink各种任务,如果Flink自己管资源,很容易跟别人抢CPU和内存。

Flink on YARN,就是把资源管理交给YARN。Flink的任务作为YARN的一个Application运行。我目前在做的数据同步项目,就是跑在YARN上的。

两种运行模式

模式 特点 适用场景
Session模式 共享JobManager,多个任务共用集群 短任务、临时查询、开发调试
Per-Job模式 每个任务独享JobManager,资源隔离好 生产环境、长任务、重要数据同步

Session模式部署

# 启动YARN Session
./bin/yarn-session.sh -n 4 -s 4 -jm 1024 -tm 2048

# 提交任务到Session
./bin/flink run -m yarn-cluster -yn 4 examples/streaming/WordCount.jar

Per-Job模式部署

./bin/flink run -m yarn-cluster \
  -yjm 1024 \
  -ytm 2048 \
  -ys 4 \
  -ynm my_flink_job \
  ./examples/streaming/WordCount.jar

我的建议:生产环境用Per-Job模式。虽然Session模式启动快,但一旦某个任务出问题把JobManager搞挂了,所有任务都得跟着遭殃。我在项目里吃过这个亏,后来全改成Per-Job了。

2.4 Flink命令行与Web UI

环境搭好了,怎么用?两个入口:命令行和Web UI。我平时开发用命令行多,排查问题看Web UI多。

常用命令行操作

命令 作用
./bin/flink run 提交任务
./bin/flink list 查看运行中的任务
./bin/flink cancel <jobId> 取消任务
./bin/flink savepoint <jobId> 触发Savepoint(容灾用)

Web UI关键面板

  • Overview:集群概览,看JobManager和TaskManager是否健康
  • Job Manager:任务列表,点进去能看到DAG图
  • Task Managers:每个TaskManager的资源使用情况
  • Submit Job:上传Jar包提交任务

一个实用技巧:在Web UI的Job详情页,点开"Metrics"标签,能看到反压(Backpressure)情况。如果某个算子显示红色高反压,说明下游处理速度跟不上上游——这是调优的重要信号。

2.5 部署方式对比总结

部署模式 资源管理 隔离性 运维复杂度 推荐场景
Local 本机 无 低 开发调试
Standalone Flink自身 中 中 小集群POC
YARN Session YARN 低 低 短任务、临时查询
YARN Per-Job YARN 高 中 生产环境、数据同步