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出错了,报错如下:

bash 复制代码
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 refused
	at 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说明:

  1. Flink集群未启动:本地/目标机器上没有运行Flink JobManager进程,8081端口未被监听。
  2. 客户端连接地址配置错误 :Flink客户端默认连接localhost:8081,但实际Flink集群部署在其他机器(如之前的hadoop103),导致连接本地失败。
  3. 端口被占用或防火墙拦截 :8081端口被其他进程占用,或防火墙禁止访问该端口(可能性较低,因select 1是轻量查询,优先排查前两点)。

解决步骤:

1. 确认Flink集群状态(优先检查)

首先判断Flink集群是否已启动,以及8081端口是否被监听:

bash 复制代码
# 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集群模式,选择对应的启动方式:

bash 复制代码
# 启动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集群模式,自动创建单作业集群:

bash 复制代码
# 启动Flink SQL客户端,并指定连接YARN集群
$FLINK_HOME/bin/sql-client.sh embedded -m yarn-cluster
# 进入客户端后,直接执行 select 1;
3. 修正Flink客户端连接地址(若集群不在本地)

若Flink集群部署在远程机器(如hadoop103),而非本地localhost,需强制指定客户端连接的JobManager地址:

bash 复制代码
# 方式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动态分配的特性。