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

  1. Assign a cluster schema to at least one step in the transformation (Right-click step > Clustered) or set ClusterSchema on the StepMeta in code.
  2. Verify the cluster schema is still defined on the transformation's clusterSchemas list and not removed by a copy/import.
  3. If clustering is not intended, execute the transformation normally instead of via TransSplitter.
  4. 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

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


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)