介绍
Druid是一个快速的列式分布式的支持实时分析的数据存储系统。它在处理PB级数据、毫秒级查询、数据实时处理方面,比传统的OLAP系统有了显著的性能改进。
注意:阿里巴巴也曾创建过一个开源项目叫作Druid(简称阿里Druid),它是一个数据库连接池的项目。阿里Druid和本文讨论的Druid没有任何关系,它们解决完全不同的问题。
特点
- 列式存储:Druid面向列存储,只需要加载特定查询所需要的列,查询速度快。
- 可扩展的分布式系统:Druid通常部署在数十到数百台集群中,提供数百万条每秒的摄取率,保留数百万条记录,以及亚秒级到几秒钟的查询延迟。
- 大规模的并行处理:Druid可以在整个集群中进行大规模的并行查询。
- 实时或批量摄取
- 自愈,自平衡,易操作:集群扩展或缩小,只需添加或删除服务器,集群将在后台自动重新平衡,无需停机。
- 数据进行了有效的预聚合或预计算,查询速度快。
- 数据的结果应用了Bitmap压缩算法。
应用场景
- 适用于清洗好的记录实时录入,不需要更新操作
- 适用于支持宽表,不用join的方式
- 适用于可以总结出基础的统计指标
- 适用于实时性要求高的场景
- 适用于对数据质量敏感度不高的场景
和其他技术对比
- Druid:是一个实时处理时序数据的OLAP数据库,它的索引首先按照时间分片,查询的时候也是按照时间线去路由索引。
- Kylin:核心是Cube,Cube是一种预计算技术,预先对数据作多维索引,查询时只扫描索引而不访问原始数据从而提速。
- Presto:它没有使用MapReduce,大部分场景下比Hive快一个数量级,其中的关键是所有的处理都在内存中完成。
- Impala:基于内存运算,速度快,支持的数据源没有Presto多。
- Spark SQL:基于Spark平台上的一个OLAP框架,基本思路是增加机器来并行计算,从而提高查询速度。
- ES:最大的特点是使用了倒排索引解决索引问题。根据研究,ES在数据获取和聚集用的资源比在Druid高。
- 框架选型:
(1)从超大数据的查询效率来看:
Druid > Kylin > Presto > Spark SQL
(2)从支持的数据源种类来讲:
Presto > Spark SQL > Kylin > Druid
原理
架构和组件
- 组成上主要分4个部分:MasterServers、QueryServers、DataServers、ExternalDependancies。
- MasterServers主要是两个组件:coordinators和overlords。coordinators协调节点,主要负责historicals历史节点的数据负载平衡,以及通过规则管理数据的生命周期。overlords统治者节点,主要负责监视middleManagers进程,是数据摄入Druid的控制器,他负责将提取任务分配给middleManagers并协调segment发布。
- QueryServers主要包含两个组件:routers和brokers。routers路由器进程是可选进程,可以将请求路由到brokers,coordinators和overlords。brokers节点接收查询请求,并将请求转发给historical和middlemanagers。当broker收到结果后,合并结果并缓存,返回给调用者。
- DataServers主要包含两个组件:middleManagers和historicals。middleManagers中间管理者节点,主要负责摄入数据,生成segment数据文件。将segment保存在deepStorage中。historicals历史节点,主要负责加载已生成好的数据文件,供数据查询。historical是核心节点,因为它承担了大部分的segment的查询。
- ExternalDependencies主要包含三个组件:zookeeper、metadataStorage、deepStorage。zookeeper是整个集群的协调者,默认使用Druid内置的zk,也可以修改zk地址使用外部自己部署的zk集群。metadataStorage元数据存储默认使用内置的derby,建议修改为外部的mysql或者postgre来存储。deepStorage深度存储默认使用本地文件系统,建议修改为hdfs。
数据结构(Datasource + Segment)
Druid的DataSource相当于关系型数据库中的表(Table)。DataSource的结构包括:
时间列:表明每行数据的时间值,默认使用 UTC时间格式且精确到毫秒级别。
维度列:维度来自于OLAP的概念,用来标识数据行的各个类别信息。
指标列:是用于聚合和计算的列。通常是一些数字,计算操作通常包括Count、Sum等。
无论是实时数据消费还是批量数据处理,Druid在基于DataSource结构存储数据时即可选择对任意的指标列进行聚合操作。该聚合操作主要基于维度列与时间范围两方面的情况。
Druid在数据存储时便可对数据进行聚合操作是其一大特点,该特点使得Druid不仅能够节省存储空间,而且能够提高聚合查询的效率。
DataSource是一个逻辑概念,Segment是数据的实际物理存储格式。Druid将不同时间范围内的数据存储在不同的Segment数据块中,这便是所谓的数据横向切割。按照时间横向切割数据,避免了全表查询,极大的提高了效率
在Segment中,也采用面向列进行数据压缩存储(Bitmap压缩技术),这便是所谓的数据纵向切割。
部署
官网
安装推荐Imply方式,Imply方式出了提供druid组件,还有图形化、报表等功能。下载imply安装包需要提交邮箱等信息,任意填写即可下载到tar包,本次部署使用imply-3.4版本。
单机部署
- 下载tar包,上传服务器,解压
tar -xzf imply-3.4.tar.gz
cd imply-3.4
- 使用本地存储、默认元数据存储derby,自带zookeeper启动
nohup bin/supervise -c conf/supervise/quickstart.conf > logs/quickstart.log 2>&1 &
#说明:每启动一个服务均会打印出一条日志。可以通过var/sv/xxx/current查看服务启动时的日志信息
- 在页面查看:端口9095