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
- Fetch the errorURL from the exception message and inspect the rejected rows
- Fix data issues: column count/types/format must match the Doris table schema
- Check max_filter_ratio / stream load properties if some bad rows are acceptable
- Verify timezone and date formats for temporal columns
- 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
- Validate row shape against the Doris table schema before writing
- Set a sensible max_filter_ratio for tolerant loads
- Monitor errorURL logs for recurring bad rows
- Align date/number formats with Doris expectations
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.