记一次flink本地模式启动失败问题

1.现象:xsink任务一直启动中,偶尔能启动成功,启动失败,发现日志有如下错误:
Exception in thread “main” java.io.IOException: Unable to open BLOB Server in specified port range: 0
at org.apache.flink.runtime.blob.BlobServer.(BlobServer.java:199)
at org.apache.flink.runtime.minicluster.MiniCluster.start(MiniCluster.java:319)
at org.apache.flink.client.program.PerJobMiniClusterFactory.submitJob(PerJobMiniClusterFactory.java:87)
at org.apache.flink.client.deployment.executors.LocalExecutor.execute(LocalExecutor.java:81)
at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.executeAsync(StreamExecutionEnvironment.java:1812)
at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.execute(StreamExecutionEnvironment.java:1713)
at org.apache.flink.streaming.api.environment.LocalStreamEnvironment.execute(LocalStreamEnvironment.java:74)
at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.execute(StreamExecutionEnvironment.java:1699)
2.代码排查过程:
通过日志,跟踪代码,发现flink的本地模式在启动时,需要初始化一个ServerSocket,绑定一个端口。而这个端口默认是0,而Socket在绑定端口0时,会由系统根据配置范围,去选一个可用端口,现在就是在选可用端口时发现没有可用端口,导致任务启动失败。
在这里插入图片描述

3.端口占用情况排查
确认服务器系统随机选择端口的范围:
cat /proc/sys/net/ipv4/ip_local_port_range
在这里插入图片描述
共有32767个
查看端口在LISTEN状态的命令:netstat -tulnp >./1.txt
使用命令:netstat -anpt >./1.txt,查看端口使用情况,发现端口包括TIME_WAIT状态的总共有32745,端口严重不足。相关计算代码如下:

public class FileTest {
    
    

  public static void main(String[] args) throws IOException {
    
    
    File file = new File("C:\\Users\\Desktop\\222.txt");
    FileInputStream stream = new FileInputStream(file);
    BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
    String str = null;
    Set<String> ports = new HashSet<>();
    while ((str = reader.readLine()) != null) {
    
    
      Pattern pattern = Pattern.compile(".*([0-9]+\\.){3}([0-9]+)*:([1-9][0-9]*).*([0-9]+\\.){3}([0-9]+)*:([1-9][0-9]*)?.*");
      Matcher matcher = pattern.matcher(str);
      if (matcher.matches()) {
    
    
        String port = matcher.group(3);
        if (Integer.valueOf(port) >= 32768) {
    
    
          ports.add(port);
        }
        port = matcher.group(6);
        if (port != null) {
    
    
          if (Integer.valueOf(port) >= 32768) {
    
    
            ports.add(port);
          }
        }
      }
    }
    List<String> list = new ArrayList<>();
    list.addAll(ports);
    Collections.sort(list);
    StringBuilder sb = new StringBuilder();
    for (String p : list) {
    
    
      sb.append(p).append(",");
    }
    System.out.println(sb.toString());
    System.out.println("已经使用端口总数:" + ports.size());
  }
}

在这里插入图片描述

4.解决方案:
通过配置xsink的端口段,让flink在可用端口段内获取端口,配置方案如下
在这里插入图片描述

通过改上述配置,任务都能启动成功,但是也有问题,如果任务启动过多,端口不够,则扩展性受限,所以经过学习,发现可以通过设置服务器TIME_WAIT端口回收时间,来加快端口回收解决:
echo “1” > ./tcp_tw_recycle,加了该配置,发现端口使用数下降很多,编程3497,任务正常启动,问题完美解决。

猜你喜欢

转载自blog.csdn.net/myhappy_huang/article/details/115348793
今日推荐