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

  1. Verify Elasticsearch is running and reachable at the configured hosts/ports (curl http://host:9200)
  2. Check firewall/network rules between PDI and the cluster
  3. Confirm the transport protocol and version match your Elasticsearch version
  4. 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

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


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)