- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 视频嵌入链接 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
第三讲 数据导入流程
《 Apache Doris 源码阅读与解析》系列直播活动旨在帮助 Apache Doris 社区的开发者或者有意向参与 Apache Doris 社区建设的小伙伴们,可以更快熟悉 Apache Doris 代码的组织结构和一些主要流程的实现原理以及代码位置,以便于各位小伙伴们能够快速上手,参与到开发工作中来。
本期内容为《第三讲:数据的写入流程》,这一讲承接第二讲,主要介绍导入作业将数据分发到对应的 BE 节点后,数据是如何一步一步写入到磁盘的:
- 数据分发的分区分桶规则
- 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