{"record":{"id":"408ad1d94e9afd5e","repo":"pentaho/pentaho-kettle","slug":"no-cluster-schemas-are-being-used-as-such-it-is-not-possible","errorCode":null,"errorMessage":"No cluster schemas are being used.  As such it is not possible to split and cluster this transformation.","messagePattern":"No cluster schemas are being used\\.  As such it is not possible to split and cluster this transformation\\.","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/cluster/TransSplitter.java","lineNumber":207,"sourceCode":"        compressingSocketStreams = clusterSchema.isSocketsCompressed();\n\n        // Validate the number of slaves. We need at least one to have a valid cluster\n        //\n        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 {","sourceCodeStart":189,"sourceCodeEnd":225,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/cluster/TransSplitter.java#L189-L225","documentation":"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.","triggerScenarios":"checkClusterConfiguration() (from splitOriginalTransformation()) running against a transformation in which zero cluster schemas are referenced by any step, so map.size()==0.","commonSituations":"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.","solutions":["Assign a cluster schema to at least one step before attempting to split.","Branch in code: only call splitOriginalTransformation() when transMeta.findFirstUsedClusterSchema() != null.","Otherwise execute with a normal Trans execution path instead of the clustered one.","Fix import/copy logic that drops the cluster schema reference from steps."],"exampleFix":"// before\nTransSplitter splitter = new TransSplitter(transMeta);\nsplitter.splitOriginalTransformation();\n// after\nif (transMeta.findFirstUsedClusterSchema() != null) {\n  TransSplitter splitter = new TransSplitter(transMeta);\n  splitter.splitOriginalTransformation();\n} else {\n  new Trans(transMeta).execute(null);\n}","handlingStrategy":"validation","validationCode":"if (transMeta.findFirstUsedClusterSchema() == null) {\n  // execute locally instead of splitting\n  new Trans(transMeta).execute(null);\n  return;\n}","typeGuard":null,"tryCatchPattern":"try {\n  splitter.splitOriginalTransformation();\n} catch (KettleException e) {\n  if (e.getMessage().contains(\"No cluster schemas are being used\")) {\n    new Trans(transMeta).execute(null); // fallback: local run\n  }\n}","preventionTips":["Branch execution path on presence of a used cluster schema","Do not route every transformation through cluster submission code","Confirm steps retain their cluster references after import/copy operations"],"tags":["kettle","clustering","transformation","precondition"],"backgroundTag":"missing-required-config-field","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"}