apache/seatunnel · critical · HudiConnectorException
CONFIG_VALIDATION_FAILED
CONFIG_VALIDATION_FAILED
Error message
PluginName: %s, PluginType: %s, Message: Cannot find Hudi catalog factory
What it means
HudiSink.getSaveModeHandler() uses SeaTunnel's SPI discovery to locate the factory registered with identifier "Hudi". If discovery returns null — the Hudi catalog factory is not on the classpath or not registered as a service — a HudiConnectorException with CONFIG_VALIDATION_FAILED is thrown. SaveMode handling depends on creating the Hudi catalog through this factory.
Source
Thrown at seatunnel-connectors-v2/connector-hudi/src/main/java/org/apache/seatunnel/connectors/seatunnel/hudi/sink/HudiSink.java:113
@Override
public Optional<Serializer<HudiCommitInfo>> getCommitInfoSerializer() {
return Optional.of(new DefaultSerializer<>());
}
@Override
public Optional<SaveModeHandler> getSaveModeHandler() {
TablePath tablePath =
TablePath.of(
catalogTable.getTableId().getDatabaseName(),
catalogTable.getTableId().getTableName());
CatalogFactory catalogFactory =
discoverFactory(
Thread.currentThread().getContextClassLoader(),
CatalogFactory.class,
"Hudi");
if (catalogFactory == null) {
throw new HudiConnectorException(
SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,
String.format(
"PluginName: %s, PluginType: %s, Message: %s",
getPluginName(), PluginType.SINK, "Cannot find Hudi catalog factory"));
}
Catalog catalog = catalogFactory.createCatalog(catalogFactory.factoryIdentifier(), config);
return Optional.of(
new DefaultSaveModeHandler(
hudiSinkConfig.getSchemaSaveMode(),
hudiSinkConfig.getDataSaveMode(),
catalog,
tablePath,
catalogTable,
null));
}
@Override
public Optional<CatalogTable> getWriteCatalogTable() {View on GitHub (pinned to cf67b549a7)
Solutions
- Install the full connector-hudi plugin via sh bin/install-plugin.sh or copy the connector-hudi jar into the plugins directory.
- Verify META-INF/services/org.apache.seatunnel.api.configuration.util.CatalogFactory (FactoryIdentifier SPI) entry for HudiCatalogFactory exists in the jar.
- Check the plugin discovery directory configuration so the SeaTunnel runtime can see the connector jar.
- Ensure the thread context classloader at job submission includes connector-hudi classes.
Defensive patterns
Strategy: validation
Validate before calling
Class<?> f = Thread.currentThread().getContextClassLoader()
.loadClass("org.apache.seatunnel.connectors.seatunnel.hudi.catalog.HudiCatalogFactory");
// if loadClass throws, the connector jar is not on the runtime classpath Try / catch
try {
sink.doWrite(...);
} catch (HudiConnectorException e) {
if (e.getCode() == SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED) {
// verify plugin installation / SPI registration and resubmit
} else throw e;
} Prevention
- Install connectors with bin/install-plugin.sh so all Hudi jars and SPI files are present.
- Never hand-build connector jars without META-INF/services factory registrations.
- Check plugin.dir configuration when deploying to a custom directory.
When it happens
Trigger: Running a job with save_mode requiring catalog handling while the connector-hudi plugin jar is absent from the runtime plugin directory, the SPI file is missing/broken, or the factory identifier lookup for "Hudi" fails on the current thread context classloader.
Common situations: Deploying only the sink jar without the full connector package; plugin.dir misconfigured so connector-hudi isn't loaded; custom classloader setups losing Thread.currentThread().getContextClassLoader(); manually assembled fat jars missing META-INF/services entries.
Understand the failure class
Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.
Related errors
- Plugin %s not found.
- Could not find any factories that implement '%s' in the clas
- Multiple factories for identifier '%s' that implement '%s' f
- Could not load service provider for factories.
- CONFIG_VALIDATION_FAILED
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/688e250fa1ab203d.
Report an issue: GitHub.