Doris Broker Load大规模数据导入的断点续传与限速
Doris Broker Load导入TB级HDFS数据时,如何实现断点续传和限速?请解释Broker Load的Task切片机制(ETL阶段/LOAD阶段)、Label去重实现幂等导入、以及通过load_parallelism和load_mem_limit控制并发和内存。给出一个从HDFS导入100GB Parquet文件的Broker Load脚本,包含超时设置和失败重试策略。
回答
专业代码师
Doris Broker Load断点续传与限速:
1. Task切片机制:
Broker Load将导入任务分为两个阶段:
ETL阶段(数据预读取):
- Broker读取HDFS文件列表,按文件大小切片
- 每个切片生成一个Task
LOAD阶段(数据写入):
- BE从Broker拉取数据
- 多线程并行写入
2. Label去重(幂等导入):
LOAD LABEL my_db.my_load_20250525_001 -- 唯一Label
(
DATA INFILE("hdfs://namenode:8020/data/orders/20250525/*.parquet")
INTO TABLE orders
FORMAT AS "parquet"
(order_id, user_id, amount, event_time)
SET (
amount = amount * 100 -- 单位转换
)
)
WITH BROKER hdfs (
"fs.defaultFS" = "hdfs://namenode:8020",
"hadoop.username" = "doris"
)
PROPERTIES (
"timeout" = "14400", -- 4小时超时
"max_filter_ratio" = "0.01", -- 允许1%错误率
"load_parallelism" = "8", -- 并行度
"load_mem_limit" = "4096", -- 每BE内存上限(MB)
"send_batch_parallelism" = "4"
);
3. 断点续传原理:
- 导入过程中如果失败(如BE宕机),Label状态不变(PENDING/LOADING)
- 重试时Doris检查Label是否已存在:
- 如果Label已存在且状态为FINISHED → 跳过(去重)
- 如果Label已存在且状态为LOADING/CANCELLED → 继续执行或重新执行
- 已写入成功的数据不会重复写入
4. 进度查看与重试:
-- 查看导入进度
SHOW LOAD WHERE LABEL = 'my_load_20250525_001';
-- 关键字段:
-- Progress: 2/3 (已处理2个文件,共3个)
-- State: LOADING
-- EtlInfo: rowsRead=5000000, rowsSent=4990000, errorRows=10000
-- 取消后重试
CANCEL LOAD WHERE LABEL = 'my_load_20250525_001';
-- 重新提交相同Label(自动去重)
5. 限速与并发控制:
# 参数调优
load_parallelism: 12 # 增大并行加快速度
load_mem_limit: 8192 # 增大内存(8GB/BE)
timeout: 28800 # 8小时超时(TB级别)
send_batch_parallelism: 8 # 发送批次并行
6. 最佳实践:
- 大文件(>1GB)Broker Load自动分片
- 小文件过多时,建议先合并再导入
- 设置合理的
timeout避免超时中断