pentaho/pentaho-kettle · error · KettleStepException
ElasticSearchBulkDialog.Error.NoNodesFound
ElasticSearchBulkDialog.Error.NoNodesFound
Error message
ElasticSearchBulkDialog.Error.NoNodesFound
What it means
indexRow converts rows into bulk requests for Elasticsearch. When the client throws NoNodeAvailableException (no reachable node in the cluster), it is translated to KettleStepException 'ElasticSearchBulkDialog.Error.NoNodesFound'. It means the step could not connect to any configured Elasticsearch node.
Solutions
- Verify Elasticsearch is running and reachable at the configured hosts/ports (curl http://host:9200)
- Check firewall/network rules between PDI and the cluster
- Confirm the transport protocol and version match your Elasticsearch version
- Validate the nodes list in the step dialog for typos
Example fix
// before // nodes: es1.example.com:9300 (ES down) // after // start the cluster and confirm: curl -s es1.example.com:9200 -> 200
Defensive patterns
Strategy: validation
Validate before calling
// health-check the cluster before running the transformation
HttpURLConnection c = (HttpURLConnection) new URL("http://" + host + ":" + port + "/").openConnection();
c.setConnectTimeout(3000);
if (c.getResponseCode() != 200) throw new IllegalStateException("Elasticsearch not reachable at " + host + ":" + port); Try / catch
try { ... } catch (KettleStepException e) { if (e.getMessage().contains("NoNodesFound")) { logError("Elasticsearch cluster unreachable — check hosts/ports and cluster status"); } throw e; } Prevention
- Monitor cluster health and node counts before scheduled runs
- Pin protocol/transport settings to the deployed ES version
- Verify firewall rules for the configured node ports
- Use stable DNS names and validate the nodes list in the dialog
When it happens
Trigger: indexRow executing a bulk request while every configured node is unreachable — wrong host/port, cluster down, or transport mismatch.
Common situations: Elasticsearch not running or restarted on another port; firewall blocking 9200/9300; wrong transport vs HTTP protocol/transport plugin for the ES version; DNS/hostname typos in node list.
Understand the failure class
Background: ECONNREFUSED and "connection refused" / "could not connect to server" errors: what they mean and how to fix them — this error's family across 44 libraries.
Related errors
- ElasticSearchBulk.Error.InvalidIdField
- ElasticSearchBulk.Error.NoJsonField
- ElasticSearchBulk.Log.Exception
- HTTP.Error.UnknownHostException
- HTTP.Exception.IllegalStatusCode
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/fff9525fa335fdb0.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/elasticsearch-bulk-insert/core/src/main/java/org/pentaho/di/trans/steps/elasticsearchbulk/ElasticSearchBulk.java:226
if ( isJsonInsert ) {
addSourceFromJsonString( row, requestBuilder );
} else {
addSourceFromRowFields( requestBuilder, rowMeta, row );
}
currentRequest.add( requestBuilder );
requestsBuffer.add( requestBuilder );
if ( currentRequest.numberOfActions() >= batchSize ) {
return processBatch( true );
} else {
return true;
}
} catch ( KettleStepException e ) {
throw e;
} catch ( NoNodeAvailableException e ) {
throw new KettleStepException( BaseMessages.getString( PKG, "ElasticSearchBulkDialog.Error.NoNodesFound" ) );
} catch ( Exception e ) {
throw new KettleStepException( BaseMessages.getString( PKG, "ElasticSearchBulk.Log.Exception", e
.getLocalizedMessage() ), e );
}
}
/**
* @param row
* @param requestBuilder
*/
private void addSourceFromJsonString( Object[] row, IndexRequestBuilder requestBuilder ) throws KettleStepException {
Object jsonString = row[jsonFieldIdx];
if ( jsonString instanceof byte[] ) {
requestBuilder.setSource( (byte[]) jsonString, XContentType.JSON );
} else if ( jsonString instanceof String ) {
requestBuilder.setSource( (String) jsonString, XContentType.JSON );
} else {
throw new KettleStepException( BaseMessages.getString( "ElasticSearchBulk.Error.NoJsonFieldFormat" ) );View on GitHub (pinned to f3058517a1)