【Doris基础】Apache Doris中的Fragment概念详解
目录
1.1 什么是Fragment
1.2 Fragment与MPP架构
2 Fragment的执行模型
2.1 Fragment的组成结构
2.2 Fragment的执行流程
3 Fragment的类型与拓扑结构
3.1 Fragment的三种基本类型
3.2 Fragment间的数据交换方式
4 Fragment的并行执行机制
4.1 实例化模型
4.2 数据本地化执行
4.3 流水线执行
5 Fragment的优化策略
5.1 分区裁剪(Partition Pruning)
5.2 列裁剪(Column Pruning)
5.3 谓词下推(Predicate Pushdown)
6 Fragment的调度过程
6.1 调度流程
6.2 调度策略
7 Fragment的监控与调优
7.1 关键监控指标
7.2 性能调优方法
8 总结
1.1 什么是Fragment
在Apache Doris的分布式查询执行模型中, Fragment(片段)是查询执行计划的基本调度单位。一个完整的查询执行计划会被拆分为多个Fragment,这些Fragment按照特定的拓扑结构组织起来,共同完成查询的执行。
核心特性:
- 并行执行单元:每个Fragment可以包含多个并行的执行实例
- 数据流边界:Fragment之间通过数据流进行通信
- 调度粒度:Doris调度器以Fragment为单位进行任务调度
1.2 Fragment与MPP架构
Doris采用MPP(Massively Parallel Processing)架构,Fragment正是实现并行计算的关键抽象:

2 Fragment的执行模型
2.1 Fragment的组成结构
一个典型的Fragment包含以下组件:
- PlanNode树:由多个算子组成的执行逻辑
- 数据源:扫描节点或接收节点
- 数据汇:发送节点或输出节点
- 执行参数:并行度、内存限制等

2.2 Fragment的执行流程
- Doris中Fragment的执行遵循以下生命周期:

阶段说明:
- 初始化:Coordinator创建Fragment并设置执行参数
- 实例分发:将Fragment实例分配到多个BE节点
- 执行准备:BE节点准备执行所需的资源
- 开始执行:并行执行Fragment实例
- 数据交换:Fragment间通过Exchange节点传输数据
- 状态汇报:BE节点向Coordinator汇报执行状态
- 结束清理:释放Fragment占用的资源
3 Fragment的类型与拓扑结构
3.1 Fragment的三种基本类型
- 扫描Fragment(Scan Fragment)

特点:
- 包含表的扫描操作
- 通常位于执行计划的最底层
- 每个分片对应一个实例
- 计算Fragment(Compute Fragment)

特点:
- 不直接访问存储
- 接收上游数据并进行计算
- 可能包含复杂的计算逻辑
- 汇聚Fragment(Sink Fragment)

特点:
- 通常位于执行计划最顶层
- 负责最终结果的汇聚和输出
- 只有一个执行实例
3.2 Fragment间的数据交换方式
- 广播(Broadcast)

- 分区(Partition)

- 单播(Singleton)

4 Fragment的并行执行机制
4.1 实例化模型
- 每个Fragment会在多个BE节点上实例化为多个执行实例:

关键参数:
- parallel_fragment_exec_instance_num:控制每个BE上的实例数
- dop:Degree of Parallelism,并行度
4.2 数据本地化执行
- Doris会尽量将Fragment实例调度到数据所在的BE节点:

4.3 流水线执行
- Fragment实例内部采用流水线执行模型:

5 Fragment的优化策略
5.1 分区裁剪(Partition Pruning)

效果:只扫描相关的分区Fragment
5.2 列裁剪(Column Pruning)

效果:减少Fragment间传输的数据量
5.3 谓词下推(Predicate Pushdown)

效果:尽早过滤数据,减少计算量
6 Fragment的调度过程
6.1 调度流程

6.2 调度策略
- 数据本地化优先:优先选择数据所在的BE节点
- 负载均衡:考虑各BE的当前负载
- 资源限制:检查内存、CPU等资源限制
7 Fragment的监控与调优
7.1 关键监控指标
指标名称 | 说明 |
fragment_count | Fragment数量 |
instance_count | 实例总数 |
fragment_duration | Fragment执行耗时 |
exchange_data_size | 数据交换量 |
7.2 性能调优方法
- 调整并行度:
SET parallel_fragment_exec_instance_num = 4;
- 优化内存限制:
SET exec_mem_limit = 8589934592; -- 8GB
- 控制实例数:
SET parallel_pipeline_task_num = 16;
8 总结
Fragment设计总结
- 分布式执行的基础单元:实现了查询的分布式并行执行
- 灵活的拓扑结构:支持复杂查询的高效执行
- 资源隔离的边界:便于资源控制和调度
通过深入理解Fragment的概念和执行机制,可以更好地优化Doris查询性能,构建高效的实时数据分析系统。