pentaho/pentaho-kettle · error · KettleException
An error occurred sending the master transformation:
Error message
An error occurred sending the master transformation:
What it means
During clustered execution, the master transformation's XML is registered on the master Carte server via RegisterTransServlet. If the server replies with a WebResult that is not OK, the message from the server is appended and thrown as a KettleException.
Solutions
- Read the appended webResult.getMessage() — it contains the Carte server's actual error
- Verify the cluster schema's master host/port and that Carte is running and reachable
- Check Carte authentication (carte config users/passwords) and that the registered name doesn't already exist with a conflicting ID
- Align PDI versions: a newer transformation XML sent to an older Carte can be rejected
Example fix
// before
SlaveServer master = new SlaveServer("master", "wrong-host", 8080, ...);
// after
SlaveServer master = new SlaveServer("master", "carte-host", 8081, "cluster", "cluster"); Defensive patterns
Strategy: validation
Validate before calling
// ping the master Carte server before clustering
SlaveServer master = clusterSchema.findMaster();
String status = master.getStatus(); // throws/indicates if Carte unreachable
if (!status.contains("" + SlaveServer.STATUS_OK)) throw new IllegalStateException("Master Carte not healthy"); Try / catch
try {
TransSplitter splitter = Trans.executeClustered(transMeta, config);
} catch (KettleException e) {
if (e.getMessage().startsWith("An error occurred sending the master transformation:")) {
logError("Master Carte rejected registration: " + e.getMessage());
} else { throw e; }
} Prevention
- Verify master Carte is running and its host/port in the cluster schema are correct
- Check Carte authentication credentials in the cluster schema
- Ensure transformation names don't collide with stale registrations on Carte
- Keep PDI versions consistent between client and Carte servers
When it happens
Trigger: executeClustered calls masterServer.sendXML(..., RegisterTransServlet.CONTEXT_PATH + "/?xml=Y") and the Carte reply reports failure (registration rejected, duplicate name, Carte internal error).
Common situations: Carte master not running or wrong host/port in cluster schema, transformation with the same name already registered on the master, authentication problems with Carte, transformation XML rejected server-side (version mismatch).
Related errors
- An error occurred sending a slave transformation:
- An error occurred while preparing the execution of the…
- Carte.Error.NoServerFound
- Error opening reader socket to remote step '" + remoteStep…
- Error opening writer socket to remote step '" + remoteStep…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/390bc15192dd03fe.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/Trans.java:3814
variables.put( Const.INTERNAL_VARIABLE_CLUSTER_SIZE, Integer.toString( slaves.length ) );
variables.put( Const.INTERNAL_VARIABLE_CLUSTER_MASTER, "Y" );
// Parameters override the variables but they need to pass over the configuration too...
//
Map<String, String> params = transConfiguration.getTransExecutionConfiguration().getParams();
TransMeta ot = transSplitter.getOriginalTransformation();
for ( String param : ot.listParameters() ) {
String value =
Const.NVL( ot.getParameterValue( param ), Const.NVL( ot.getParameterDefault( param ), ot.getVariable(
param ) ) );
params.put( param, value );
}
String masterReply =
masterServer.sendXML( transConfiguration.getXML(), RegisterTransServlet.CONTEXT_PATH + "/?xml=Y" );
WebResult webResult = WebResult.fromXMLString( masterReply );
if ( !webResult.getResult().equalsIgnoreCase( WebResult.STRING_OK ) ) {
throw new KettleException( "An error occurred sending the master transformation: " + webResult
.getMessage() );
}
carteObjectMap.put( master, webResult.getId() );
}
}
// Then the slaves...
// These are started in a background thread.
//
for ( int i = 0; i < slaves.length; i++ ) {
final int index = i;
final TransMeta slaveTrans = transSplitter.getSlaveTransMap().get( slaves[ i ] );
if ( executionConfiguration.isClusterPosting() ) {
Runnable runnable = new Runnable() {
@Override
public void run() {View on GitHub (pinned to f3058517a1)