无法在 EKS docker 镜像上的 EMR 上启动 Flink SQL 客户端

问题描述 投票:0回答:1

我正在 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。

您能告诉我如何修复它吗?

谢谢!

java docker apache-flink amazon-emr flink-sql
1个回答
0
投票

我进一步检查了

sql-client.sh
,它写入了
/mnt/tmp
而不是
/tmp
。我添加了以下内容,效果很好。

RUN mkdir -p /mnt/tmp && chmod +x /mnt/tmp

它不仅会影响 SQL 客户端,还会影响应用

getAvailablePort()
的其他地方。因此需要更新 Docker 镜像。

© www.soinside.com 2019 - 2024. All rights reserved.