{"record":{"id":"874e44b4085735eb","repo":"pentaho/pentaho-kettle","slug":"at-this-time-we-don-t-support-the-use-of-multiple-cluster","errorCode":null,"errorMessage":"At this time we don't support the use of multiple cluster schemas in one and the same transformation.","messagePattern":"At this time we don't support the use of multiple cluster schemas in one and the same transformation\\.","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/cluster/TransSplitter.java","lineNumber":211,"sourceCode":"        List<SlaveServer> slaves = clusterSchema.getSlaveServersFromMasterOrLocal();\n        int count = 0;\n        for ( int s = 0; s < slaves.size(); s++ ) {\n          if ( !slaves.get( s ).isMaster() ) {\n            count++;\n          }\n        }\n        if ( count <= 0 ) {\n          throw new KettleException( \"At least one slave server is required to be present in cluster schema [\"\n            + clusterSchema + \"]\" );\n        }\n      }\n    }\n    if ( map.size() == 0 ) {\n      throw new KettleException(\n        \"No cluster schemas are being used.  As such it is not possible to split and cluster this transformation.\" );\n    }\n    if ( map.size() > 1 ) {\n      throw new KettleException(\n        \"At this time we don't support the use of multiple cluster schemas in one and the same transformation.\" );\n    }\n  }\n\n  private String getWriterName( ClusterSchema clusterSchema, SlaveServer sourceSlaveServer, String sourceStepname,\n    int sourceStepCopy, SlaveServer targetSlaveServer, String targetStepName, int targetStepCopy ) throws Exception {\n    return \"Writer : \"\n      + getPort(\n        clusterSchema, sourceSlaveServer, sourceStepname, sourceStepCopy, targetSlaveServer, targetStepName,\n        targetStepCopy );\n  }\n\n  private String getReaderName( ClusterSchema clusterSchema, SlaveServer sourceSlaveServer, String sourceStepname,\n    int sourceStepCopy, SlaveServer targetSlaveServer, String targetStepName, int targetStepCopy ) throws Exception {\n    return \"Reader : \"\n      + getPort(\n        clusterSchema, sourceSlaveServer, sourceStepname, sourceStepCopy, targetSlaveServer, targetStepName,\n        targetStepCopy );","sourceCodeStart":193,"sourceCodeEnd":229,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/cluster/TransSplitter.java#L193-L229","documentation":"TransSplitter.checkClusterConfiguration throws this when the transMeta uses more than one cluster schema. Pentaho/Kettle clustering only supports assigning a single cluster schema per transformation, since all slaves must come from one schema definition. It is a deliberate design guard, not a transient failure.","triggerScenarios":"Calling TransSplitter.execute()/splitOriginalTransformation() when two or more steps in the transformation are assigned to different cluster schemas (checkClusterConfiguration collects schemas into a map and throws when map.size() > 1).","commonSituations":"Teams combining steps clustered on one schema with steps clustered on another after merging transformations; copy-pasting steps from another clustered transformation that kept its old schema reference.","solutions":["Assign all clustered steps in the transformation to the same cluster schema.","Remove the cluster schema from steps that do not need clustering so only one schema remains in use.","Split the transformation into two transformations (each with one cluster schema) chained via a slave-server hop."],"exampleFix":"// before\nstepA.setClusterSchema(schemaAlpha);\nstepB.setClusterSchema(schemaBeta); // throws\n// after\nstepA.setClusterSchema(sharedSchema);\nstepB.setClusterSchema(sharedSchema);","handlingStrategy":"validation","validationCode":"Set<String> schemas = new HashSet<>();\nfor (StepMeta step : transMeta.getSteps()) {\n  if (step.getClusterSchema() != null) schemas.add(step.getClusterSchema().getName());\n}\nif (schemas.size() > 1) throw new IllegalStateException(\"Use at most one cluster schema: \" + schemas);","typeGuard":null,"tryCatchPattern":"try { transSplitter.executeClustered(); }\ncatch (KettleException e) { if (e.getMessage().contains(\"multiple cluster schemas\")) { fixSchemaAssignment(); } else throw e; }","preventionTips":["Standardize on one cluster schema per transformation","Review step properties after copy-pasting from other transformations","Add a metadata audit before clustered execution"],"tags":["kettle","clustering","transformation","configuration"],"backgroundTag":"unsupported-operation","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}