Doris 数据 API 完全指南:RESTful 接口与 SDK 快速上手
【免费下载链接】dorisApache Doris is a real-time analytics and hybrid search database for AI agents.项目地址: https://gitcode.com/GitHub_Trending/doris/doris
你的业务系统每晚要把一千万行日志推进 Doris,直接拼 SQL 逐条 INSERT 显然扛不住。Apache Doris 的 数据 API 就是为这种批量写入准备的:FE 节点的 HTTP 端口(默认 8030)上挂着一组 RESTful 接口,把数据按 CSV / JSON 打包发过去即可,官方仓库的 samples/stream_load/ 目录还备好了 Python、Go、Java、Rust 四种语言的 SDK 参考实现。读完这篇 Doris 数据导入教程,你会知道接口长什么样、请求怎么拼、出错了往哪查。
API 家族地图
先花三十秒把接口分布看一遍,心里有底,后面拼请求才不会迷路。
| 接口 | 请求方法 | 典型用途 | 支持格式 |
|---|---|---|---|
/api/{db}/{table}/_stream_load | PUT | 单次批量数据导入,最常用 | CSV、JSON(含 JSON Lines) |
/api/{db}/{table}/_stream_load/{label} | GET | 回查某次导入任务的状态与结果 | 返回 JSON |
/api/{db}/_txn_status | GET | 按 label 查事务是否已提交,做结果确认 | 返回 JSON |
| MySQL 协议端口 9030 | TCP | 交互式查询、建表、小批量 INSERT | 任意 MySQL 客户端 |
日常导入几乎只用第一条;后两条是排障和核对结果的利器,后面会用到。
五分钟跑通 Stream Load
这段最小示例能直接执行,建议照着敲一遍再往下看参数细节。
import requests endpoint = 'http://127.0.0.1:8030/api/db0/t_user/_stream_load' payload = '1,Alice\n2,Bo' options = { 'Content-Type': 'text/plain; charset=UTF-8', 'format': 'csv', 'column_separator': ',', 'Expect': '100-continue', } result = requests.put(endpoint, data=payload, headers=options, auth=('root', '')) print(result.status_code) print(result.json())这段代码做了什么:向 FE 的 8030 端口发一个 PUT 请求,把两行 CSV 文本当作导入体,format、column_separator等选项全部走 HTTP 头传递,最后打印响应。你会看到类似这样的 JSON:
{ "TxnId": 88102, "Label": "5c1e90aa-3d72-4f6b-9e04-2b8a71c4d93e", "Status": "Success", "Message": "OK", "NumberTotalRows": 2, "NumberLoadedRows": 2, "NumberFilteredRows": 0, "LoadBytes": 15, "LoadTimeMs": 43 }解读两个关键点:
- 为什么用 PUT:Stream Load 是一次"原子写"——要么整批数据全部可见,要么完全不可见。PUT 的语义就是"用这个请求体覆盖/落定某个资源状态",和导入的事务性正好吻合。另外客户端带上
Expect: 100-continue头,FE 会在真正接收数据前先用 100 响应确认参数合法,避免白传一个大 body。 - 认证怎么带:就是标准 HTTP Basic Auth,用户名密码和 MySQL 侧一致。requests 里传
auth=(user, pwd)即可,其他语言的写法见仓库示例。
注意Status才是最终结论,HTTP 200 只代表请求被受理;NumberFilteredRows大于 0 说明有行被过滤,要留意。
一份请求里的关键参数
参数全部通过请求头传递,下面这张表把"取什么值、为什么"一次讲清。
| 参数 | 说明与取值建议 |
|---|---|
Content-Type | 数据体编码,一般固定text/plain; charset=UTF-8 |
format | 数据格式,csv或json;JSON 模式可配合jsonpaths提取字段 |
column_separator | CSV 字段分隔符,默认逗号;数据里有引号转义时换成\t这类不可见字符更稳 |
columns | 指定导入列及顺序,如id,name;只导部分列或列序与表不一致时必写 |
label | 任务唯一标识,建议 UUID 或"业务前缀_批次号";不填则自动生成 |
Expect | 填100-continue,让 FE 先校验参数再收数据 |
label值得多说两句:它既是任务的身份证,也是幂等键。同一 label 重复提交,Doris 会拒绝并告诉你之前那次任务的状态,这正是后面"断点续传"技巧的基础。
多语言 SDK 怎么选
四种实现都在 samples/stream_load/ 下,各是一百行左右的可运行样例,没有额外依赖地狱。
| 语言 | 仓库内路径 | 实现特点 | 适用场景 |
|---|---|---|---|
| Python | DorisStreamLoad.py | 基于 requests,几十行写完,调试最方便 | 脚本、任务流、快速验证 |
| Go | doris_stream_load.go | 标准库 net/http,请求头里演示了columns表达式与jsonpaths | 高并发微服务、旁路采集器 |
| Java | DorisStreamLoad.java | Apache HttpClient,类结构清晰,附 label 冲突时的响应说明 | 企业内 Java 服务集成 |
| Rust | doris_stream_load.rs | reqwest + tokio 异步模型,认证头手动 Base64 拼法很直白 | 性能敏感、内存安全的网关/代理 |
一句话选型:图省事选 Python,跑在生产链路里选 Go 或 Java,做高性能边车选 Rust。
三个高频故障排查手册
导入报错时,九成问题落在这三格子里,按"现象 → 原因 → 处理"走一遍基本能自愈。
1. 认证失败:响应 401 或提示 authentication 错误
- 现象:HTTP 状态 401,或响应 JSON 里
Message提到认证不通过。 - 原因:用户名密码写错、客户端跨域重定向时 Basic 头被剥离、集群 conf/fe.conf 里
enable_http_auth的设置与你的预期不符。 - 处理:先用 MySQL 客户端验证同一组账号能否登录;确认认证头在整条请求链路上都保留;核对 fe.conf 中的开关配置。
2. 端口不通:请求挂起或连接被拒
- 现象:
Connection refused或读超时,请求长时间没返回。 - 原因:FE 的 8030 端口没放行;或者 FE 把请求 307 重定向到了负责该表的 BE,客户端到 BE 的 HTTP 端口(默认 8040)不通,重定向后卡死。
- 处理:
telnet <fe_host> 8030先验证入口;再确认客户端到各 BE 的 8040 端口可达;检查防火墙与安全组是否同时放行了这两段。
3. 字段数不匹配:行被批量过滤
- 现象:
Status为Partial Success或Fail,NumberFilteredRows明显偏大。 - 原因:CSV 实际列数与表结构不一致,或分隔符选错导致字段被切开、合并。
- 处理:用
columns头显式声明导入列及顺序(如columns: id,name);样本数据先跑几百行验证,确认NumberFilteredRows为 0 再放量。
把接口玩出花样(进阶)
🚀 基础流程跑通后,下面三招能让导入链路更工程化:
- label 幂等,天然断点续传:给每批数据生成固定 label(如
订单表_20260909_第03批),落库到本地记录。失败重试时沿用同一 label——已成功则返回Label Already Exists,直接跳过;未成功则重新提交。无需额外实现去重逻辑。 - TxnId 追踪进度:响应里的
TxnId是这次导入在集群中的事务号,把它记入日志后,可结合/api/{db}/_txn_status?label=xxx查询事务最终状态,做端到端的提交确认,避免"客户端以为成功、实际没落地"的模糊地带。 - 客户端预处理:脏数据别扔给服务端。类型转换、空值归一(空串转 NULL)、超长字段截断都在发送前做完,既省服务端过滤开销,也让
NumberFilteredRows真正反映意外问题。
写在最后
一个可以直接落地的建议:按你项目的主流语言,把 samples/stream_load/ 里的对应示例改造成内部工具,给 label 固定加业务前缀,并在每批导入后检查NumberFilteredRows——这三件事做到位,Stream Load 就能稳定地扛住日常批量写入。更多细节直接翻仓库里的示例源码,比任何文档都诚实。
【免费下载链接】dorisApache Doris is a real-time analytics and hybrid search database for AI agents.项目地址: https://gitcode.com/GitHub_Trending/doris/doris
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考