我正在 EKS 上使用 EMR 的 Flink docker 镜像 - public.ecr.aws/emr-on-eks/flink/emr-6.15.0-flink:latest。当我尝试启动 SQL 客户端时,我看到以下错误。 (我使用flink官方镜像时没有看到这个错误。)
06:33:00.495 [main] ERROR org.apache.flink.table.client.SqlClient - SQL Client must stop. Unexpected exception. This is a bug. Please consider filing an issue.
java.lang.RuntimeException: Could not find a free permitted port on the machine.
at org.apache.flink.util.NetUtils.getAvailablePort(NetUtils.java:177) ~[flink-dist-1.17.1-amzn-1.jar:1.17.1-amzn-1]
at org.apache.flink.table.client.SqlClient$EmbeddedGateway.create(SqlClient.java:257) ~[flink-sql-client-1.17.1-amzn-1.jar:1.17.1-amzn-1]
at org.apache.flink.table.client.SqlClient.start(SqlClient.java:108) ~[flink-sql-client-1.17.1-amzn-1.jar:1.17.1-amzn-1]
at org.apache.flink.table.client.SqlClient.startClient(SqlClient.java:228) [flink-sql-client-1.17.1-amzn-1.jar:1.17.1-amzn-1]
at org.apache.flink.table.client.SqlClient.main(SqlClient.java:179) [flink-sql-client-1.17.1-amzn-1.jar:1.17.1-amzn-1]
Exception in thread "main" org.apache.flink.table.client.SqlClientException: Unexpected exception. This is a bug. Please consider filing an issue.
at org.apache.flink.table.client.SqlClient.startClient(SqlClient.java:242)
at org.apache.flink.table.client.SqlClient.main(SqlClient.java:179)
Caused by: java.lang.RuntimeException: Could not find a free permitted port on the machine.
at org.apache.flink.util.NetUtils.getAvailablePort(NetUtils.java:177)
at org.apache.flink.table.client.SqlClient$EmbeddedGateway.create(SqlClient.java:257)
at org.apache.flink.table.client.SqlClient.start(SqlClient.java:108)
at org.apache.flink.table.client.SqlClient.startClient(SqlClient.java:228)
... 1 more
它看起来是由
NetUtils类 (NetUtils.java) 的
getAvailablePort()
引起的。
public static Port getAvailablePort() {
for (int i = 0; i < 50; i++) {
try (ServerSocket serverSocket = new ServerSocket(0)) {
int port = serverSocket.getLocalPort();
if (port != 0) {
FileLock fileLock = new FileLock(NetUtils.class.getName() + port);
if (fileLock.tryLock()) {
return new Port(port, fileLock);
} else {
fileLock.unlockAndDestroy();
}
}
} catch (IOException ignored) {
}
}
throw new RuntimeException("Could not find a free permitted port on the machine.");
}
我看到相关的 Jira 票证(https://issues.apache.org/jira/browse/FLINK-28613),它似乎可以通过更改文件权限来解决。然而它对我不起作用。基本上我不知道为什么它无法对
/tmp
文件夹执行 FileLock。
您能告诉我如何修复它吗?
谢谢!
我进一步检查了
sql-client.sh
,它写入了/mnt/tmp
而不是/tmp
。我添加了以下内容,效果很好。
RUN mkdir -p /mnt/tmp && chmod +x /mnt/tmp
它不仅会影响 SQL 客户端,还会影响应用
getAvailablePort()
的其他地方。因此需要更新 Docker 镜像。