目前广为人知的Druid有两个,一个是阿里巴巴开源的Durid数据库连接池,一个是MetaMarkets开源的分布式、实时多维OLAP分析的数据处理系统。
这篇文章将介绍后者,即Apache Druid。由美国广告技术公司MetaMarkets公司2012年开源,孵化于Apache。
Druid 是一个分布式的、支持实时多维 OLAP 分析的数据处理系统。它既支持高速的数据实时摄入处理,也支持实时且灵活的多维数据分析查询。因此 Druid 最常用的场景就是大数据背景下、灵活快速的多维 OLAP 分析。 另外,Druid 还有一个关键的特点:它支持根据时间戳对数据进行预聚合摄入和聚合分析,因此也有用户经常在有时序数据处理分析的场景中用到它。
Druid是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分析。分析和存储系统,提供极具成本效益并且永远在线的实时数据摄取和任意数据处理。
为分析而设计——Druid是为OLAP工作流的探索性分析而构建。它支持各种filter、aggregator和查询类型,并为添加新功能提供了一个框架。用户已经利用Druid的基础设施开发了高级查询和直方图功能。
交互式查询——Druid的低延迟数据摄取架构允许事件在它们创建后毫秒内查询,因为Druid的查询延时通过只读取和扫描有必要的元素被优化。Aggregate和 filter没有坐等结果。
高可用性——Druid是用来支持需要一直在线的SaaS的实现。你的数据在系统更新时依然可用、可查询。规模的扩大和缩小不会造成数据丢失。
可伸缩——现有的Druid部署每天处理数十亿事件和TB级数据。Druid被设计成PB级别。
Druid主要是解决低延迟下实时数据摄入与查询的平台,本质是一个数据存储。数据存储格式对一款存储系统来说是最核心的组件,Druid 的数据格式是自定义的,以此保证了在海量数据下的亚秒级查询。
Druid有如下一些特性:
1. 亚秒响应的交互式查询,支持较高并发。
2. 支持实时导入,导入即可被查询,支持高并发导入。
3. 采用分布式 shared-nothing 的架构,可以扩展到PB级。
4. 支持聚合函数,count 和 sum,以及使用 JAVAscript 实现自定义 UDF。
5. 支持复杂的 Aggregator,近似查询的 Aggregator,例如 HyperLoglog 以及 Yahoo 开源的 DataSketches。
6. 支持Groupby,Select,Search查询。
7. 不支持大表之间的Join,但其 lookup 功能满足和维度表的 Join。
Druid为什么查询速度快?
数据的预聚合:Druid 可以按照给定的时间粒度和所有维度列,进行最细粒度的指标聚合运算,并加以保存为原始数据。
列式存储:对部分列进行查询时可以显著提高效率。
Bitmap 索引:利用位图对所有维度列构建索引,可以快速定位数据行。
mmap:通过内存映射文件的方式加快对于 Segment 的访问。
查询结果的中间缓存:支持对于查询级别和 Segment 级别的缓存。
Druid适合于以下场景:
插入频繁,但很少更新。
大多数查询都是聚合和报告性质的查询(group by查询)以及搜索和扫描查询。
查询延迟要求为100毫秒到几秒。
数据中有一个时间组件(Druid包括具体与时间相关的优化和设计选择)。
有多个表,但每次查询只能访问一个大的分布式表,或者查询可能会遇到多个较小的“查找”表。
有高基数数据列(例如URL,用户ID),需要对它们进行快速计数和排名。
希望从Kafka,HDFS,文件或对象存储(如Amazon S3)中加载数据。
Druid不适用于以下场景:
需要使用主键对现有记录进行低延迟更新。Druid支持流式插入,但不支持流式更新(使用后台批处理作业进行更新)。
需要构建一个离线报告系统,其中查询延迟不是很重要。
想做big joins(将一个大事实表连接到另一个大事实表),可能完成这些查询需要花费你几个小时。
如图所示,分为三种服务器类型:主服务器(Master)、查询服务器(Query)和数据服务器(Data)。
Master:运行Coordinator和Overlord进程,管理数据可用性和摄取。
Query:运行Broker和可选的Router进程,处理来自外部客户端的查询。
Data:运行Historical和MiddleManager进程,运行数据的采集以及存储所有历史查询数据负载。
Druid有若干不同类型的进程,简单描述如下:
Coordinator 进程:负责集群 Segment 的管理和发布,并确保 Segment 在 Historical 集群中的负载均衡。
Overlord 进程:负责接受任务、协调任务的分配、创建任务锁以及收集、返回任务运行状态给客户端;通过设置 druid.Coordinator.asOverlord.enabled 属性,Coordinator进程和Overlord进程可以作为单个组合进程运行。让 Coordinator 具备 Overlord 功能,这样可以减少一个组件的部署和运维。
Broker 进程:负责从客户端接收查询请求,并将查询请求转发给 Historical 节点和 MiddleManager 节点。Broker 节点需要感知 Segment 信息在集群上的分布。
Router 进程:是一个可选进程,可以将请求路由到Brokers、Coordinators和Overlords。
Historical 进程:主要负责加载索引文件,同时提供历史数据的查询服务。
MiddleManager 进程:主要是负责数据索引,生成索引文件,并把索引文件先发布到一个共享的存储系统里,如普遍采用的 HDFS 系统。
在架构图中,最下面的部分是外部依赖。除了内置的进程类型外,Druid同时有三个外部依赖,它们旨在利用现有的基础设施。
(1)Metadata Storage
存储关于Druid中的Metadata,规则数据、配置数据等,主要包含以下几张表:
druid_config(通常是空的),druid_rules(协作节点使用的一些规则信息,比如哪个segment从哪个node去load),druid_segments(存储每个segment的metadata信息)。
生产环境中可以使用MySQL。
(2)Zookeeper
分布式协调服务,用于节点管理和事件监控。
查询节点通过Zookeeper来感知实时节点和历史节点的存在,提供查询服务。
协调节点通过Zookeeper感知历史节点,实现负载均衡。
统治节点、协调节点的leader选举。
(2)Deep Storage
用于存储 Segment 文件供 Historical 节点下载。Deep Storage 不属于 Druid 内部组件,用户可根据系统规模来自定义配置。单节点可用本地磁盘,分布式可用 HDFS。
Druid的数据存储在DataSource中,DataSource 是一个逻辑概念,表示 Druid 的基本数据结构,可以理解为关系型数据库中的表。它包含时间、维度和指标三列。
时间(TimeStamp):表明每行数据的时间值,默认使用 UTC 时间格式且精确到毫秒级别。这个列是数据聚合与范围查询的重要维度。
维度(Dimension):标识数据行的各个类别信息。
指标(Metric):用于聚合计算的列,这些指标列通常是一些数字,主要操作包括 Count、Sum 和 Mean 等。
每一个数据源按照时间进行分段,当然你还可以选择其他属性进行分段。
每一个时间区间被称为一个"Chunk"。举个例子,如果以天分区,则一个Chunk为一天。在一个Chunk内,数据被分成一个或者多个"segments"。每个segment是一个单独的文件,它由数以百万的数据行构成。因为segment是组织在时间Chunk里的,所以按照时间曲线有助于理解segments。
这些segment是按照时间组织成的Chunk,所以在按照时间查询数据时,效率非常高。
segment 是 Druid 中数据的实际物理存储格式,Druid 正是通过 segment 实现了对数据的横纵向切割(Slice and Dice)操作:
横向:通过参数 segmentGranularity 的设置,将不同时间范围内的数据存储在不同的 segment 数据块中。这样在指定时间范围内查询时,可以不用扫全表。
纵向:即列式存储,对每个列进行切分并压缩,且利用 Bitmap 构建索引从而优化数据访问。
一个数据源刚开始由几个segments组成,一直扩展到几百几千甚至上百万个segments。每个segment的生命周期始于被MiddleManager创建,这个时候segment是可变的没有被提交的。一个segment的构建包含以下列出来的几个步骤,这种设计是为了满足一个可以支持压缩并可以被快速查询的文件格式。
转换成列式存储格式
利用bitmap建立索引
利用多种算法进行压缩
segments会周期性地提交。此时它会被写入deep storage,然后状态改为不可变的。随后它会被从MiddleManager移动到Historical进程中去。与此同时,关于这个segment的一个条目也会被写入元数据存储。这个条目是描述该segment的元数据,包含segment的schema、大小、以及它在deep storage上的存储位置。所有这些类似的条目都会被Coordinator用来寻找对应的数据是否在集群上是可用状态的。
Druid当前最新版本为0.20。下载链接:http://druid.apache.org/downloads.html
Druid 有着很成熟的用户群体,包括国内外的知名企业,国外的话当属 Airbnb,这家公司在内部大量使用 Druid 来做分析,包括他们开源的知名 BI 工具 Apache Superset,也在其中专门为 Druid 写了一套 Query Engine。国内公司像阿里、小米、58都在用。