pentaho/pentaho-kettle · error · KettleException

No cluster schemas are being used. As such it is not…

Error message

No cluster schemas are being used.  As such it is not possible to split and cluster this transformation.

What it means

At the end of TransSplitter.checkClusterConfiguration(), if the map of used cluster schemas is empty (no step in the transformation uses clustering), the splitter throws KettleException 'No cluster schemas are being used. As such it is not possible to split and cluster this transformation.' This is the sibling guard to error 1225, raised after schema-level validation instead of at schema lookup time.

Solutions

  1. Assign a cluster schema to at least one step before attempting to split.
  2. Branch in code: only call splitOriginalTransformation() when transMeta.findFirstUsedClusterSchema() != null.
  3. Otherwise execute with a normal Trans execution path instead of the clustered one.
  4. Fix import/copy logic that drops the cluster schema reference from steps.

Example fix

// before
TransSplitter splitter = new TransSplitter(transMeta);
splitter.splitOriginalTransformation();
// after
if (transMeta.findFirstUsedClusterSchema() != null) {
  TransSplitter splitter = new TransSplitter(transMeta);
  splitter.splitOriginalTransformation();
} else {
  new Trans(transMeta).execute(null);
}
Defensive patterns

Strategy: validation

Validate before calling

if (transMeta.findFirstUsedClusterSchema() == null) {
  // execute locally instead of splitting
  new Trans(transMeta).execute(null);
  return;
}

Try / catch

try {
  splitter.splitOriginalTransformation();
} catch (KettleException e) {
  if (e.getMessage().contains("No cluster schemas are being used")) {
    new Trans(transMeta).execute(null); // fallback: local run
  }
}

Prevention

When it happens

Trigger: checkClusterConfiguration() (from splitOriginalTransformation()) running against a transformation in which zero cluster schemas are referenced by any step, so map.size()==0.

Common situations: Submitting a stand-alone transformation to a cluster; a transformation where the clustered flag was cleared on all steps during edit/import; scripted execution that reuses cluster submission code unconditionally.

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/408ad1d94e9afd5e. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/cluster/TransSplitter.java:207

        compressingSocketStreams = clusterSchema.isSocketsCompressed();

        // Validate the number of slaves. We need at least one to have a valid cluster
        //
        List<SlaveServer> slaves = clusterSchema.getSlaveServersFromMasterOrLocal();
        int count = 0;
        for ( int s = 0; s < slaves.size(); s++ ) {
          if ( !slaves.get( s ).isMaster() ) {
            count++;
          }
        }
        if ( count <= 0 ) {
          throw new KettleException( "At least one slave server is required to be present in cluster schema ["
            + clusterSchema + "]" );
        }
      }
    }
    if ( map.size() == 0 ) {
      throw new KettleException(
        "No cluster schemas are being used.  As such it is not possible to split and cluster this transformation." );
    }
    if ( map.size() > 1 ) {
      throw new KettleException(
        "At this time we don't support the use of multiple cluster schemas in one and the same transformation." );
    }
  }

  private String getWriterName( ClusterSchema clusterSchema, SlaveServer sourceSlaveServer, String sourceStepname,
    int sourceStepCopy, SlaveServer targetSlaveServer, String targetStepName, int targetStepCopy ) throws Exception {
    return "Writer : "
      + getPort(
        clusterSchema, sourceSlaveServer, sourceStepname, sourceStepCopy, targetSlaveServer, targetStepName,
        targetStepCopy );
  }

  private String getReaderName( ClusterSchema clusterSchema, SlaveServer sourceSlaveServer, String sourceStepname,
    int sourceStepCopy, SlaveServer targetSlaveServer, String targetStepName, int targetStepCopy ) throws Exception {

View on GitHub (pinned to f3058517a1)