flink集群运行checkpoint报错: org.apache.commons.cl i.CommandLine.hasOption(Lorg/apache/commons/cli/ Option;)Z
这个错误通常是由于 Apache Commons CLI 依赖版本冲突引起的。以下是详细的解决步骤:
问题原因
- 版本冲突 :Flink 运行时加载了不兼容的
commons-cli依赖版本 - 依赖污染 :用户应用程序或某个依赖引入了冲突的
commons-cli版本 - 类加载问题 :不同版本的
commons-cli被多个类加载器加载
解决方法
1. 检查 Flink 内置依赖
在 Flink 的 lib 目录下检查是否存在多个 commons-cli 版本:
bash
ls $FLINK_HOME/lib | grep commons-cli
如果存在多个版本(如 commons-cli-1.3.jar 和 commons-cli-1.4.jar),删除较旧版本,仅保留一个与 Flink 兼容的版本(推荐使用 Flink 官方发行版默认携带的版本)。
2. 排除用户依赖冲突
若应用程序通过 Maven 引入冲突依赖:
XML
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java</artifactId>
<version>${flink.version}</version>
<exclusions>
<exclusion>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
</exclusion>
</exclusions>
</dependency>
3. 强制统一版本(Maven)
在 pom.xml 中显式指定版本:
XML
<properties>
<commons-cli.version>1.4.0</commons-cli.version>
</properties>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>${commons-cli.version}</version>
</dependency>
4. Hadoop 环境特殊处理
若使用 Flink on YARN,在 flink-conf.yaml 添加:
yaml
classloader.parent-first-patterns.additional: org.apache.commons.cli
5. 验证修复
重新启动集群后检查类加载:
java
System.out.println(CommandLine.class.getProtectionDomain().getCodeSource().getLocation());
临时解决方案
在作业提交命令中添加显式排除:
bash
flink run -c com.example.MainJob \
-ytj $FLINK_HOME/lib/commons-cli-1.4.0.jar \
your-job.jar
注意:建议优先采用方法1或2,彻底解决依赖冲突问题。若在云环境(如 EMR)遇到此问题,需联系平台方确认兼容版本。