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

  1. Verify the step feeding the Meta Inject step is named exactly like the configured streaming source step name
  2. Reopen the Meta Inject dialog, re-pick the streaming source step, and re-save the transformation
  3. Ensure the input hop to the Meta Inject step exists and is enabled
  4. 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

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


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)