pentaho/pentaho-kettle · error · KettleStepException

Unable to find partition using rowset data, slave=" +…

Error message

Unable to find partition using rowset data, slave=" + outputRowSet.getRemoteSlaveServerName() + ", partition schema=" + nextStepPartitioningMeta.getPartitionSchema().getName() + ", copy=" + outputRowSet.getDestinationStepCopy()

What it means

In clustered (partitioned) transformation output handling, BaseStep looks up which target rowset matches (slave server name, partition schema name, destination step copy) using the cluster distribution. If distribution.getPartition(...) returns a negative number, no registered partition matches the given combination, and a KettleStepException is thrown. It signals an inconsistency between the rowset's remote slave/partition-schema metadata and the distribution's registered partition schema.

Solutions

  1. Verify the step's partitioning schema name exactly matches a partition schema registered in the cluster schema's PartitionSchemas list.
  2. Re-check slave server definitions/names in the cluster schema; rename mismatches or re-add slaves.
  3. Re-export/re-apply the transformation to slaves so the distribution metadata is consistent.
  4. Add a null/negative guard or wrap with try-catch KettleStepException and log slave/schema/copy for diagnosis.

Example fix

// before: assuming schema names match
// ClusterSchema has 'p-schema-A' but step uses 'p-schema-a'
stepMeta.setPartitioningMeta(createPartitioning("p-schema-A"));

// after: use the exact schema name from the cluster definition
stepMeta.setPartitioningMeta(createPartitioning(clusterSchema.getPartitionSchemas().get(0).getName()));
Defensive patterns

Strategy: validation

Validate before calling

// Verify partition schema is registered in the cluster distribution before execution
boolean found = clusterSchema.getPartitionSchemas().stream()
  .anyMatch(ps -> ps.getName().equals(stepPartitionSchemaName));
if (!found) throw new IllegalStateException("Partition schema not in cluster distribution");

Try / catch

try {
  trans.execute(null);
} catch (KettleException e) {
  if (e.getMessage().startsWith("Unable to find partition using rowset data")) {
    logError("Cluster schema/slave mismatch: " + e.getMessage(), e);
  } else { throw e; }
}

Prevention

When it happens

Trigger: Running a clustered transformation where an output RowSet has a remoteSlaveServerName/partitionSchemaName/copy combination not registered in the ClusterSchema's distribution, causing getPartition() to return -1.

Common situations: Clustered/trans deployments where slave servers were renamed or removed; partition schema on the step does not match the schema defined for the cluster; mismatched master/slave configuration after re-exporting the transformation.

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/9870a25a83f71562. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/step/BaseStep.java:1427

        // The slave-step-copy distribution is passed onto the slave transformation
        //
        SlaveStepCopyPartitionDistribution distribution = transMeta.getSlaveStepCopyPartitionDistribution();

        String nextPartitionSchemaName =
          TransSplitter.createPartitionSchemaNameFromTarget( nextStepPartitioningMeta
            .getPartitionSchema().getName() );

        for ( RowSet outputRowSet : outputRowSets ) {
          try {
            // Look at the pre-determined distribution, decided at "transformation split" time.
            //
            int partNr =
              distribution.getPartition(
                outputRowSet.getRemoteSlaveServerName(), nextPartitionSchemaName, outputRowSet
                  .getDestinationStepCopy() );

            if ( partNr < 0 ) {
              throw new KettleStepException( "Unable to find partition using rowset data, slave="
                + outputRowSet.getRemoteSlaveServerName() + ", partition schema="
                + nextStepPartitioningMeta.getPartitionSchema().getName() + ", copy="
                + outputRowSet.getDestinationStepCopy() );
            }
            partitionNrRowSetList[ partNr ] = outputRowSet;
          } catch ( NullPointerException e ) {
            throw ( e );
          }
        }
      }

      // OK, now get the target partition based on the partition nr...
      // This should be very fast
      //
      if ( partitionNr < partitionNrRowSetList.length ) {
        selectedRowSet = partitionNrRowSetList[ partitionNr ];
      } else {
        String rowsets = "";

View on GitHub (pinned to f3058517a1)