pentaho/pentaho-kettle · error · KettleException
Unable to find step ' ' to stream data from
Error message
Unable to find step '{streamingSourceStepname}' to stream data from What it means
Thrown by MetaInject.processRow() in streaming mode when findInputRowSet() returns null for data.streamingSourceStepname. It means the parent transformation's hop feeding the Meta Inject step has no RowSet from the configured streaming source step, so rows cannot be depleted into the injected sub-transformation.
Solutions
- Verify the step feeding the Meta Inject step is named exactly like the configured streaming source step name
- Reopen the Meta Inject dialog, re-pick the streaming source step, and re-save the transformation
- Ensure the input hop to the Meta Inject step exists and is enabled
- If the name comes from a variable/parameter, log its resolved value at runtime and compare to the actual upstream step name
Example fix
// before: renamed upstream step, stale config data.streamingSourceStepname = 'CSV Input 1'; // step is now 'CSV Input' // after // In Spoon: Meta Inject > Streaming source step = 'CSV Input' (re-selected) and re-save
Defensive patterns
Strategy: validation
Validate before calling
// Verify the streaming source matches the actual hop into Meta Inject
String prev = meta.getStreamingSourceStepname();
boolean hopOk = transMeta.findStep(prev) != null &&
transMeta.findPreviousSteps(transMeta.findStep('Meta Inject'), true)
.stream().anyMatch(s -> s.getName().equals(prev));
if (!hopOk) throw new IllegalStateException('Streaming source step has no hop into Meta Inject'); Type guard
boolean streamingHopExists(TransMeta t, String sourceName, String injectName) {
StepMeta src = t.findStep(sourceName);
return src != null && t.findStep(injectName) != null &&
t.isTransMetaHopBetween(src, t.findStep(injectName));
} Try / catch
try {
// execute transformation
} catch (KettleException e) {
if (e.getMessage().contains("to stream data from")) {
log.error('Streaming source step misconfigured: ' + e.getMessage(), e);
} else throw e;
} Prevention
- Re-select the streaming source step after renaming upstream steps
- Never type the streaming source step name manually; use the dialog picker
- Keep the input hop to Meta Inject enabled
- Log resolved variable values feeding step-name fields
When it happens
Trigger: Running Meta Inject with streaming enabled while the 'streaming source step name' does not match an actual input hop into the Meta Inject step — e.g. the hop was removed, the source step renamed, or the field set from a stale/incorrect value.
Common situations: Renaming or deleting the upstream step after configuring streaming injection; enabling streaming with a source step name typed manually; running the transformation where the parent hop is disabled.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- A deadlock was detected between steps
- Append.Exception.InvalidLayoutDetected
- BaseStep.Exception.SourceStepToReadFromCantRunInMultipleCopies
- BaseStep.Exception.TargetStepToWriteToCantRunInMultipleCopies
- BaseStep.Exception.SourceStepToReadFromDoesntExist
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/b6b13f27d74f6791.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/meta-inject/impl/src/main/java/org/pentaho/di/trans/steps/metainject/MetaInject.java:191
}
stepInterface.addRowListener( new RowAdapter() {
@Override
public void rowWrittenEvent( RowMetaInterface rowMeta, Object[] row ) throws KettleStepException {
// Just pass along the data as output of this step...
//
MetaInject.this.putRow( rowMeta, row );
}
} );
}
injectTrans.startThreads();
if ( data.streaming ) {
// Deplete all the rows from the parent transformation into the modified transformation
//
RowSet rowSet = findInputRowSet( data.streamingSourceStepname );
if ( rowSet == null ) {
throw new KettleException( "Unable to find step '" + data.streamingSourceStepname + "' to stream data from" );
}
Object[] row = getRowFrom( rowSet );
while ( row != null && !isStopped() ) {
rowProducer.putRow( rowSet.getRowMeta(), row );
row = getRowFrom( rowSet );
}
rowProducer.finished();
}
// Wait until the child transformation finished processing...
//
while ( !injectTrans.isFinished() && !injectTrans.isStopped() && !isStopped() ) {
copyResult( injectTrans );
// Wait a little bit.
try {
Thread.sleep( 50 );
} catch ( Exception e ) {View on GitHub (pinned to f3058517a1)