Apache Druid(一)基本介绍
一、什么是Druid
Apache Druid™ 是目前非常流行的高性能的,分布式列存储的 OLAP 框架(准确来说是 MOLAP)。美国广告技术公司MetaMarkets 于2011 年创建了Druid 项目,并且于2012 年开源了Druid 项目。Druid设计之初的想法就是为分析而生,它在处理数据的规模、数据处理的实时性方面,比传统的OLAP 系统有了显著的性能改进,而且拥抱主流的开源生态,包括Hadoop 等。多年以来,Druid 一直是非常活跃的开源项目。
Druid 的官方网站是 http://druid.io。
另外,阿里巴巴也曾创建过一个开源项目叫作Druid(简称阿里Druid),它是一个数据库连接池的项目。阿里Druid 和本问讨论的Druid 没有任何关系,它们解决完全不同的问题。
另外,我们前面提到的:Druid是一个实时多维OLAP分析的数据处理系统。但是OLAP分析又分为「关系型联机分析处理」(ROLAP)、「多维联机分析处理」(MOLAP)两种。简单来说MOLAP需要数据预计算好为一个多维数组,典型的方式是Cube。而ROLAP就是数据本身什么样,就是什么样,通过MPP提高分布式计算能力。
Druid 走的就是 MOLAP。可以快速(实时)访问大量的、很少变化的数据的系统。并被设计为,在面对代码部署、机器故障和生产系统的其他可能性问题时,依旧能 100% 地正常提供服务。
二、Druid 的三个设计原则
「快速查询(Fast Query)」:部分数据的聚合(Partial Aggregate)+内存化(In-emory)+索引(Index)。 「水平扩展能力(Horizontal Scalability)」:分布式数据(Distributed Data)+ 并行化查询(Parallelizable Query)。 「实时分析(Realtime Analytics)」:不可变的过去,只追加的未来(Immutable Past,Append-Only Future)。
2.1 快速查询(Fast Query)
对于数据分析场景,大部分情况下,我们只关心一定粒度聚合的数据,而非每一行原始数据的细节情况。因此,数据聚合粒度可以是1 分钟、5 分钟、1 小时或1 天等。部分数据聚合(Partial Aggregate)给Druid 争取了很大的性能优化空间。
数据内存化也是提高查询速度的杀手锏。内存和硬盘的访问速度相差近百倍,但内存的大小是非常有限的,因此在内存使用方面要精细设计,比如Druid 里面使用了Bitmap 和各种压缩技术。
另外,为了支持Drill-Down 某些维度,Druid 维护了一些倒排索引。这种方式可以加快AND和OR 等计算操作。
2.2 水平扩展能力(Horizontal Scalability)
Druid 查询性能在很大程度上依赖于内存的优化使用。数据可以分布在多个节点的内存中,因此当数据增长的时候,可以通过简单增加机器的方式进行扩容。为了保持平衡,Druid按照时间范围把聚合数据进行分区处理。对于高基数的维度,只按照时间切分有时候是不够的(Druid 的每个Segment 不超过2000 万行),故Druid 还支持对Segment 进一步分区。历史Segment 数据可以保存在深度存储系统中,存储系统可以是本地磁盘、HDFS 或远程的云服务。如果某些节点出现故障,则可借助Zookeeper 协调其他节点重新构造数据。
Druid 的查询模块能够感知和处理集群的状态变化,查询总是在有效的集群架构中进行。集群上的查询可以进行灵活的水平扩展。
2.3 实时分析(Realtime Analytics)
Druid 提供了包含基于时间维度数据的存储服务,并且任何一行数据都是历史真实发生的事件,因此在设计之初就约定事件一但进入系统,就不能再改变。
对于历史数据Druid 以Segment 数据文件的方式组织,并且将它们存储到深度存储系统中,例如文件系统或亚马逊的S3 等。当需要查询这些数据的时候,Druid 再从深度存储系统中将它们装载到内存供查询使用。
三、Druid 的主要特点
「分析事件流」。Druid 支持对 event-driven 数据进行快速地高并发查询。还可以实时地摄入流式数据,并提供亚秒级查询能力,以支持强大的 UI 交互 「创新的架构设计」。Druid 是一种新型数据库,它结合了 OLAP 分析数据库、时间序列数据库 和 全文检索 的思想,以支持流式体系架构下的大部分应用场景 「构建事件驱动的数据栈」。Druid 天然集成了消息队列(Kafka、AWS Kinesis 等)和数据湖(HDFS、AWS S3 等),使得其非常适用于流式总线和流处理器的查询层 「解锁新的工作流」。Druid 旨在对实时数据和历史数据进行快速地即时分析。使用可快速更替的查询,进行趋势解释,数据探索,以响应各种分析诉求 「多环境部署」。 Druid 可以部署在任何的 *NIX 商用硬件上,无论是在云端还是内部部署。Druid 是 cloud-native 的,这意味着集群扩容和缩容,就像添加和删除进程一样简单 「多数据源摄入」。 Druid 支持将多种外部数据系统作为数据源,进行数据摄入,包括 Hadoop、Spark、Storm 和 Kafka 等 「用于快速过滤的索引」。Druid 使用CONCISE 或Roaring 压缩位图索引来创建索引,这些索引可以快速过滤和跨多个列搜索。 「易于运维」。Druid 集群可以做到 Self-healing 和 Self-balancing。如果 Druid 服务器发生故障,系统将会自动绕过损坏的路由,直到这些机器被替换掉。在扩缩容集群的时候,只需要增加或下线服务器,集群本身会在后台自动 re-balance。Druid 在设计上保证了可以全天候工作,不会因为任何原因而停机,包括配置更改和集群升级 「插入数据时自动聚合」。Druid 可选地支持摄取时的数据自动汇总。预先汇总了您的数据,并且可以导致巨大的成本节约和性能提升。
四、Druid 的应用场景
目前从 Apache Druid 官网看到有 100 多家企业都在使用,也包括了很多国内的公司,例如 BAT、字节跳动、知乎、优酷、小米、Oppo、有赞、作业帮等等,大概占到 10% 左右。
4.1 主要应用
点击流分析(Web 和 移动端分析)
网络遥测分析(网络性能监控)
服务器指标存储
供应链分析(制造指标)
应用程序性能指标
数字营销 / 广告分析
商业智能 / OLAP
4.2 适合场景
插入率很高,但更新并不常见 大多数查询都是聚合查询和 groupBy 分组查询,包括搜索和扫描查询 查询响应时间为百毫秒~几秒钟之间 时序数据 可能有多个表,但是每个查询仅命中其中某一个表 具有高基数数据列(例如 URL,用户 ID 等),并且需要对其进行快速计数和排序 要从 Kafka,HDFS,本地文件或 Amazon S3、AliyunOSS 之类的对象存储中加载数据
❝Apache Druid 支持将 groupBy 查询的中间结果溢出存储至磁盘,以应对大查询导致的内存资源不足。通过 druid.query.groupBy.maxOnDiskStorage 配置项可以控制对应的磁盘空间大小,默认值为 0,表示不开启该特性。
❞
4.3 不合适的场景
使用主键对现有记录进行低延迟更新。Druid 支持流式插入,但不支持流式更新(使用后台批处理作业完成更新) 正在构建脱机报告系统,此时查询延迟不是很重要 需要进行大的联接查询(将一个大事实表连接到另一个大事实表),并且可以花很长时间来完成这些查询
我是「云祁」,一枚热爱技术、会写诗的大数据开发猿,Love&Peace!