一、问题说明

默认端口冲突

Spark 和 Flink 的默认端口可能会发生冲突:

服务默认端口用途
Spark Master UI8080Spark 集群管理界面
Spark Application UI4040Spark 应用运行界面
Spark/Flink 冲突8081Web UI 端口冲突
Flink Dashboard8081 (默认)Flink 管理界面

如果同时运行 Spark 和 Flink,会导致端口冲突,其中一个服务无法启动或访问错误的界面。


二、解决方案:修改 Flink 端口

方案概览

将 Flink 的 Web UI 端口从 8081 改为 8082,避免与 Spark 冲突。

修改后的端口分配:

服务端口用途
Spark Master UI8080Spark 集群管理
Spark Application UI4040Spark 任务运行
Spark History Server8081Spark 历史任务
Flink Dashboard8082Flink 管理界面

三、修改步骤

步骤 1:停止 Flink 集群

如果 Flink 正在运行,先停止:

stop-cluster.sh

步骤 2:打开配置文件

nano $FLINK_HOME/conf/flink-conf.yaml

或者使用完整路径:

nano /opt/bigdata/flink/conf/flink-conf.yaml

步骤 3:修改端口配置

在配置文件中找到 rest.port 这一行(如果没有则添加),修改为:

# Web UI 端口(改为 8082,避免与 Spark 8081 冲突)
rest.port: 8082

完整的推荐配置:

#==============================================================================
# Common
#==============================================================================

# JobManager 的主机名或 IP 地址
jobmanager.rpc.address: localhost

# JobManager 的 RPC 端口
jobmanager.rpc.port: 6123

# JobManager Web UI 的端口(修改此项避免冲突)
rest.port: 8082

#==============================================================================
# JobManager
#==============================================================================

# JobManager 的 JVM 堆内存大小
jobmanager.memory.process.size: 1600m

#==============================================================================
# TaskManager
#==============================================================================

# TaskManager 的 JVM 堆内存大小
taskmanager.memory.process.size: 1728m

# 每个 TaskManager 提供的任务槽数量
taskmanager.numberOfTaskSlots: 4

#==============================================================================
# Parallelism
#==============================================================================

# 默认并行度
parallelism.default: 1

步骤 4:保存并退出

  • Ctrl + X
  • Y 确认保存
  • Enter 确认文件名

步骤 5:重启 Flink 集群

start-cluster.sh

步骤 6:验证配置

1. 检查进程是否启动:

jps

应该看到:

  • StandaloneSessionClusterEntrypoint
  • TaskManagerRunner

2. 检查端口占用:

lsof -i :8082

应该看到类似输出:

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    12345  user  123u  IPv6 0x...      0t0  TCP *:8082 (LISTEN)

3. 查看日志确认:

tail -f $FLINK_HOME/log/flink-*-standalonesession-*.log

应该看到类似日志:

INFO  [] - Rest endpoint listening at localhost:8082
INFO  [] - http://localhost:8082 was granted leadership...

步骤 7:访问 Web UI

打开浏览器访问:http://localhost:8082

你应该看到 Flink Dashboard,显示:

  • Overview(概览)
  • Running Jobs(运行中的任务)
  • Completed Jobs(已完成的任务)
  • Task Managers(任务管理器)
  • Job Manager(作业管理器)

四、其他端口配置(可选)

如果需要修改更多端口

flink-conf.yaml 中还可以配置:

# JobManager 的 RPC 端口(默认 6123)
jobmanager.rpc.port: 6123

# Web UI 端口(已修改为 8082)
rest.port: 8082

# TaskManager 的数据交换端口范围
taskmanager.rpc.port: 6122

# Blob Server 端口(用于传输大文件)
blob.server.port: 6124

# Query Server 端口(用于状态查询)
queryable-state.proxy.ports: 6125

修改 Spark 端口(另一种解决方案)

如果你更希望保持 Flink 使用默认端口 8081,可以修改 Spark 的端口:

修改 Spark Master UI 端口:

# 编辑 spark-env.sh
nano $SPARK_HOME/conf/spark-env.sh

# 添加或修改
export SPARK_MASTER_WEBUI_PORT=8083

修改 Spark Application UI 端口:

在启动 Spark 应用时添加参数:

spark-submit --conf spark.ui.port=4041 your-app.jar

五、端口冲突检测

检查端口是否被占用

# 检查 8081 端口
lsof -i :8081

# 检查 8082 端口
lsof -i :8082

# 检查多个端口
lsof -i :8080,:8081,:8082

查看所有监听端口

# macOS
netstat -an | grep LISTEN

# 或使用 lsof
lsof -nP -iTCP -sTCP:LISTEN

