大佬,Flink CDC提交集群的会把依赖包都打在自己的jar包里吗?然后就报错

大佬,Flink CDC提交集群的会把依赖包都打在自己的jar包里吗?然后就报错image.png image.png

展开
收起
真的很搞笑 2023-05-02 08:03:50 97 分享 版权
阿里云 AI 助理回答

在使用 Flink CDC 提交集群时,是否会将依赖包打包到自己的 JAR 包中,以及是否会导致报错,取决于您选择的连接器类型和打包方式。以下是详细说明:


1. Flink CDC 连接器的两种类型

根据知识库中的描述,Flink CDC 连接器分为以下两种类型: - flink-sql-connector-xxx
- 这是一个 FAT JAR,包含了连接器的所有代码及其依赖的第三方库(通过 Shade 打包)。 - 适用于 SQL 作业,用户只需将该 JAR 放入 lib 目录即可直接使用。 - 优点:无需额外管理依赖。 - 缺点:如果多个 FAT JAR 中包含相同的依赖,可能会导致依赖冲突。

  • flink-connector-xxx
    • 仅包含连接器本身的代码,不包含其依赖的第三方库。
    • 适用于 DataStream 作业,用户需要自行管理依赖。
    • 优点:灵活性更高,可以避免重复引入依赖。
    • 缺点:需要手动解决依赖冲突问题。

因此,如果您使用的是 flink-sql-connector-xxx,所有依赖会被打包到一个 JAR 中;而使用 flink-connector-xxx 则不会。


2. 可能导致的报错原因

当依赖被打包到 JAR 中时,可能会引发以下问题:

(1) 依赖冲突

  • 如果您的作业中引入了多个 FAT JAR(如 flink-sql-connector-xxx),这些 JAR 可能会包含相同但版本不同的第三方依赖(例如 log4jjanino),从而导致类加载冲突。
  • 典型报错
    • java.lang.ClassCastException: org.codehaus.janino.CompilerFactory cannot be cast to org.codehaus.commons.compiler.ICompilerFactory
    • InvocationTargetException 导致 Slot 分配失败。

(2) 依赖未正确引入

  • 如果使用 flink-connector-xxx,但未正确声明依赖或未将依赖上传到集群,可能会导致运行时找不到类或方法。
  • 典型报错
    • Can't find any matched tables, please check your configured database-name: xxx and table-name: xxxx
    • Encountered change event for table xxx.xxx whose schema isn't known to this connector

(3) Shade 打包问题

  • 如果您对依赖进行了 Shade 打包,但未正确处理 META-INF/services 文件或其他资源文件,可能会导致连接器无法正常工作。
  • 典型报错
    • NoResourceAvailableException
    • Cannot allocate the requested resources

3. 解决方案

为了避免上述问题,您可以采取以下措施:

(1) 选择合适的连接器类型

  • 如果是 SQL 作业,建议使用 flink-sql-connector-xxx,并确保只引入一个 FAT JAR。
  • 如果是 DataStream 作业,建议使用 flink-connector-xxx,并通过 Maven 管理依赖。

(2) 解决依赖冲突

  • 排查依赖冲突
    • 使用 mvn dependency:tree 命令查看依赖树,检查是否存在重复或冲突的依赖。
    • 使用 jar tf foo.jar 查看 JAR 包内容,确认是否有重复的类。
  • 排除冲突依赖
    • pom.xml 中使用 <exclusions> 排除不必要的依赖。例如:
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_2.11</artifactId>
        <version>${flink.version}</version>
        <scope>provided</scope>
    </dependency>
    
    • 对于第三方依赖(如 log4j),可以使用 maven-shade-plugin 将其重定位(Relocation)。例如:
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <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>
    

(3) 调整类加载顺序

  • 如果出现类加载冲突,可以通过设置 classloader.parent-first-patterns.additional 参数来调整类加载顺序。例如:
    classloader.parent-first-patterns.additional: org.codehaus.janino
    

(4) 上传依赖文件

  • 如果使用 flink-connector-xxx,需要将依赖的 JAR 文件上传到 Flink 集群,并在作业配置中指定路径。例如:
    pipeline.classpaths: 'file:///flink/usrlib/jar1.jar;file:///flink/usrlib/jar2.jar'
    

4. 重要注意事项

  • Flink 版本一致性:确保本地开发环境、POM 文件中的 Flink 版本与集群引擎版本一致。
  • Connector 版本匹配:下载的 Connector 版本需要与 Flink 引擎版本兼容。例如,vvr-8.0.9-flink-1.17 引擎对应 Flink 1.17.2
  • 避免上传 Runtime 层 JAR:不要上传 Flink 自带的 Runtime 层 JAR(如 flink-streaming-java),应将其作用域设置为 provided

5. 总结

  • 如果您使用的是 flink-sql-connector-xxx,依赖会被打包到 JAR 中,但可能引发依赖冲突。
  • 如果您使用的是 flink-connector-xxx,需要手动管理依赖,避免遗漏或冲突。
  • 根据具体场景选择合适的连接器类型,并按照上述方法解决依赖冲突问题。

希望以上解答能够帮助您解决问题!您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

大数据领域前沿技术分享与交流,这里不止有技术干货、学习心得、企业实践、社区活动,还有未来。

还有其他疑问?
咨询AI助理