apache/flink · error · RuntimeException

Could not instantiate…

Error message

Could not instantiate org.apache.flink.formats.avro.utils.AvroKryoSerializerUtils.

What it means

Thrown by AvroUtils.getAvroUtils() when the class org.apache.flink.formats.avro.utils.AvroKryoSerializerUtils was found on the classpath (so it is not ClassNotFoundException) but could not be instantiated — its no-arg constructor threw, the class was not a subclass of AvroUtils, or reflection failed. This means flink-avro is present but broken or version-mismatched.

Solutions

  1. Inspect the chained exception to see the exact instantiation failure (NoSuchMethodError, ExceptionInInitializerError, etc.).
  2. Align the Avro runtime version in your user jar with the version Flink's flink-avro expects.
  3. Avoid relocating/shading org.apache.flink.formats.avro classes; use the provided Flink Avro jars unshaded.
  4. Run dependency-tree / mvn dependency:tree to find and exclude conflicting avro-* artifacts.

Example fix

// before (pom): user jar forces an old avro
<dependency>
  <groupId>org.apache.avro</groupId><artifactId>avro</artifactId><version>1.7.7</version>
</dependency>

// after: align with Flink's BOM-managed avro version, do not shade flink-avro
<dependency>
  <groupId>org.apache.flink</groupId><artifactId>flink-avro</artifactId><version>${flink.version}</version><scope>provided</scope>
</dependency>
Defensive patterns

Strategy: try-catch

Validate before calling

// Probe Avro utils availability before relying on it
try {
    Class.forName("org.apache.flink.formats.avro.utils.AvroKryoSerializerUtils", false, Thread.currentThread().getContextClassLoader());
} catch (ClassNotFoundException e) {
    // flink-avro absent -> use non-Avro types only
}

Try / catch

try {
    AvroUtils.getAvroUtils();
} catch (RuntimeException e) {
    // inspect chained cause; align avro versions or add flink-avro
    throw e;
}

Prevention

When it happens

Trigger: Calling AvroUtils.getAvroUtils() during type registration/serializer setup. The class is loaded via the context ClassLoader; if the loaded version has an incompatible signature, an ExceptionInInitializerError, or a constructor that depends on a missing transitive dependency (e.g. wrong Avro runtime version), the generic catch(Exception) fires.

Common situations: Conflicting avro versions on the classpath (e.g. user jar ships avro 1.7 while flink-avro needs 1.11); a shaded/fat jar that relocated the AvroKryoSerializerUtils class; partial flink-avro dependency (JAR present but its transitive deps stripped by shading).

Related errors


AI-assisted analysis of apache/flink@2f3c205e92 (2026-08-14). Data as JSON: /api/errors/54047d4786724055. Report an issue: GitHub.

Appendix: source

Thrown at flink-core/src/main/java/org/apache/flink/api/java/typeutils/AvroUtils.java:60

    protected static final String AVRO_SPECIFIC_RECORD_BASE_CLASS =
            "org.apache.avro.specific.SpecificRecordBase";

    /**
     * Returns either the default {@link AvroUtils} which throw an exception in cases where Avro
     * would be needed or loads the specific utils for Avro from flink-avro.
     */
    public static AvroUtils getAvroUtils() {
        // try and load the special AvroUtils from the flink-avro package
        try {
            Class<?> clazz =
                    Class.forName(
                            AVRO_KRYO_UTILS, false, Thread.currentThread().getContextClassLoader());
            return clazz.asSubclass(AvroUtils.class).getConstructor().newInstance();
        } catch (ClassNotFoundException e) {
            // cannot find the utils, return the default implementation
            return new DefaultAvroUtils();
        } catch (Exception e) {
            throw new RuntimeException("Could not instantiate " + AVRO_KRYO_UTILS + ".", e);
        }
    }

    /**
     * Returns either {@code Optional#EMPTY} which throw an exception in cases where Avro would be
     * needed or loads the specific utils for Avro from flink-avro.
     */
    public static Optional<AvroUtils> tryGetAvroUtils() {
        // try and load the special AvroUtils from the flink-avro package
        try {
            Class<?> clazz =
                    Class.forName(
                            AVRO_KRYO_UTILS, false, Thread.currentThread().getContextClassLoader());
            return Optional.of(clazz.asSubclass(AvroUtils.class).getConstructor().newInstance());
        } catch (ClassNotFoundException e) {
            // cannot find the utils, return none.
            return Optional.empty();
        } catch (Exception e) {

View on GitHub (pinned to 2f3c205e92)