Flink SQL执行SQL错误排查
通过命令${FLINK_HOME}/bin/sql-client.sh embedded -i ${FLINK_HOME}/conf/sql_client_init.sql -s yarn-session
启动FLINK SQL Client后,执行一个简单的sql出错了,报错如下:
Flink SQL> select 1;Caused by: org.apache.flink.shaded.netty4.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:8081
Caused by: java.net.ConnectException: Connection refusedat sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[?:1.8.0_191]at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) ~[?:1.8.0_191]at org.apache.flink.shaded.netty4.io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330) ~[flink-dist_2.12-1.13.6.jar:1.13.6]at org.apache.flink.shaded.netty4.io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334) ~[flink-dist_2.12-1.13.6.jar:1.13.6]at org.apache.flink.shaded.netty4.io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:702) ~[flink-dist_2.12-1.13.6.jar:1.13.6]at org.apache.flink.shaded.netty4.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) ~[flink-dist_2.12-1.13.6.jar:1.13.6]at org.apache.flink.shaded.netty4.io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) ~[flink-dist_2.12-1.13.6.jar:1.13.6]at org.apache.flink.shaded.netty4.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[flink-dist_2.12-1.13.6.jar:1.13.6]at org.apache.flink.shaded.netty4.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[flink-dist_2.12-1.13.6.jar:1.13.6]at org.apache.flink.shaded.netty4.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[flink-dist_2.12-1.13.6.jar:1.13.6]at java.lang.Thread.run(Thread.java:748) ~[?:1.8.0_191]
从报错信息来看,Flink SQL执行select 1
时,尝试连接 localhost:8081(Flink Web UI默认端口)失败,核心原因是Flink集群(或Session)未启动,或客户端配置的连接地址与集群实际地址不匹配。
错误原因拆解:
Flink SQL执行查询时,需要与Flink集群的 JobManager 通信(默认通过8081端口交互)。报错Connection refused
说明:
- Flink集群未启动:本地/目标机器上没有运行Flink JobManager进程,8081端口未被监听。
- 客户端连接地址配置错误:Flink客户端默认连接
localhost:8081
,但实际Flink集群部署在其他机器(如之前的hadoop103
),导致连接本地失败。 - 端口被占用或防火墙拦截:8081端口被其他进程占用,或防火墙禁止访问该端口(可能性较低,因
select 1
是轻量查询,优先排查前两点)。
解决步骤:
1. 确认Flink集群状态(优先检查)
首先判断Flink集群是否已启动,以及8081端口是否被监听:
# 1. 检查本地Flink进程(JobManager/TaskManager)
jps # 正常启动会显示 "StandaloneSessionClusterEntrypoint"(JobManager)和 "TaskManagerRunner"(TaskManager)# 2. 检查8081端口是否被监听
netstat -tuln | grep 8081 # Linux/Mac
# 或 Windows 命令:netstat -ano | findstr "8081"# 若以上命令无输出,说明Flink集群未启动,需启动集群
2. 启动Flink集群(根据部署模式选择)
根据你之前使用的YARN集群模式,选择对应的启动方式:
方式1:启动Flink YARN Session Cluster(会话模式,适合多作业共享)
# 启动YARN会话集群(指定资源,如2个TaskManager,每个4GB内存)
$FLINK_HOME/bin/yarn-session.sh -n 2 -tm 4096 -s 2
# 启动成功后,会显示 JobManager 的 Web UI 地址(如 http://hadoop104:39911)
# 同时记录下 YARN 应用ID(如 application_xxxxxx_0001)
或以后台方式启动yarn-session,方便我们对资源进行管理:
$FLINK_HOME/bin/yarn-session.sh -d
方式2:直接提交Per-Job Cluster(单作业模式,无需预先启动会话)
若不想启动长期会话,可在执行SQL时直接指定YARN集群模式,自动创建单作业集群:
# 启动Flink SQL客户端,并指定连接YARN集群
$FLINK_HOME/bin/sql-client.sh embedded -m yarn-cluster
# 进入客户端后,直接执行 select 1;
3. 修正Flink客户端连接地址(若集群不在本地)
若Flink集群部署在远程机器(如hadoop103
),而非本地localhost
,需强制指定客户端连接的JobManager地址:
# 方式1:启动SQL客户端时,直接指定远程JobManager地址(需替换为实际地址和端口)
$FLINK_HOME/bin/sql-client.sh embedded -m hadoop103:8081# 方式2:若使用YARN Session,启动时指定YARN应用ID(确保会话已启动)
$FLINK_HOME/bin/sql-client.sh embedded -m yarn-cluster -yid application_xxxxxx_0001
注意:YARN Session的JobManager端口不是固定8081(YARN会动态分配端口),需从YARN Session启动日志中获取实际端口(如之前的
hadoop104:39911
)。
4. 验证连接是否正常
启动集群后,先通过Web UI确认集群可用:
- 访问JobManager Web UI地址(如
http://hadoop104:39911
),若能打开页面,说明集群正常。 - 再执行
select 1;
,此时客户端能正常连接集群,查询会成功执行。
常见问题排查:
- YARN资源不足导致启动失败:若
yarn-session.sh
启动失败,查看YARN日志(yarn logs -applicationId 应用ID
),确认是否因内存/CPU不足导致,可减少-tm
(TaskManager内存)或-n
(TaskManager数量)。 - 端口被占用:若
netstat
显示8081已被占用,修改Flink配置flink-conf.yaml
中的rest.port
为其他空闲端口(如8082),重启集群。
总结:
该错误的核心是“Flink客户端找不到可连接的JobManager”,通过启动Flink集群(YARN Session或Per-Job) 并确保客户端连接地址正确,即可解决。优先选择方式2(-m yarn-cluster
),无需手动管理端口,适配YARN动态分配的特性。