CodeWalk

Doris Broker Load大规模数据导入的断点续传与限速

作者:专业代码师 · 2026-05-30 12:55

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避免超时中断