Druid 初次学习

本贴最后更新于 1935 天前,其中的信息可能已经时移俗易

[TOC]

数据仓库基本概念

一、OLTP 和 OLAP

OLTP T 为 transaction(事务)
OLAP A 为 analytical(分析)

特性 OLTP OLAP
功能 日常操作 数据需求、决策支持
面向 事务 分析
DB 设计 基于 E-R,面向应用 星形/雪花,面向主题
数据 当前的,确保最新 历史的,跨时间维护
汇总 原始的,高度详细 汇总的,统一的
访问 读/写 绝大部分是读操作
关注 数据进入 信息输出
DB 规模 GB TB
度量(衡量性能) 事务吞吐量 查询吞吐量、响应时间

E-R

为什么不直接在操作型数据库上进行联机分析处理?MySQL

  1. 性能

操作型数据库使用的索引,是为了检索特定的记录,优化定制的查询;而数据仓库的查询通常是复杂的,涉及大量数据在汇总级的计算,可能需要特殊的基于多维视图的数据组织、存取方法和实现。

  1. 吞吐量

操作型数据库支持事务,需要并发和恢复机制,例如加锁和记日志,以此来确保一致性。而 OLAP 查询只需要对汇总和聚集数据进行只读访问。如果将这些机制用于 OLAP 操作,会危害并行事务的运行,大大降低操作型数据库的吞吐量。

二、数据立方体

由维和指标定义的,允许以多维对数据建模和观察的数据模型。

1.刚开始数据展示为一张数据表

2-D 数据表

如图为公司销售数据的 2-D 视图
维度为 season 和 product
指标为销量

2.后来数据表增加了 country 维度,那么就需要立方体表示

QQ20181205200949png

如图为公司销售数据的 3-D 视图

维度为 season、product、country
指标为销量

3.后来又增加了更多的维度,这个时候需要多为数据模型

三、多维数据模型

星形模式

QQ20181205201419png

数据仓库 包括一个大的中心表(事实表),包含大量数据且不冗余,一组小的附属表(维表),这种模式很像星光四射,故称为星形模式。

雪花模式

QQ20181205201644png

雪花模式是星形模式的变种,其中某些维表被规范化,把数据进一步分解到附加的表中,类似于雪花的形状。

四、常见的 OLAP 操作

1.上卷

维度粗化

2.下钻

维度细化

3.切片和切块

聚合
切片 对一个维度进行聚合
切块 对多个维度进行聚合

4.转轴

1png

Druid

一、叫什么

中文简称"得鲁伊"

二、是什么

Druid 是一个开源的实时 OLAP 系统,可以对超大规模数据提供亚秒级查询

三、有什么 特点

1.列式存储
2.倒排索引(基于 bitmap 实现),高效过滤和聚合
3.支持近似计算(节省内存)
4.支持实时或批量摄入

1.列式存储

行式存储的每一条记录保存在一起,更容易 insert/update

行式存储 f

列式存储只有涉及到的列,减少大量 I/O 操作数,更利于查询。由于每个块的数据类型相同,可以使用专门的压缩方案,进一步减少磁盘空间和 I/O

列式存储

2.倒排索引

B 树:B 树最大的优势是插入和查找效率很高,如果用 B 树存储要统计的数据,可以快速判断新来的数据是否已经存在,并快速将元素插入 B 树。要计算基数值,只需要计算 B 树的节点个数。 将 B 树结构维护到内存中,可以快速统计和计算,但依然存在问题,B 树结构只是加快了查找和插入效率,并没有节省存储内存。例如要同时统计几万个链接的 UV,每个链接的访问量都很大,如果把这些数据都维护到内存中,实现的难度非常大。

bitmap:bitmap 可以理解为通过一个 bit 数组来存储特定数据的一种数据结构,每一个 bit 位都能独立包含信息,bit 是数据的最小存储单位,因此能大量节省空间,也可以将整个 bit 数据一次性 load 到内存计算。 如果定义一个很大的 bit 数组,基数统计中每一个元素对应到 bit 数组的其中一位,例如 bit 数组 00100010 代表实际数组[2,6]。新加入一个元素,需要将已有的 bit 数组和新加入的数字做按位或计算。bitmap 中 1 的数量就是集合的基数值。bitmap 有一个很明显的优势是可以轻松合并多个统计结果,只需要对多个结果求异或就可以。也可以大大减少存储内存,可以做个简单的计算,如果要统计 1 亿个数据的某个值多少行,大约需要内存: 100000000/8/1024/1024 \approx≈ 12M 如果用 32bit 的 int 代表每个统计数据,大约需要内存:32*100000000/8/1024/1024 \approx≈ 381M

例如

日期 国家 型号 价格
20181101 cn 小米 8 1999
20181101 in 小米 8 1999
20181102 in 小米 mix2s 2999
20181103 in 小米电视 4A 3999
20181104 cn 小米 mix 2s 2999

排序索引,以国家举例

'in' -> [2,3,5] -> [0][1][1][0][1]
'cn' -> [1,4] -> [1][0][0][1][0]

查询印度或中国

country = 'in' or country = 'cn';

本质计算

[0][1][1][0][1] OR [1][0][0][1][0] = [1][1][1][1][1]

3.近似计算

大数据场景下,count distinct,也就是统计一个对象的基数值,需要耗费大量的内存,所以 druid 使用 HyperLogLog 算法(精确度大于 98.5%)近似计算,可以看:http://druid.io/blog/2012/05/04/fast-cheap-and-98-right-cardinality-estimation-for-big-data.html

ps: 不管数据量多少,都只是近似计算 通过精度的损失换取内存空间

4.支持实时或批量摄入

实时 主要是流失计算
而批量摄入 这是批量数据插入更新

Druid 通过预聚合方式处理海量数据并构建索引,快速的提供实时数据 OLAP 分析功能。

方案 优势 劣势
MySQL 1、具有完备的事务功能,可对数据进行更新
2、支持 SQL,开发成本较低
1、单机数据量千万左右,无法支撑大规模数据
2、横向扩展(例如 mycat)成本大
ElasticSearch 1、可以快速支持横向扩展
2、Term 查询很快时,查询延迟在 20ms 以内
1、没有原生的 SQL 支持,有一定的学习成本
2、聚合运算时性能下降明显
Druid 1、快速查询
2、可以支撑大规模数据集
3、高效的过滤和聚合
4、实时摄入
5、支持 SQL
1、预聚合之后,无法查询明细数据
2、不支持 join 操作
3、不支持数据修改(Append-only),只能以 segment 为单位替换
HIVE 1、支持 SQL
2、支持多种数据格式(文本、ORCFile、Parquet)
3、可以支撑大规模数据集
1、并发低
2、MR,Spark 的方式查询速度一般十分慢

实现实时计算 主要是预聚合

例如

1.原始数据:

{country:’cn’,date:’20181128’,sale_price:20.99}
{country:’cn’,date:’20181103’,sale_price:21.99}
{country:’in’,date:’20181102’,sale_price:0.01}
{country:’in’,date:’20181112’,sale_price:0.02}
{country:’cn’,date:’20181106’,sale_price:20.99}

2.维度 country 指标(sale_price),count()
预聚合

3.聚合后的数据格式

country:’cn’,sale_price: 63.97,count:3}
{country:’in’,sale_price:0.03,count:2}

维度越多,维度基数越大,计算的复杂度越高

四、Druid 在数据架构组角色

Druid 在数据架构组的角色

五、注意事项

不允许使用 select *
减少 SELECT IN 里面的参数
维度不能太多,且维度基数不能超过 1000

  • Druid
    20 引用 • 15 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    529 引用 • 3527 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...