Apache Druid 高性能的实时分析型数据库

目前广为人知的Druid有两个 , 一个是阿里巴巴开源的Durid数据库连接池 , 一个是MetaMarkets开源的分布式、实时多维OLAP分析的数据处理系统 。
这篇文章将介绍后者 , 即Apache Druid 。由美国广告技术公司MetaMarkets公司2012年开源 , 孵化于Apache 。
一、Apache Druid 是什么?Druid 是一个分布式的、支持实时多维 OLAP 分析的数据处理系统 。它既支持高速的数据实时摄入处理 , 也支持实时且灵活的多维数据分析查询 。因此 Druid 最常用的场景就是大数据背景下、灵活快速的多维 OLAP 分析 。另外 , Druid 还有一个关键的特点:它支持根据时间戳对数据进行预聚合摄入和聚合分析 , 因此也有用户经常在有时序数据处理分析的场景中用到它 。

Apache Druid 高性能的实时分析型数据库

文章插图
 
二、Apache 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使用场景Druid适合于以下场景:
插入频繁 , 但很少更新 。
大多数查询都是聚合和报告性质的查询(group by查询)以及搜索和扫描查询 。
查询延迟要求为100毫秒到几秒 。
数据中有一个时间组件(Druid包括具体与时间相关的优化和设计选择) 。
有多个表 , 但每次查询只能访问一个大的分布式表 , 或者查询可能会遇到多个较小的“查找”表 。
有高基数数据列(例如URL , 用户ID) , 需要对它们进行快速计数和排名 。
希望从Kafka , HDFS , 文件或对象存储(如Amazon S3)中加载数据 。
 
Druid不适用于以下场景:
需要使用主键对现有记录进行低延迟更新 。Druid支持流式插入 , 但不支持流式更新(使用后台批处理作业进行更新) 。
需要构建一个离线报告系统 , 其中查询延迟不是很重要 。
想做big joins(将一个大事实表连接到另一个大事实表) , 可能完成这些查询需要花费你几个小时 。


推荐阅读