这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战
一、概述
数据分析的基础架构可以分为以下几类:
-
使用
Hadoop/Spark进行分析 -
将
Hadoop/Spark的结果导入RDBMS中提供数据分析 -
将结果保存到容量更大的
NoSQL数据库中, 解决数据分析的存储瓶颈, 例如:HBase -
将数据源进行流式处理, 对接流式计算框架(如
Storm、Spark、Flink), 结果保存到RDBMS或NoSQL中 -
将数据源进行流式处理, 对接分析数据库, 例如:
Druid
互联网技术的快速增长催生了各类大体量的数据, Hadoop 很大的贡献在于帮助企业将他们那些低价值的事件流数据转化为高价值的聚合数据。
Hadoop 擅长的是存储和获取大规模数据, 它并不提供任何性能上的保证它能多快获取到数据。虽然 Hadoop 是一个高可用的系统, 但在高并发负载下性能会下降;
Hadoop 是一个很好的后端、批量处理和数据仓库系统。在一个需要高并发并且保证查询性能和数据可用性的并需要提供产品级别的保证的需求, Hadoop 并不能满足。
Druid 是 Metamarkets 公司(一家为在线媒体或广告公司提供数据分析服务的公司)推出的一个分布式内存实时分析系统, 用于解决如何在大规模数据集下进行快速的、交互式的查询和分析。
Druid 是一个开源的数据分析引擎工具, 为实时和历史数据的次秒级(多于一秒)查询设计。
主要应用于对数据的 OLAP 查询, Druid 提供低延迟(实时)的数据摄取、灵活的数据探索、快速的数据聚合。现有的 Druid 部署已支持扩展到数万亿时间和 PB 级数据。
(1)与其他 OLAP 技术对比
| Druid | Kylin | ES | Spark SQL | ClickHouse | |
|---|---|---|---|---|---|
| 数据规模 | 超大 | 超大 | 中等 | 超大 | 中 |
| 查询效率 | 高 | 高 | 中 | 低 | 高 |
| 并发度 | 高 | 高 | 高 | 低 | 中 |
| 灵活性 | 中 | 低 | 高 | 高 | 高 |
| SQL支持 | 中 | 高 | 中 | 高 | 高 |
SparkSQL / Impala / ClickHouse, 支持海量数据, 灵活性强, 但对响应时间是没有保证的。
当数据量和计算复杂度增加后, 响应时间会变慢, 从秒级到分钟级, 甚至小时级都有可能。
搜索引擎架构的系统(Elasticsearch 等), 在入库时将数据转换为倒排索引。牺牲了灵活性换取很好的性能, 在搜索类查询上能做到亚秒级响应, 但是对于扫描聚合为主的查询, 随着处理数据量的增加, 响应时间也会退化到分钟级。
Druid / Kylin, 则在入库时对数据进行预聚合, 进一步牺牲灵活性换取性能, 以实现对超大数据集的秒级响应。
-
Kylin利用Hadoop/HBase做计算和存储, 使用SQL查询, 提供JDBC/ODBC驱动与常见BI工具集成 -
Druid有自己独立的分布式集群, 能够实时摄入数据, 有自己的查询接口(与BI兼容性较弱), 通常多用于实时要求高的场景
目前没有一个 OLAP 分析引擎能在数据量、灵活程度、性能(吞吐&并发)做到完美, 需要基于自己的业务场景进行取舍和选型。
(2)应用场景
Druid 擅长的部分:
-
对于大部分查询场景可以亚秒级响应
-
事件流实时写入与批量数据导入兼备
-
数据写入前预聚合节省存储空间, 提升查询效率
-
水平扩容能力强
-
社区活跃
是否需要使用 Druid:
-
处理时间序列事件
-
快速的聚合以及探索式分析
-
近实时分析亚秒级响应
-
存储大量(
TB级、PB级)可以预先定义若干维度的事件 -
无单点问题的数据存储
二、技术特点
Apache Druid 是一个开源的、分布式、实时 OLAP 分析工具。
Druid的核心设计结合了数据仓库、时间序列数据库和搜索系统的思想, 适用于多种场景的高性能数据实时分析。Druid将这三个系统中的每个系统的关键特征合并到其接收层、存储格式、查询层和核心体系结构中。
如图:
时间序列数据库主要用于指处理, 带时间标签(按照时间的顺序变化)的数据, 带时间标签的数据也称为时间序列数据。
时间序列数据主要由电力行业、化工行业等各类型实时监测、检查与分析设备所采集、产生的数据, 这些工业数据的典型特点是: 产生频率快(每一个监测点一秒钟内可产生多条数据)、严重依赖于采集时间(每一条数据均要求对应 唯一的时间)、测点多信息量大(常规的实时监测系统均有成千上万的监测点, 监测点每秒钟都产生数据, 每天产生几十GB的数据量)。
主要特点:
-
列式存储:
Druid独立的存储和压缩每一列, 只需要读取特定查询所需的内容, 这可以支持快速扫描、排名和聚合 -
流式和批量摄取(
Ingestion):支持Apache Kafka、HDFS、AWS S3、stream processors等现成连接器 -
本地的搜索索引:
Druid为字符串创建倒排索引, 以支持快速搜索和排序 -
灵活的
schema:Druid可以处理变化的schema和 嵌套数据 -
基于时间优化
partition:Druid基于时间智能的对数据进行分区,基于时间的查询比传统数据库要快得多 -
支持
SQL:Druid支持本机的JSON语言, 还支持基于HTTP或者JDBC的SQL -
水平扩展性:
Druid已经用户生产环境中, 每秒接收数百万个事件, 保存多年的数据并提供次秒级查询 -
操作简单:只需要增加或删除服务器即可扩展或缩小规模,
Druid会自动平衡, 容错架构通过服务器的故障进行路由
三、体系架构
(1)Druid 进程和服务
Druid 进程和服务:
-
Coordinator进程管理群集上的数据可用性。从metastore中读取Segment的元数据, 并决定哪些Segments需要被加载到集群中。使用ZooKeeper查看已经存在的历史节点, 了解集群各个节点负载情况。创建一个ZK的条目告诉历史节点加载、删除、或者移动Segments -
Overlord进程控制数据提取工作负载的分配 -
Historical进程存储可查询数据。提供对Segment的数据查询服务。与ZooKeeper通信, 上报节点信息, 告知ZK自己拥有哪些Segments。从ZooKeeper中获取执行任务 -
MiddleManager进程负责提取数据 -
Broker进程处理来自外部客户端的查询。负责将查询请求分发到历史节点和实时节点, 并聚合这些节点返回的查询结果数据。Broker节点通过zookeeper知道Segment都存放在哪些节点上 -
Router进程是可选的进程, 可以将请求路由到Broker、Coordinator、Overlords
根据线程的服务类型分为:
Master:Coordinator&Overload进程, 管理数据可用性和数据摄取Data:Historical&MiddleManager, 执行提取工作负载并存储所有可查询数据Query:Broker&Router, 处理来自外部客户端的查询
如图:
(2)外部依赖
-
Deep Storage: 深度存储, 例如HDFS或者S3。不是用来存储查询数据的。而是作为数据的备份或者进程间数据交换 -
Metadata Storage: 元数据存储, 可以用RDBMS -
ZooKeeper: 服务发现、leader选举、服务协调