pentaho/pentaho-kettle · error · KettleException
PanTransformationDelegate.Error.NoRemoteServerSpecified
Error message
PanTransformationDelegate.Error.NoRemoteServerSpecified
What it means
RemoteTransExecutorService.execute throws KettleException when executing a transformation remotely but executionConfiguration.getRemoteServer() is null — there is no slave server defined to send the transformation to. The log already announced 'Executing remotely' before the check.
Solutions
- Set a remote server: executionConfiguration.setRemoteServer(new SlaveServer("slave","host",8080,"user","pass"))
- When using pan, pass the remote host/port options so the configuration builder populates remoteServer
- Verify with executionConfiguration.getRemoteServer() != null before invoking the remote path
Example fix
// before
cfg.setExecutingRemoted(true); // remoteServer never set
// after
SlaveServer slave = new SlaveServer("slave1", "192.168.1.10", 8080, "cluster", "cluster");
cfg.setRemoteServer(slave);
cfg.setExecutingRemoted(true); Defensive patterns
Strategy: validation
Validate before calling
if (cfg.isExecutingRemoted() && cfg.getRemoteServer() == null) {
throw new IllegalStateException("Remote execution requested but remoteServer not set — call setRemoteServer(new SlaveServer(...))");
} Type guard
static boolean hasRemoteServer(TransExecutionConfiguration c) {
return c != null && c.getRemoteServer() != null;
} Try / catch
try {
result = remoteService.execute(log, transMeta, repository, cfg, args);
} catch (KettleException e) {
if (e.getMessage() != null && e.getMessage().endsWith("NoRemoteServerSpecified")) {
throw new ConfigurationException("Provide -host/-port or setRemoteServer(...) for remote execution", e);
}
throw e;
} Prevention
- Always pair setExecutingRemoted(true) with setRemoteServer(...)
- Ping the SlaveServer URL before dispatching
- Build remote configs from explicit host/port parameters, not copied defaults
- Validate config in a shared pre-flight method before any executor runs
When it happens
Trigger: Invoking the remote executor with isExecutingRemoted()==true but no SlaveServer set via setRemoteServer().
Common situations: Cluster/remote scripts that set the remote flag but forget -host/-port; configuration copied from a local run; slave server object cleared by later config mutation.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
- DefaultRunConfigurationExecutor.RemoteNotFound.Error
- There was an error passing the exported transformation to…
- There was an error posting the transformation on the remote…
- An error occurred while preparing the execution of a slave…
- An error occurred while starting the execution of a slave…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/3df22a9c67708873.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/pan/executors/RemoteTransExecutorService.java:51
/**
* Executes a transformation on a remote server.
*
* @param log the log channel interface for logging
* @param transMeta the transformation metadata
* @param repository the repository (can be null)
* @param executionConfiguration the execution configuration
* @param arguments the command-line arguments
* @return the result of the transformation execution
* @throws KettleException if an error occurs during execution
*/
@Override
public Result execute( LogChannelInterface log, TransMeta transMeta, Repository repository,
TransExecutionConfiguration executionConfiguration, String[] arguments ) throws KettleException {
log.logBasic( BaseMessages.getString( pkg, "PanTransformationDelegate.Log.ExecutingRemotely" ) );
if ( executionConfiguration.getRemoteServer() == null ) {
throw new KettleException( BaseMessages.getString( pkg, "PanTransformationDelegate.Error.NoRemoteServerSpecified" ) );
}
// Send transformation to slave server
String carteObjectId = Trans.sendToSlaveServer( transMeta, executionConfiguration, repository, MetaStoreConst.getDefaultMetastore() );
// Monitor remote transformation
monitorRemoteTransformation( log, transMeta, carteObjectId, executionConfiguration.getRemoteServer() );
// For command-line execution, we typically return a simple success result
// In a real implementation, you might want to fetch the actual result from the remote server
Result result = new Result();
result.setResult( true );
return result;
}
/**
* Monitors the execution of a remote transformation.
*View on GitHub (pinned to f3058517a1)