{"record":{"id":"54bdfd0bef61e7b8","repo":"pentaho/pentaho-kettle","slug":"unsupported-situation-detected-where-a-remote-input-step-is","errorCode":null,"errorMessage":"Unsupported situation detected where a remote input step is expecting data to end up in a particular Mapping Input step of a sub-transformation.  To solve it, insert a dummy step before the mapping.","messagePattern":"Unsupported situation detected where a remote input step is expecting data to end up in a particular Mapping Input step of a sub-transformation\\.  To solve it, insert a dummy step before the mapping\\.","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/mapping/Mapping.java","lineNumber":127,"sourceCode":"            // over remotely to this mapping.\n            // However, the data needs to end up at a Mapping Input step of the\n            // sub-transformation, not in this step.\n            // We can move over the remote steps to the Mapping Input step as long\n            // as the threads haven't started yet.\n            //\n            for ( RemoteStep remoteStep : getRemoteInputSteps() ) {\n              // Pass this rowset down to a mapping input step in the\n              // sub-transformation...\n              //\n              if ( mappingInputs.length == 1 ) {\n                // Simple case: only one input mapping. Move the remote step over\n                //\n                mappingInputs[0].getRemoteInputSteps().add( remoteStep );\n              } else {\n                // TODO: figure out where this remote step needs to go and where\n                // it comes from.\n                //\n                throw new KettleException(\n                    \"Unsupported situation detected where a remote input step is expecting data \"\n                        + \"to end up in a particular Mapping Input step of a sub-transformation.  \"\n                        + \"To solve it, insert a dummy step before the mapping.\" );\n              }\n            }\n            getRemoteInputSteps().clear();\n          }\n\n          // Do the same thing for output row sets\n          //\n          List<RowSet> outputRowSets = getOutputRowSets();\n          if ( !outputRowSets.isEmpty() ) {\n            for ( RowSet rowSet : outputRowSets ) {\n              // Pass this rowset down to a mapping input step in the\n              // sub-transformation...\n              //\n              if ( mappingOutputs.length == 1 ) {\n                // Simple case: only one output mapping. Move the RowSet over","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/mapping/Mapping.java#L109-L145","documentation":"In Mapping.processRow, remote input steps (clustered/remote execution sources) are attached to mappingInputs[0].getRemoteInputSteps(). If the sub-transformation has more than one Mapping Input, the code cannot decide which one should receive the remote step and throws this KettleException. It exists to force a single, unambiguous target for remote data delivery.","triggerScenarios":"Running (often clustered/remote) a transformation where the Mapping step's sub-transformation contains multiple Mapping Input steps, and a remote input step's data must land in one specific Mapping Input — during remote-input wiring in processRow.","commonSituations":"Executing the transformation on a cluster (remote slave steps) where the sub-transf was designed with several Mapping Inputs; partitioned/clustered runs picking up a sub-transf originally used only locally.","solutions":["Insert a Dummy step before the Mapping step in the parent transformation to disambiguate, per the message.","Reduce the sub-transformation to exactly one Mapping Input step.","If clustered, verify the sub-transformation's step copy/cluster schema settings so remote steps map to a single Mapping Input.","Run locally first to confirm the topology, then fix wiring before redeploying to the cluster."],"exampleFix":"// before (clustered run)\nParentStep =====> Mapping(sub.ktr)  // sub.ktr: 2x MappingInput, remote steps unresolvable\n// after\nParentStep =====> Dummy =====> Mapping(sub.ktr)  // or single MappingInput in sub.ktr","handlingStrategy":"validation","validationCode":"// Before clustered execution, assert single Mapping Input in the sub-transformation:\nlong mappingInputs = subTransMeta.getSteps().stream()\n  .filter(s -> s.getStepMeta() instanceof MappingInputMeta).count();\nif (mappingInputs > 1) throw new IllegalStateException(\"Remote execution requires exactly one Mapping Input\");","typeGuard":null,"tryCatchPattern":"try {\n  trans.execute(new String[0]); // clustered run\n} catch (KettleException e) {\n  if (e.getMessage().contains(\"remote input step\")) {\n    log.error(\"Remote input cannot target multiple Mapping Inputs: add Dummy step or reduce to one\", e);\n  } else { throw e; }\n}","preventionTips":["Audit sub-transformations for multiple Mapping Inputs before enabling clustering.","Verify cluster schema and step copy settings on all environments.","Smoke-test the topology locally before cluster deployment.","Add Dummy steps to disambiguate any parent-to-mapping hop."],"tags":["mapping","cluster","sub-transformation","kettle"],"backgroundTag":"invalid-state-transition","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"}