Flink本地运行报错:No ExecutorFactory found to execute the application

Flink本地运行报错:No ExecutorFactory found to execute the application

一、错误现象

在本地调试Flink程序时,执行StreamExecutionEnvironment.execute()方法时出现以下异常:

Exception in thread "main" java.lang.IllegalStateException: No ExecutorFactory found to execute the application.
    at org.apache.flink.core.execution.DefaultExecutorServiceLoader.getExecutorFactory(DefaultExecutorServiceLoader.java:88)
    at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.executeAsync(StreamExecutionEnvironment.java:2148)
    at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.execute(StreamExecutionEnvironment.java:2046)
    at org.apache.flink.streaming.api.environment.LocalStreamEnvironment.execute(LocalStreamEnvironment.java:68)
    at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.execute(StreamExecutionEnvironment.java:2014)

二、错误原因分析

该错误是由于Flink 1.11及以上版本移除了flink-streaming-javaflink-clients的隐式依赖,而本地调试时需要flink-clients模块提供的执行器工厂(ExecutorFactory)来启动任务。若未显式添加该依赖,Flink将无法找到执行器工厂,导致程序报错。


三、解决方案

核心解决方法:在项目pom.xml中添加flink-clients依赖。具体步骤如下:

  1. 修改pom.xml文件
    标签内添加以下内容(注意替换{flink.version}为实际Flink版本,{scala.binary.version}为项目使用的Scala版本):

    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients_2.12</artifactId> 
        <version>{flink.version}</version>
        <scope>provided</scope> 
    </dependency>
    
  2. 验证依赖是否生效
    重新构建项目(mvn clean install),确保依赖已正确引入。


四、代码示例

以下是一个简单的Flink本地调试示例,展示如何正确配置依赖:

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.api.common.functions.MapFunction;

public class LocalFlinkDemo {
    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        
        // 示例:读取文本文件并转换数据
        DataStream<String> text = env.readTextFile("input.txt");
        DataStream<Integer> counts = text
            .map(new MapFunction<String, Integer>() {
                @Override
                public Integer map(String value) {
                    return value.length();
                }
            });
        
        counts.print();
        
        // 执行任务
        env.execute("Local Flink Demo");
    }
}

五、注意事项

  1. 版本兼容性

    • 若项目使用Scala,需确保flink-clientsartifactId与Scala版本匹配(如Scala 2.12对应flink-clients_2.12)。
    • 检查Flink版本是否为1.11及以上,此问题仅在此版本后出现。
  2. 依赖冲突

    • 若项目中已存在其他Flink模块(如flink-coreflink-streaming-java),需确保flink-clients版本与它们一致,避免版本冲突。
  3. 生产环境配置

    • 在生产环境中,建议将flink-clients设置为provided,由集群环境提供该依赖。

六、总结

通过显式添加flink-clients依赖,可解决Flink本地调试时的ExecutorFactory缺失问题。此修改简单高效,适用于所有Flink 1.11及以上版本的本地开发场景。若问题仍未解决,建议检查IDE的Maven依赖导入状态或尝试重启IDE。

大数据

hive leg函数

2025-3-3 10:15:48

大数据

java企业级项目实战(java企业级项目案例)

2025-3-3 10:15:51

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