【Druid】(三)Apache Druid 的数据结构1

简介: 【Druid】(三)Apache Druid 的数据结构1

文章目录


一、前言


二、DataSource 结构

2.1 数据结构(维度列)

2.2 结构说明


三、Segment 结构

3.1 小总结


一、前言


与Druid 架构相辅相成的是其基于DataSource 与Segment 的数据结构,它们共同成就了Druid 的高性能优势。


二、DataSource 结构


若与传统的关系型数据库管理系统( RDBMS)做比较,Druid 的DataSource 可以理解为 RDBMS 中的表(Table)。DataSource 的结构包含以下几个方面。


时间列( TimeStamp):表明每行数据的时间值,默认使用UTC 时间格式且精确到毫秒级别。这个列是数据聚合与范围查询的重要维度。


维度列(Dimension):维度来自于OLAP 的概念,用来标识数据行的各个类别信息,参与事件过滤。


指标列( Metric):指标对应于OLAP 概念中的Fact,是用于聚合和计算的列。这些指标列通常是一些数字,计算操作通常包括Count、Sum 和Mean 等。


DataSource 结构 结构如图所示:


无论是实时数据消费还是批量数据处理, Druid 在基于DataSource 结构存储数据时即可选择对任意的指标列进行聚合( RollUp)操作。该聚合操作主要基于维度列与时间范围两方面的情况。


Druid读取数据的入口并不会直接存储原始数据, 而是使用Roll-up这种first-level聚合操作压缩原始数据。


下图显示的是执行聚合操作后DataSource 的数据情况。


相对于其他时序数据库, Druid 在数据存储时便可对数据进行聚合操作是其一大特点,该特点使得Druid 不仅能够节省存储空间,而且能够提高聚合查询的效率。


用SQL表示类似于对时间撮和所有维度列进行分组,并以原始的指标列做常用的聚合操作。


GROUP BY timestamp, publisher, advertiser, gender, country
  :: impressions = COUNT(1),  clicks = SUM(click),  revenue = SUM(price)

为什么不存原始数据? 因为原始数据量可能非常大,对于广告的场景,一秒钟的点击数是以千万计数。 如果能够在读取数据的同时就进行一点聚合运算,就可以大大减少数据量的存储,这种方式的缺点是不能查询单条事件,也就是你无法查到每条事件具体的click和price值了。


由于后面的查询都将以上面的查询为基础,所以Roll-up的结果一定要能满足查询的需求。通常count和sum就足够了,因此Rollup的粒度是你能查询的数据的最小时间单位。 假设每隔1秒Rollup一次,后面的查询你最小只能以一秒为单位,不能查询一毫秒的事件,默认的粒度单位是ms。


2.1 数据结构(维度列)


维度列因为要支持过滤和分组,每一个维度列的数据结构包含了三部分:


  • 值到ID的Map映射
  • 列的值列表,存储的是上一步对应的ID
  • 倒排索引


示例进行说明:


代表这一维度列的数据结构如下:


1: Dictionary that encodes column values
  {
    "Justin Bieber": 0,
    "Ke$ha":         1
  }
2: Column data
  [0,
   0,
   1,
   1]
3: Bitmaps - one for each unique value of the column
  value="Justin Bieber": [1,1,0,0]
  value="Ke$ha":         [0,0,1,1]


注意:在最坏情况下前面两种会随着数据量的大小而线性增长. 而BitMap的大小则等于数据量大小 * 列的个数。


目录
相关文章
|
2月前
|
存储 分布式计算 druid
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(一)
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(一)
40 1
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(一)
|
2月前
|
消息中间件 存储 druid
大数据-156 Apache Druid 案例实战 Scala Kafka 订单统计
大数据-156 Apache Druid 案例实战 Scala Kafka 订单统计
42 3
|
2月前
|
存储 分布式计算 druid
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
59 3
|
2月前
|
消息中间件 分布式计算 druid
大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进
大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进
45 2
|
2月前
|
消息中间件 druid 大数据
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(二)
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(二)
33 2
|
2月前
|
消息中间件 分布式计算 druid
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(二)
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(二)
42 2
|
2月前
|
消息中间件 分布式计算 druid
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(一)
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(一)
56 1
|
24天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
115 9
|
15天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
22 1
|
2天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
20 5