建议沿用 Flink on YARN:在 master 安装、提交任务,由 YARN 在两个 worker 上启动计算进程。这样可以与 Spark 共用现有资源管理方式。
选择 Flink 1.20.3 + Java 11 。下面使用官方的 Scala 2.12 二进制包,不需要单独安装 Scala 。官方下载包
| 节点 | 作用 |
|---|---|
| master | 安装 Flink、提交任务 |
| worker1、worker2 | YARN 分配资源,运行 Flink 服务和任务 |
JobManager 的实际运行位置由 YARN 安排,不一定在 master。以下操作都在 master 上,用普通用户 dyl 执行。
1. 确认 Hadoop 正常
bash
hdfs dfsadmin -report
yarn node -list
应看到两个存储节点和两个 RUNNING 计算节点。尚未启动时:
bash
start-dfs.sh
start-yarn.sh
先退出正在运行的 spark-shell,停止暂时不用的 HBase、Hive 等服务,给 Flink 留出内存。本次基础实验无需 ZooKeeper。
2. 下载并校验
bash
mkdir -p ~/software
cd ~/software
wget -c https://downloads.apache.org/flink/flink-1.20.3/flink-1.20.3-bin-scala_2.12.tgz
wget https://downloads.apache.org/flink/flink-1.20.3/flink-1.20.3-bin-scala_2.12.tgz.sha512
查看校验值:
bash
sha512sum flink-1.20.3-bin-scala_2.12.tgz
cat flink-1.20.3-bin-scala_2.12.tgz.sha512
两个 SHA-512 值一致后继续。
3. 解压安装
以下假设 /home/dyl/flink 尚未安装其他版本:
bash
mkdir -p /home/dyl/flink
tar -xzf flink-1.20.3-bin-scala_2.12.tgz \
-C /home/dyl/flink --strip-components=1
检查:
bash
ls /home/dyl/flink
应包含 bin、conf、lib、examples 等目录。
4. 配置环境变量
打开:
bash
nano ~/.bashrc
在末尾添加:
bash
export FLINK_HOME=/home/dyl/flink
export PATH=$FLINK_HOME/bin:$PATH
export HADOOP_CONF_DIR=/home/dyl/hadoop-3.4.3/etc/hadoop
export HADOOP_CLASSPATH=$(/home/dyl/hadoop-3.4.3/bin/hadoop classpath)
保存后执行:
bash
source ~/.bashrc
确认本次会话使用 Java 11:
bash
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
检查:
bash
java -version
flink --version
echo "$HADOOP_CLASSPATH"
应分别显示 Java 11、Flink 1.20.3,以及非空的 Hadoop 类库路径。HADOOP_CLASSPATH 用于让 Flink 加载 Hadoop 客户端依赖。官方 YARN 配置说明
5. 创建 HDFS 实验目录
bash
hdfs dfs -mkdir -p /user/dyl/flink-input
hdfs dfs -mkdir -p /user/dyl/flink-results
准备输入数据:
bash
printf 'hello flink\nhello hadoop\n' > /home/dyl/flink-words.txt
hdfs dfs -put /home/dyl/flink-words.txt /user/dyl/flink-input/
检查:
bash
hdfs dfs -cat /user/dyl/flink-input/flink-words.txt
6. 启动 Flink YARN Session
执行:
bash
/home/dyl/flink/bin/yarn-session.sh \
-jm 1024 \
-tm 1536 \
-s 1 \
-Dparallelism.default=2 \
-Denv.java.home=/usr/lib/jvm/java-11-openjdk-amd64 \
-d
参数含义:
| 参数 | 含义 |
|---|---|
-jm 1024 |
JobManager 进程内存 1024 MB |
-tm 1536 |
每个 TaskManager 进程内存 1536 MB |
-s 1 |
每个 TaskManager 提供一个任务槽 |
parallelism.default=2 |
默认并行度为 2 |
-d |
提交后退出客户端,集群继续运行 |
这套设置用于你目前的内存配置。TaskManager 会根据任务资源需求申请,刚启动 Session 时不一定立即出现两个。
启动成功后,记录输出的应用编号,例如:
text
application_XXXXXXXXXXXXX_0001
后续命令中的 <应用编号>,都替换成你实际看到的编号,不要保留尖括号。
7. 查看管理页面
打开:
找到 Flink 应用,状态应为 RUNNING。点击该应用的 Tracking UI / ApplicationMaster 链接,进入 Flink 页面。
不要直接假设页面地址是 master:8081,YARN 部署时应使用输出的地址或 YARN 提供的链接。
8. 提交 WordCount 测试
在 master 执行:
bash
flink run \
-t yarn-session \
-Dyarn.application.id=<应用编号> \
-p 2 \
/home/dyl/flink/examples/streaming/WordCount.jar \
--execution-mode BATCH \
--input hdfs://master:9000/user/dyl/flink-input/flink-words.txt \
--output hdfs://master:9000/user/dyl/flink-results/wordcount-1
这是使用有限输入文件的批处理测试。首次运行会申请资源,可能需要等待。
成功后查看结果:
bash
hdfs dfs -ls -R /user/dyl/flink-results/wordcount-1
读取输出文件:
bash
hdfs dfs -cat '/user/dyl/flink-results/wordcount-1/*'
应看到包含以下计数的结果,顺序和格式可能略有不同:
text
hello 2
flink 1
hadoop 1
同时在 Flink 页面检查:
- 作业状态为 FINISHED。
- TaskManagers 页面能看到计算进程。
- TaskManager 地址可以用来确认任务实际运行在哪台机器。
重新测试时,把输出目录换成 wordcount-2,避免覆盖已有结果。
9. 使用完后释放资源
Session 模式下,作业完成后 Flink 集群仍会继续占用资源。实验结束后,在 master 执行:
bash
yarn application -kill <应用编号>
这会停止该 Flink Session 中的所有任务并释放资源。下次使用时,重新运行第六步,取得新的应用编号即可。
这种方式只需在 master 安装 Flink,不需要向 worker 手动分发安装目录,也不需要执行 start-cluster.sh。 如果应用一直停在 ACCEPTED,先检查是否被 Spark 或其他 YARN 应用占满资源:
bash
yarn application -list
遇到失败,保留应用编号并查看日志:
bash
yarn logs -applicationId <应用编号>
如果提示日志聚合未开启,则从 YARN 应用页面进入对应容器日志查看报错。