Flink1.12.2集成Hive提交Yarn集群类缺失与依赖冲突问题求助
根因说明
ClassNotFoundException: org.apache.hadoop.mapred.JobConf错误是因为Flink作业提交到YARN运行时,没有加载到集群侧的Hadoop依赖包,这类依赖属于集群提供的公共依赖,不需要打入用户作业jar包。- 手动引入
hadoop-mapreduce-client-core后出现的NoSuchMethodError: org.apache.commons.cli.Option.builder错误是版本冲突导致:Hadoop 3.1.1传递依赖的commons-cli版本为1.2,而Flink 1.12.2要求commons-cli版本≥1.3.1才支持Option.builder方法,低版本不存在对应API。
解决方案
方案一:通过环境变量加载集群Hadoop依赖(推荐)
不需要在项目pom中额外引入Hadoop相关依赖,仅需在提交作业前配置Hadoop环境变量即可:
- 在提交作业的节点执行以下命令,将集群Hadoop全量依赖加入Flink运行时类路径:
export HADOOP_CLASSPATH=`hadoop classpath`
- 确认使用的Flink 1.12.2安装包匹配集群Hadoop版本,若使用官方无Hadoop依赖的Flink安装包,需提前将对应Hadoop版本的shaded hadoop依赖放入Flink的
lib目录。 - 清理pom中手动添加的
hadoop-mapreduce-client-core依赖,避免传递依赖冲突。
方案二:pom内引入Hadoop依赖并排除冲突包
若业务场景必须在项目中显式引入Hadoop依赖,修改依赖配置排除低版本commons-cli:
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>${hadoop.version}</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入Flink要求的高版本commons-cli --> <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> <version>1.4</version> <scope>provided</scope> </dependency>
提交作业前仍需配置HADOOP_CLASSPATH环境变量,保证运行时可加载到集群侧的Hadoop类。
补充优化建议
- 所有Flink核心依赖、集群提供的Hadoop/Hive依赖都设置为
providedscope,打包时不要打入作业jar包,避免重复引入导致的类冲突。 - 如果仍有commons-cli冲突,可在maven-shade-plugin配置中添加重定向规则彻底隔离版本:
<relocation> <pattern>org.apache.commons.cli</pattern> <shadedPattern>shaded.org.apache.commons.cli</shadedPattern> </relocation>
内容的提问来源于stack exchange,提问作者xiangliang
相关产品推荐
相关产品推荐

