参考书目《Druid实时大数据分析原理与实践》
1.druid概览
Druid,中文名是德鲁伊。Druid是一个分布式的支持实时分析的数据存储系统,Druid的设计为分析而生,是一个分布式的数据分析平台。在处理数据的实时性、规模上相比传统OLAP系统有了显著提升。官网: http://druid.io 。Druid诞生于MetaMarkets公司(https://metamarkets.com/)。
Hadoop/Hive数据分析有个致命弱点就是速度,为了提升速度,很多公司都尝试过如下的查询架构:
很明显,相比于第4种架构,第5种直接对数据源进行流式处理,真可谓简单、直接。
MetaMarkets公司为了满足自身实时数据分析的需要,曾经尝试过第2、3种架构,但是无法解决下面2个问题:
- RDBMS查询速度太慢(Mysql等全表扫描大数据量时响应时间是个问题);
- 不支持灵活的查询分析能力(一般在第3种方案,需要按维度预计算、存储在Nosql/Hbase中,以提高速度。但是,维度如果很多就是灾难。Kylin就是这么做的....)
Druid的设计之初,确定了3个原则:
- 快速查询
- 水平扩展能力
- 实时分析
下面,简单介绍下Druid的基本概念:
1.数据格式:
Druid的每个数据集包含3个部分: 时间列、维度列、指标列。 这三个部分是必须具备的,下边是一个数据格式:
2.数据摄入:
包括2种摄入方式:实时摄入和批处理摄入。
3.数据查询
Druid原生查询采用JSON格式,通过HTTP传送,目前并不支持SQL(后边组件可能支持,例如PlyQL)。
数据分析是从数据变成信息、从信息变成知识、最后从知识变为智慧的过程。经常讨论的几个概念是 BI(商业智能) ,DM(数据挖掘)和OLAP(联机分析处理)。OLAP是一种建立数据系统的方法,核心是构建多维度的数据立方体,以维度、度量为基本概念,辅以元数据实现可以钻取、切片、切块等灵活、系统和直观的数据展现。
一般地,Druid、Pinot和Kylin是数据分析软件选型经常碰到的问题。Pinot设计规范,系统也比较复杂,但是因为开源时间短,社区支持能力弱于Druid。Druid设计轻巧,代码库更易懂,支持比较灵活的功能增强。Kylin最大的优势是支持SQL访问,可以兼容传统bi和报表工具,性能并不具优势。
2.druid架构
传统RDBMS为了提高查询速度,一般都会创建索引,那么在数据写入时,由于创建索引会消耗额外的性能。也就是说,无法做到同时保证数据摄入和数据查询性能。而Druid却可以实现,这得力于其独到的架构设计、DataSource和Segment数据结构以及系统的优秀设计和实现。
2.1 整体架构:
下图为Druid的架构图:
实时节点(Real-time Nodes):摄入实时数据,生成Segment文件。
历史节点(Historical Nodes):加载数据文件,支持查询。
查询节点(Broker Nodes):对外提供查询服务,同时从实时和历史节点查询数据并回调对方。
协调节点(Coordinator Nodes):负责历史节点的负载均衡,以及通过规则管理数据生命周期。
元数据库(Mysql): 存储元数据信息,例如Segment。
分布式协调(Zookeeper):为Druid集群提供一致性协调服务组件。
数据文件库(Deep Storage):存储Segment数据文件,并供历史节点下载。(可以是本地磁盘,或HDFS)
Druid本质上是一个分布式的时序数据库。
2.2 DataSource和Segment数据结构:
Druid的DataSource类似于RDBMS的Table,包含时间列、维度列、指标列(第一部分已介绍)。无论是实时消费还是批处理,druid基于DataSource结构存储数据。druid在数据存储时就可以对数据进行聚合是它的一大特点。
DataSource是逻辑概念,那Segment则是一个物理存储格式。数据横向切割:Druid将不同时间范围内的数据存储在不同的Segment块中。数据纵向切割:Segment也面向列进行数据压缩存储。
类似插件功能,Druid支持自身提供的pull-deps工具下载依赖到本地仓库,来扩展Druid的功能和支持(这里不展开了)。
2.3 实时结点:
实时结点通过firehose来消费实时数据,实时结点会通过Plumber模块生成segment数据文件。
Segment文件从制造到传播的过程如下:
- 实时节点产出Segment数据文件,并上传到DeepStorage中;
- Segment相关文件的元数据信息存放MetaStore里。
- Master节点(Coordinator Nodes)根据元数据信息,根据规则配置分配给符合条件的历史节点。
- 实时节点丢弃该Segment数据文件,并向集群声明不再提供该Segment数据文件的查询服务。