杀掉占用端口的进程

# 找到进程 PID
lsof -i :8081

# 杀掉进程
kill -9 <PID>

六、配置文件详解

flink-conf.yaml 结构

#==============================================================================
# 常规配置
#==============================================================================
jobmanager.rpc.address: localhost          # JobManager 地址
jobmanager.rpc.port: 6123                  # RPC 通信端口
rest.port: 8082                            # Web UI 端口(重要)

#==============================================================================
# 高可用配置(可选)
#==============================================================================
# high-availability: zookeeper
# high-availability.storageDir: hdfs:///flink/ha/
# high-availability.zookeeper.quorum: localhost:2181

#==============================================================================
# 内存配置
#==============================================================================
jobmanager.memory.process.size: 1600m      # JobManager 内存
taskmanager.memory.process.size: 1728m     # TaskManager 内存
taskmanager.numberOfTaskSlots: 4           # 任务槽数量

#==============================================================================
# 并行度配置
#==============================================================================
parallelism.default: 1                     # 默认并行度

#==============================================================================
# 检查点配置(可选)
#==============================================================================
# state.backend: filesystem
# state.checkpoints.dir: file:///tmp/flink-checkpoints
# state.savepoints.dir: file:///tmp/flink-savepoints

#==============================================================================
# 历史服务器配置(可选)
#==============================================================================
# jobmanager.archive.fs.dir: file:///tmp/flink-completed-jobs
# historyserver.web.address: localhost
# historyserver.web.port: 8083

七、验证配置生效

完整验证流程

# 1. 停止所有服务
stop-cluster.sh

# 2. 清理日志(可选)
rm -rf $FLINK_HOME/log/*

# 3. 启动集群
start-cluster.sh

# 4. 检查进程
jps | grep -E "Standalone|TaskManager"

# 5. 检查端口
lsof -i :8082

# 6. 查看日志
tail -f $FLINK_HOME/log/flink-*-standalonesession-*.log

# 7. 测试 Web UI
curl http://localhost:8082

预期输出

jps 命令输出:

12345 StandaloneSessionClusterEntrypoint
12346 TaskManagerRunner

lsof 命令输出:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    12345 user  123u  IPv6 xxxxxx      0t0  TCP *:8082 (LISTEN)

curl 命令输出:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Flink Dashboard</title>
    ...

八、多环境端口规划建议

开发环境端口规划

服务端口说明
Spark Master8080Spark 集群主节点
Spark Worker8081Spark 工作节点
Spark Application4040Spark 应用界面
Flink8082Flink Dashboard
Hadoop NameNode9870HDFS 管理界面
Hadoop ResourceManager8088YARN 资源管理
Kafka9092Kafka Broker
ZooKeeper2181协调服务

生产环境端口规划

建议使用防火墙规则限制端口访问,只对内网开放管理端口。


九、常见问题

Q1: 修改后仍然无法访问 8082

排查步骤:

# 1. 确认配置文件已保存
cat $FLINK_HOME/conf/flink-conf.yaml | grep rest.port

# 2. 完全重启集群
stop-cluster.sh
start-cluster.sh

# 3. 检查日志错误
tail -50 $FLINK_HOME/log/flink-*-standalonesession-*.log

# 4. 检查防火墙
# macOS 通常不需要配置防火墙

Q2: 端口修改后提交任务失败

原因: 客户端仍使用旧端口

解决: 在提交任务时指定新端口

flink run -m localhost:8082 your-job.jar

或在代码中指定:

val env = StreamExecutionEnvironment
  .createRemoteEnvironment("localhost", 8082, "your-job.jar")

Q3: 想恢复默认端口 8081

步骤:

# 1. 编辑配置文件
nano $FLINK_HOME/conf/flink-conf.yaml

# 2. 将 rest.port 改回 8081 或删除该行
rest.port: 8081

# 3. 重启集群
stop-cluster.sh
start-cluster.sh

十、总结

关键要点

Flink 默认端口 8081 可能与 Spark 冲突
修改 flink-conf.yaml 中的 rest.port 为 8082
修改后需要重启 Flink 集群才能生效
使用 lsof 命令验证端口配置成功
访问 http://localhost:8082 查看 Flink Dashboard

配置文件位置

$FLINK_HOME/conf/flink-conf.yaml
或
/opt/bigdata/flink/conf/flink-conf.yaml

验证命令

# 查看配置
cat $FLINK_HOME/conf/flink-conf.yaml | grep rest.port

# 检查端口
lsof -i :8082

# 测试访问
curl http://localhost:8082

现在你可以同时运行 Spark 和 Flink,互不干扰!🎉

更多推荐