|NO.Z.00009|——————————|BigDataEnd|——|Hadoop&OLAP_Druid.V09|——|Druid.v09|架构|数据存储|
一、数据存储
### --- 数据存储
~~~ Druid中的数据存储在被称为DataSource中,DataSource类似RDBMS中的 Table
~~~ 每个DataSource按照时间划分,
~~~ 每个时间范围称为一个Chunk(比如按天分区,则一个chunk为一天)
~~~ 在Chunk中数据被分为一个或多个Segment
~~~ Segment是数据实际存储结构,Datasource、Chunk只是一个逻辑概念
~~~ Segment是按照时间组织成的Chunk,所以在按照时间查询数据时,效率非常高
~~~ 每个Segment都是一个单独的文件,通常包含几百万行数据

### --- 数据分区:
~~~ Druid处理的是事件数据,每条数据都会带有一个时间戳,可以使用时间进行分区
~~~ 上图指定了分区粒度为为天,那么每天的数据都会被单独存储和查询
~~~ # Segment内部存储结构
~~~ Druid采用列式存储,每列数据都是在独立的结构中存储
~~~ # Segment中的数据类型主要分为三种
~~~ 时间戳。每一行数据,都必须有一个timestamp,Druid一定会基于时间戳来分片
~~~ 维度列。用来过滤filter或者组合groupby的列,通常是string、float、double、int类型
~~~ 指标列。用来进行聚合计算的列,指定的聚合函数 sum、average 等

### --- MiddleManager节点接受到 ingestion 的任务之后,开始创建Segment:
~~~ 转换成列存储格式
~~~ 用bitmap来建立索引(对所有的dimension列建立索引)
~~~ 使用各种压缩算法:
~~~ 所有的列使用LZ4压缩
~~~ 所有的字符串列采用字典编码/标识以达到最小化存储
~~~ 对位图索引使用位图压
~~~ Segment创建完成之后,Segment文件就是不可更改的,
~~~ 被写入到深度存储(目的是为了防止MiddleManager节点宕机后,Segment的丢失)。
~~~ 然后Segment会加载到Historical节点,Historical节点可以直接加载到内存中。
~~~ 同时,metadata store 也会记录下这个新创建的Segment的信息,
~~~ 如结构,尺寸,深度存储的位置等等。Coordinator节点需要这些元数据来协调数据的查找。
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv024-druid
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」