pentaho/pentaho-kettle · error · KettleException
No clustering is used in this transformation.
Error message
No clustering is used in this transformation.
What it means
TransSplitter.splitOriginalTransformation first converts a dynamic cluster master into a fixed one; it throws KettleException 'No clustering is used in this transformation.' when originalTransformation.findFirstUsedClusterSchema() returns null. Splitting only makes sense when at least one step uses a cluster schema.
Solutions
- Assign a cluster schema to at least one step in the transformation (Right-click step > Clustered) or set ClusterSchema on the StepMeta in code.
- Verify the cluster schema is still defined on the transformation's clusterSchemas list and not removed by a copy/import.
- If clustering is not intended, execute the transformation normally instead of via TransSplitter.
- Call findFirstUsedClusterSchema() yourself before splitting as a pre-check.
Example fix
// before TransSplitter splitter = new TransSplitter(transMeta); // no cluster schema // after transMeta.addClusterSchema(clusterSchema); stepMeta.setClusterSchema(clusterSchema); TransSplitter splitter = new TransSplitter(transMeta);
Defensive patterns
Strategy: validation
Validate before calling
if (transMeta.findFirstUsedClusterSchema() == null) {
throw new IllegalStateException("Transformation does not use a cluster schema; cannot split");
} Try / catch
try {
splitter.splitOriginalTransformation();
} catch (KettleException e) {
if (e.getMessage().contains("No clustering is used")) {
// fall back to normal local execution
}
} Prevention
- Pre-check findFirstUsedClusterSchema() before splitting
- Assign cluster schemas to steps in code or Spoon explicitly
- Use plain Trans execution for non-clustered transformations
When it happens
Trigger: Calling TransSplitter.splitOriginalTransformation() (or TransExecutionConfiguration-based clustered execution) on a transformation with no step assigned to any ClusterSchema.
Common situations: Programmatically submitting a transformation for clustered run without marking clustered steps; copying a transformation and dropping its cluster schema; running a plain transformation through the cluster-splitting API.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
- No cluster schemas are being used. As such it is not…
- At this time we don't support the use of multiple cluster…
- Unexpected problem while generating master transformation
- A deadlock was detected between steps
- A server socket allocation always has to accompanied by a…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/1858226e2fb6b914.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/cluster/TransSplitter.java:140
this.originalTransformation.shareVariablesWith( transMeta );
this.originalTransformation.copyParametersFrom( transMeta );
// Retain repository information
this.originalTransformation.setRepositoryDirectory( transMeta.getRepositoryDirectory() );
Repository rep = transMeta.getRepository();
if ( rep != null ) {
rep.readTransSharedObjects( this.originalTransformation );
}
checkClusterConfiguration();
// FIRST : convert the dynamic master into a fixed one.
// This is why we copied the original transformation
//
ClusterSchema clusterSchema = this.originalTransformation.findFirstUsedClusterSchema();
if ( clusterSchema == null ) {
throw new KettleException( "No clustering is used in this transformation." );
}
if ( clusterSchema.isDynamic() ) {
List<SlaveServer> slaveServers = clusterSchema.getSlaveServersFromMasterOrLocal();
SlaveServer masterSlaveServer = clusterSchema.findMaster();
if ( masterSlaveServer == null ) {
throw new KettleException( "You always need at least one master in a cluster schema." );
}
slaveServers.add( 0, masterSlaveServer );
clusterSchema.setDynamic( false );
clusterSchema.setSlaveServers( slaveServers );
}
}
/**
* @return the originalTransformation
*/
public TransMeta getOriginalTransformation() {
return originalTransformation;View on GitHub (pinned to f3058517a1)