apache/seatunnel · error · DorisConnectorException

STREAM_LOAD_FAILED

STREAM_LOAD_FAILED

Error message

stream load error: <message>, see more in <errorURL>

What it means

Thrown in DorisSinkWriter.flush after stopLoad() returns a RespContent whose status is not in DORIS_SUCCESS_STATUS (e.g. Fail, Fail-just-required). The message embeds Doris's own error message and an errorURL that points to the detailed rejected-row log on the BE.

Source

Thrown at seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/sink/writer/DorisSinkWriter.java:277

        RespContent respContent = flush();
        if (!dorisSinkConfig.getEnable2PC() || respContent == null) {
            return Optional.empty();
        }
        long txnId = respContent.getTxnId();

        return Optional.of(new DorisCommitInfo(controlHostPort, dorisStreamLoad.getDb(), txnId));
    }

    private RespContent flush() throws IOException {
        // disable exception checker before stop load.
        checkState(dorisStreamLoad != null);
        RespContent respContent = dorisStreamLoad.stopLoad();
        if (respContent != null && !DORIS_SUCCESS_STATUS.contains(respContent.getStatus())) {
            String errMsg =
                    String.format(
                            "stream load error: %s, see more in %s",
                            respContent.getMessage(), respContent.getErrorURL());
            throw new DorisConnectorException(DorisConnectorErrorCode.STREAM_LOAD_FAILED, errMsg);
        }
        return respContent;
    }

    /**
     * Finishes the current non-2PC Stream Load and opens a new one when the Zeta engine delivers a
     * timer flush signal.
     */
    private void timerFlush() throws IOException {
        checkLoadException();
        flush();
        startLoad(labelGenerator.generateLabel(lastCheckpointId));
    }

    @Override
    public List<DorisSinkState> snapshotState(long checkpointId) {
        checkState(dorisStreamLoad != null);
        startLoad(labelGenerator.generateLabel(checkpointId + 1));

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Fetch the errorURL from the exception message and inspect the rejected rows
  2. Fix data issues: column count/types/format must match the Doris table schema
  3. Check max_filter_ratio / stream load properties if some bad rows are acceptable
  4. Verify timezone and date formats for temporal columns
  5. Increase BE load memory limits if the failure is resource-related

Example fix

// before (bad data)
{"id": "abc", "ts": "not-a-date"}
// after (aligned with table schema)
{"id": 123, "ts": "2026-09-10 00:00:00"}
Defensive patterns

Strategy: try-catch

Try / catch

try { writer.flush(); } catch (DorisConnectorException e) { if (e.getMessage().contains("stream load error")) { String url = extractErrorURL(e.getMessage()); log.error("rejected rows at {}", url); } throw e; }

Prevention

When it happens

Trigger: Any stream load commit (flush from write, timerFlush, applySchemaChange pre-flush, or close) where Doris responds with a failure status in the load response JSON.

Common situations: Malformed rows rejected by Doris (wrong column count/format); JSON parse errors on BE; value out of range or type mismatch; label issues; memory limits exceeded on BE during load.

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/eb8039b7b7f66069. Report an issue: GitHub.