Flink CDC on yarn时,代码里使用了kafka producer,如果用application模式提交,会遇到StringDeserializer not found的问题,如果用per-job模式提交就正常,这是啥情况?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用Flink CDC on YARN时,如果通过Application模式提交作业时遇到StringDeserializer not found的问题,而通过Per-Job模式提交时正常,这通常与Flink的类加载机制和依赖管理方式有关。以下是详细分析和解决方案:
由于Application模式下,Flink集群是动态创建的,所有依赖必须显式地包含在用户代码的JAR包中,否则可能会导致类加载失败。
StringDeserializer not found的具体原因StringDeserializer类属于Kafka客户端库的一部分。如果在Application模式下提交作业时,Kafka客户端库未正确打包到用户JAR中,或者未被正确加载,就会出现StringDeserializer not found的错误。在Application模式下,所有依赖必须被打包到用户JAR中。可以通过以下方式解决:
使用FAT JAR
<build>
 <plugins>
     <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>
                     <filters>
                         <filter>
                             <artifact>*:*</artifact>
                             <excludes>
                                 <exclude>META-INF/*.SF</exclude>
                                 <exclude>META-INF/*.DSA</exclude>
                                 <exclude>META-INF/*.RSA</exclude>
                             </excludes>
                         </filter>
                     </filters>
                 </configuration>
             </execution>
         </executions>
     </plugin>
 </plugins>
</build>
手动添加依赖
kafka-clients-x.x.x.jar)手动上传到Flink集群的lib目录中,并重启集群。StringDeserializer not found的问题,可能是类加载冲突导致的。flink-conf.yaml中设置以下参数以调整类加载策略:classloader.resolve-order: parent-first
yarn logs -applicationId <application_XXXX_YY>
ClassNotFoundException或NoClassDefFoundError,说明依赖未正确加载。maven-shade-plugin对冲突的依赖进行重命名(Shading)。--classloader parent-first参数模拟YARN环境下的类加载行为,提前发现问题。通过上述分析可知,StringDeserializer not found的问题主要是由于Application模式下依赖未正确打包或加载导致的。通过构建FAT JAR、调整类加载策略以及验证依赖加载情况,可以有效解决该问题。