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
- Verify the step's partitioning schema name exactly matches a partition schema registered in the cluster schema's PartitionSchemas list.
- Re-check slave server definitions/names in the cluster schema; rename mismatches or re-add slaves.
- Re-export/re-apply the transformation to slaves so the distribution metadata is consistent.
- 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
- Keep partition schema names in cluster schema and step metadata identical
- Re-export clustered transformations after any slave changes
- Validate slave server list before each clustered run
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
- Internal error: the referenced partition nr '" +…
- It doesn't make sense to have a partitioned, clustered step…
- JobTrans.Exception.UnableToFindRemoteSlaveServer
- The target slave server name is not defined for remote…
- Variable '" + Const.INTERNAL_VARIABLE_SLAVE_SERVER_NAME +…
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)