Flink CDC 里这个是冲突了吗?依赖包。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用 Flink CDC 时,依赖包冲突是一个常见问题,尤其是在引入多个连接器或第三方库时。根据知识库中的信息,以下是关于依赖包冲突的详细分析和解决方案:
依赖包冲突可能表现为以下几种情况: - 明显的报错:例如 java.lang.AbstractMethodError
、java.lang.ClassNotFoundException
、java.lang.NoSuchMethodError
等。 - 不符合预期的现象: - 日志不输出或 log4j 配置不生效(通常是由于依赖中携带了 log4j 相关配置)。 - RPC 调用异常(如 Akka RPC 调用失败,可能导致资源分配失败或状态不一致)。
依赖包冲突的主要原因包括: - 作业 JAR 包中包含了不必要的依赖:例如基本配置、Flink、Hadoop 或 log4j 的依赖被重复引入。 - Connector 所需的依赖未正确打入 JAR 包:导致运行时缺少必要的类或方法。 - 不同版本的依赖冲突:例如 log4j 或其他第三方库的版本不一致。
为了确认是否存在依赖冲突,可以按照以下步骤进行排查: 1. 检查 pom.xml
文件: - 查看是否引入了不必要的依赖。 - 确保 Connector 所需的依赖已正确添加。 2. 查看 JAR 包内容: - 使用命令 jar tf foo.jar
检查 JAR 包中是否包含引发冲突的内容。 3. 分析依赖树: - 使用命令 mvn dependency:tree
查看项目的依赖关系,判断是否存在冲突的依赖。
针对依赖冲突问题,可以采取以下措施:
将基本配置的依赖范围设置为 provided
,以避免将其打包到作业 JAR 中。例如:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
说明:provided
表示这些依赖由运行环境提供,不会被打入作业 JAR 包中。
对于需要的 Connector,确保其依赖范围为 compile
(默认范围),以便将其打包到作业 JAR 中。例如:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
如果某些依赖是通过其他库间接引入的,可以通过 exclusions
将其排除。例如:
<dependency>
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
</exclusion>
</exclusions>
</dependency>
如果必须使用不同版本的 log4j,可以通过 maven-shade-plugin
对 log4j 相关类进行重定位(relocation)。例如:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>org.apache.log4j</pattern>
<shadedPattern>com.shaded.log4j</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
flink-sql-connector-xx
是 FAT JAR,包含所有依赖,适合 SQL 作业使用。flink-connector-xx
只包含连接器代码,需要手动管理依赖,适合 DataStream 作业使用。group id
从 com.alibaba.ververica
改为 com.ververica
,请确保在 Maven 仓库中查找正确的路径。通过上述方法,您可以有效解决 Flink CDC 中的依赖包冲突问题。如果问题仍然存在,建议进一步检查具体的错误日志,并结合 mvn dependency:tree
输出的依赖树进行深入分析。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。