申请试用
HOT
登录
注册
 
账号已存在
第三讲 数据导入流程
Apache Doris
/
发布于
/
255
人观看

《 Apache Doris 源码阅读与解析》系列直播活动旨在帮助 Apache Doris 社区的开发者或者有意向参与 Apache Doris 社区建设的小伙伴们,可以更快熟悉 Apache Doris 代码的组织结构和一些主要流程的实现原理以及代码位置,以便于各位小伙伴们能够快速上手,参与到开发工作中来。

本期内容为《第三讲:数据的写入流程》,这一讲承接第二讲,主要介绍导入作业将数据分发到对应的 BE 节点后,数据是如何一步一步写入到磁盘的:

  1. 数据分发的分区分桶规则
  2. delta writer -> memtable -> rowset -> segment -> page 的写入流程。
展开查看详情

1 .Apache Doris 源码阅读与解析 第三讲:数据写入流程 杨政国

2 .课程介绍 • Doris 底层存储格式 • 数据分发的分区分桶规则 • delta writer -> memtable -> rowset -> segment -> page 的写入流程

3 . 01 Doris存储结构设计

4 .基础概念 • Partition • Bucket(Tablet) • Rowset • Segment

5 .基础概念 • Partition • Bucket(Tablet) • Rowset • Segment

6 . 数据模型 • 列式存储,Key-Value列;Key列全局有序,查询快速定位; • 全Key唯一,相同key列其Value列合并(SUM,MIN,MAX,REPLACE) • 每次导入是一个Delta,通过Compaction来合并 基础数据 + 增量数据 = 全量数据 Time Id Country Clicks Cost Time Id Country Clicks Cost Time Id Country Clicks Cost 2013/12/31 1 US 10 32 2014/01/01 1 US 5 3 2013/12/31 1 US 10 32 2014/01/01 2 UK 40 20 2014/01/01 2 UK 60 30 2014/01/01 1 US +5 +3 2014/01/01 2 US 150 80 2014/01/01 2 US 50 20 2014/01/01 2 UK 40+60 20+30 2014/01/01 2 US 150+50 80+20

7 .存储目录结构 • 通过storage_root_path 进行配置 • 按照大小进行分割,默认为256MB • ${shard}/${tablet_id}/${schema_hash} /${rowset_id}_${segment_id}.dat

8 .Segment文件结构 • 类Parquet的列存格式 • 数据区、索引区、元数据区 • Page:编码和压缩的基本单位

9 .Data Region • 按列存储 • 每一列多个page • page 数据采用LZ4F 压缩

10 .Data Region - page • Data • Page Footer

11 .Data Region-数据压缩 TINYINT/SMALLINT/INT/BIGINT/LARGEIN BIT_SHUFFLE T • 类型不同编码不同 FLOAT/DOUBLE/DECIMAL BIT_SHUFFLE • LZ4F格式对数据进行压缩 CHAR/VARCHAR DICT BOOL RLE DATE/DATETIME BIT_SHUFFLE HLL/OBJECT PLAIN

12 .Index Region • 列粒度进行加载 • 通过多种索引得到具体行号 • 通过Ordinal Index获取page • 读取page信息

13 .Index Region - Ordinal Index

14 .Index Region - ShortKeyIndex

15 .Index Region - ZoneMap

16 .Index Region - BloomFilter

17 .Index Region – BitMap Index

18 .索引的查询流程

19 .Footer • SegmentFooterPB:定义文件的元数 据信息 • 4个字节的FooterPB内容的 checksum • 4个字节的FileFooterPB消息长度, 用于读取FileFooterPB • 8个字节的MAGIC CODE

20 . 02 数据分发规则

21 .DeltaWriter Partition /bucket NodeC hinnel OlapTable Partition IndexC NodeC DeltaW tablet Sink send /bucket hinnel add_row hinnel add_row riter NodeC Partition hinnel /bucket

22 . 03 写入流程

23 .写入流程

24 .DeltaWriter • init() • 开启事务 • 创建 RowsetWriterContext • 创建 flush handler

25 .DeltaWriter • write() • 将数据插入到memTable

26 .segment文件写入流程 2 1 PageIO

27 .MemTable • insert

28 .MemTable • flush

29 .BetaRowsetWriter • add_row • flush • add_rowset

0 点赞
0 收藏
31下载
确认
3秒后跳转登录页面
去登陆