Caused by: java.lang.LinkageError: loader constraint violation:
when resolving method "org.apache.flink.runtime.util.HadoopUtils.getHadoopConfiguration(Lorg/apache/flink/configuration/Configuration;)Lorg/apache/hadoop/conf/Configuration;"
the class loader (instance of org/apache/flink/util/ChildFirstClassLoader) of the current class, org/apache/flink/formats/parquet/avro/AvroParquetRecordFormat, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for the method's defining class, org/apache/flink/runtime/util/HadoopUtils, have different Class objects for the type org/apache/hadoop/conf/Configuration used in the signature
这个 LinkageError 是典型的 类加载器隔离导致的类型不兼容问题,其本质是 JVM 的类型安全机制被破坏。以下是逐层拆解的关键原因:
Java 的类加载器遵循 "双亲委派模型",但 Flink 的 ChildFirstClassLoader 打破了这一规则:
ChildFirstClassLoader 优先自己加载用户代码中的类,而不是委托给父加载器。在错误日志中,两个类加载器分别加载了 org.apache.hadoop.conf.Configuration:
AppClassLoader(系统类加载器):
HadoopUtils 类及其依赖的 Configuration 类。ChildFirstClassLoader*:
AvroParquetRecordFormat 类,并可能加载了用户依赖的另一个 Configuration 类。尽管两个 Configuration 类的全限定名相同,但因由不同类加载器加载,JVM 认为它们是 两个完全不同的类型。
当 HadoopUtils.getHadoopConfiguration 方法被调用时:
org.apache.hadoop.conf.Configuration,由 AppClassLoader 加载。org.apache.hadoop.conf.Configuration,但由 ChildFirstClassLoader 加载。