apache/seatunnel · warning

RetryingMetaStoreClient found but no compatible getProxy met

Error message

RetryingMetaStoreClient found but no compatible getProxy method, falling back to HiveMetaStoreClient

What it means

HiveMetaStoreCatalog tries to build a RetryingMetaStoreClient via reflection on its static getProxy method, for resilience across Hive versions. If the class is found but no getProxy method with the expected signature exists, it logs this warning and returns null, causing a plain HiveMetaStoreClient fallback (no built-in retry).

Source

Thrown at seatunnel-connectors-v2/connector-hive/src/main/java/org/apache/seatunnel/connectors/seatunnel/hive/utils/HiveMetaStoreCatalog.java:236

     */
    private static Class<?> loadClass(String className, HiveConf hiveConf)
            throws ClassNotFoundException {
        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
        if (contextClassLoader != null) {
            try {
                return Class.forName(className, true, contextClassLoader);
            } catch (ClassNotFoundException ignored) {
            }
        }
        return hiveConf.getClassByName(className);
    }

    private IMetaStoreClient tryCreateRetryingClient(HiveConf hiveConf) {
        try {
            Class<?> clazz = Class.forName(RETRYING_METASTORE_CLIENT_CLASS_NAME);
            Method getProxyMethod = getProxyMethod(clazz);
            if (getProxyMethod == null) {
                log.warn(RETRYING_METASTORE_CLIENT_NO_COMPATIBLE_GET_PROXY_MESSAGE);
                return null;
            }

            Object proxy = getProxyMethod.invoke(null, hiveConf, true);
            if (proxy instanceof IMetaStoreClient) {
                log.info(
                        "Using RetryingMetaStoreClient for Hive metastore connection [uris={}]",
                        hiveConf.get("hive.metastore.uris"));
                return (IMetaStoreClient) proxy;
            }
            log.warn(RETRYING_METASTORE_CLIENT_NO_COMPATIBLE_GET_PROXY_MESSAGE);
            return null;
        } catch (ClassNotFoundException e) {
            log.debug("RetryingMetaStoreClient not found, falling back to HiveMetaStoreClient", e);
            return null;
        } catch (Exception e) {
            log.warn(
                    "Failed to create RetryingMetaStoreClient proxy, falling back to HiveMetaStoreClient",

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Align the Hive metastore client version on the classpath with the version SeaTunnel's Hive connector expects
  2. Inspect getProxyMethod(clazz) to see which signature it looks for and confirm your hive-exec/metastore jar provides it
  3. Accept the fallback if retrying behavior is not critical — HiveMetaStoreClient still works
  4. Pin an explicit hive-exec dependency version to avoid transitive version drift
Defensive patterns

Strategy: fallback

Validate before calling

Class<?> c = Class.forName("org.apache.hadoop.hive.metastore.RetryingMetaStoreClient");
boolean ok = java.util.Arrays.stream(c.getMethods()).anyMatch(m -> m.getName().equals("getProxy"));

Try / catch

try {
  client = retryingClientFactory(hiveConf);
} catch (Exception e) {
  client = new HiveMetaStoreClient(hiveConf); // fallback
}

Prevention

When it happens

Trigger: tryCreateRetryingClient() loads RETRYING_METASTORE_CLIENT_CLASS_NAME successfully, but getProxyMethod(clazz) returns null because no compatible getProxy(Configuration,boolean)-style method exists in the classpath's Hive version.

Common situations: Hive version mismatch: connector built against one Hive release while the runtime classpath contains another with a changed getProxy signature; shaded/mixed Hive jars.

Understand the failure class

Background: "is not a compatible type" / "cannot merge" errors: when a value's type doesn't match what the library requires — this error's family across 65 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/6e4c05157727e783. Report an issue: GitHub.