大数据-149 Apache Druid 实时 OLAP 架构与选型要点

TL;DR

  • 场景:离线+实时的看板/监控/运营分析,需要高并发、亚秒级聚合
  • 结论:当"时间分区+预聚合+流批一体"是强需求时,Druid更省心;灵活度低于 ClickHouse/ES,需按业务建模取舍
  • 产出:摘要、版本矩阵与常见故障速查&修复 SOP

版本矩阵

版本 发布日期 说明
34.0.0 2025-08-11 文档验证最新稳定版;按需升级并评估向量化与并发参数。
33.0.0 2025-04-29 文档验证上一主版本,官方仍提供发布信息可参考。
32.0.1 2025-03-19 文档验证维护版;自 32.0 起 Java 11 标记弃用,需规划 JDK 升级。

Druid 介绍

数据分析的基础架构可以根据不同的业务需求和技术特点分为以下几类,每种架构都有其特定的应用场景和优势:

  1. 基于Hadoop/Spark的批处理分析

    • 典型案例:使用Hadoop的MapReduce或Spark Core进行大规模数据集的处理
    • 应用场景:适用于对历史数据进行离线分析、数据挖掘等场景
    • 技术细节:Hadoop适合处理TB级以上的数据,Spark则在内存计算方面表现更优
  2. 混合架构(Hadoop/Spark + RDBMS)

    • 实现方式:先使用Hadoop/Spark进行预处理,将聚合后的结果导入MySQL/Oracle等关系型数据库
    • 优势:结合了分布式计算的高效性和RDBMS的查询便捷性
    • 典型应用:数据仓库、BI报表系统
  3. NoSQL存储架构

    • 解决方案:将处理结果保存到HBase、MongoDB等NoSQL数据库
    • 优势:解决了传统数据库的存储容量限制,支持海量数据存储
    • 场景示例:用户行为日志分析、物联网设备数据存储
    • 特别说明:HBase特别适合需要随机实时读写访问超大规模数据集的场景
  4. 流式处理架构

    • 技术选型:使用Storm/Spark Streaming/Flink处理实时数据流
    • 存储选择:处理结果可保存到RDBMS或NoSQL
    • 典型应用:实时监控系统、金融交易分析
    • 性能对比:Flink在低延迟方面表现突出,Spark Streaming更适合微批处理场景
  5. 实时分析数据库架构

    • 代表产品:使用Druid等OLAP分析型数据库
    • 核心优势:支持亚秒级查询响应,适合实时分析场景
    • 应用示例:广告效果实时分析、运营指标监控看板
    • 架构特点:通常采用列式存储,支持高性能聚合查询

每种架构的选择需要考虑数据规模、实时性要求、查询复杂度以及团队技术栈等因素。在实际应用中,这些架构往往会组合使用,形成完整的数据分析解决方案。例如:流处理架构可能同时对接实时分析数据库和离线数据仓库,形成Lambda架构。

  • 互联网技术的快速增长催生出了各类大体量的数据,Hadoop很大的贡献在于帮助企业将他们那些低价值的事件流数据转换为高价值的聚合数据。
  • Hadoop擅长的是存储和获取大规模数据,它并不提供任何性能上的保证它们能够很快的取到数据,虽然Hadoop是高可用的系统,但在高并发下负载下性能会下降。
  • Hadoop是一个很好的后端、批量处理和数据仓库系统,在一个需要高并发的并且保证查询性能和数据可用性,并需要提供产品级的保证的需求,Hadoop并不能够满足。
  • Druid是Metamarkets(一家为在线媒体或广告公司提供数据分析服务的公司)退出的一个分布式内存实时分析系统,用于解决如何在大规模数据集下进行快速的、交互式的查询和分析。
  • Druid是一个开源的数据分析引擎工具,为实时和历史数据的次秒级(多于一秒)查询设计,主要应用于对数据的OLAP查询,Druid提供低延迟(实时)的数据摄取、灵活的数据探索、快速的数据聚合。现在的Druid部署已支持扩展到数万亿时间和PB级数据。

数据摄取层 (Ingestion Layer)

  • 任务管理器 (Supervisor):负责管理数据摄取任务。
  • 数据源 (Data Sources):是 Druid 中的基本概念,用于表示一组数据。

存储层 (Storage Layer)

  • Druid 使用列式存储来优化查询性能。数据按列存储,以提高聚合和过滤的效率。
  • Segments:数据在 Druid 中被划分为称为 segments 的块,每个 segment 通常包含一个时间范围内的数据。

查询层 (Query Layer)

  • Druid 支持多种查询类型,包括实时查询、批量查询和复杂的聚合查询。
  • 查询协调器 (Query Coordinator):负责管理查询请求和将请求分发到不同的节点。

索引层 (Indexing Layer)

  • Druid 采用一种基于时间的索引策略,支持实时和历史数据的快速查询。
  • 支持多种索引类型,包括基本索引、维度索引和时间索引。

服务层 (Service Layer)

  • Druid 的架构中包括多个服务,如 Broker、Historical、Middle Manager 等,负责数据的查询和摄取。
  • Broker:接受查询请求,并将其路由到合适的 Historical 或实时节点。
  • Historical:存储历史数据并处理查询。
  • Middle Manager:负责摄取和处理实时数据流。

与OLAP对比

SparkSQL / Impala / ClickHouse,支持海量数据,灵活性强,但对响应时间没有保证,当数据量和计算复杂度增加后,响应时间会变慢,从秒级到分钟级,甚至小时级都有可能。 搜索引擎架构的系统(Elasticsearch等),在入库的时候将数据转换为倒排索引,牺牲了灵活性换了很好性能,在搜索的查询上做到了亚秒级别的响应,但是对于扫描聚合为主的查询,随着处理数据量的增加,响应时间也会退化到分钟级别。 Druid/Kylin,在入库的时候对数据进行预聚合,进一步牺牲灵活性来换取性能,实现对超大数据集的秒级响应。

  • Kylin利用Hadoop HBase做计算和存储,使用SQL查询,提供JDBC、ODBC驱动与常见的BI工具的集成
  • Druid有自己独立的分布式集群,能够实时摄入数据,有自己的查询接口(与BI兼容性较弱),通常用于实时要求高的场景 目前没有一个OLAP分析引擎能在数据量、灵活程度、性能、吞吐、并发做到完美,需要基于自己的业务场景进行选择。

技术特点

基本介绍

Apache Druid 是一个开源的、分布式、实时OLAP分析工具,Druid的核心结合了数据仓库、时间序列数据库和搜索系统的思想,适用于多种场景的高性能数据实时分析。Druid将这三个系统中的每个系统的关键特征合并到其接收层、存储格式、查询层和核心体系结构中。

时间序列数据库主要用于处理、带时间标签(按照时间的顺序变化)的数据,带时间标签的数据也称为时间序列数据。

时间序列数据库主要用于电力行业、化工行业等各类实时监测、检查、分析设备所采集、产生的数据,这些工业数据的典型特点是:

  • 产生频率快(每一个监测点一秒钟可内可以产生多条数据)
  • 严重依赖于采集时间(每一条数据均要求对应唯一的时间)
  • 测点多信息大(常规的实时检测系统均有成千上万的监测点,监测点每秒钟都产生数据,每天产生几十GB的数据)。

主要特点

列式存储

Druid独立的存储和压缩每一列,主需要读取特定查询所需的内容,这可以支持快速扫描、排名和聚合。

流式和批量摄取(Ingestion)

支持Apache Kafka、HDFS、AWS S3 等现成的连接器

本地的搜索索引

Druid为字符串创建倒排索引,以支持快速搜索和排序

灵活的Schema

Druid可以处理变化的Schema和嵌套数据

基于时间优化Partition

Druid基于时间智能的对数据进行分区,基于时间的查询比传统数据库要快的多

支持SQL

Druid支持本机的JSON语言,还支持基于HTTP或者JDBC的SQL

水平扩展性

Druid已经用户生产环境中,每秒接收百万个事件,保存多年的数据并提供次秒级查询

操作简单

只需要增加或删除服务器即可扩展或缩小规模,Druid会自动平衡,容错架构通过服务器的故障进行路由。

集成

Druid是开源大数据的技术补充,包括Apache Kafka、Apache Hadoop、Apache Flink等,通常位于存储或处理层与最终应用之间,充当查询层或数据分析服务。

Ingestion(摄取)

Druid支持流式传输和批量社区,Druid连接到数据源,包括:Kafka(用于流数据加载),或分布式文件系统,如HDFS(用于批处理数据加载)。

存储

Druid的数据存储采用列式存储格式,根据列的类型(字符串、数字等),应用不同的压缩和编码方法,根据列类型不同的类型的索引 Druid为字符串列构建倒排索引,以进行快速搜索和过滤,Druid可按时间对数据进行智能分区,以实现面向时间的快速查询。 Druid在摄取数据时对数据进行预聚合,节省大量的存储空间。

查询方式

Druid支持JSON、SQL两种方式查询数据。

应用场景

Druid擅长的部分:

  • 对于大部分查询场景可以亚秒级响应
  • 事件流实时写入与批量数据导入兼备
  • 数据写入前预聚合节省存储空间,提升查询效率
  • 水平扩容能力强
  • 社区活跃

具体的方向有如下:

  • 实时数据分析:对实时数据流(如日志、传感器数据等)进行快速分析和可视化。
  • 商业智能:用于商业分析,支持快速的报告生成和自助式数据探索。
  • 监控和指标分析:适合监控应用程序性能、用户行为分析以及操作指标。
  • 网络分析:处理网络流量数据,以便快速检测异常或进行趋势分析。
  • 复杂事件处理 (CEP):实时处理和分析事件流,帮助企业快速响应市场变化。
  • 机器学习预处理:作为机器学习模型的输入,提供快速的数据摄取和处理能力。

那是否需要Druid呢?

  • 处理时间序列事件
  • 快速的聚合以及探索式分析
  • 近实时的分析 亚秒级响应
  • 存储大量(TB、PB级别)可以预先定义若干维度的事件
  • 无单点问题的数据存储

错误速查

症状 根因 修复
实时摄取延迟上升(Kafka lag 增大) 任务槽不足、supervisor 配置不当或扩展未加载 Overlord supervisor/{id}/stats、MiddleManager 指标提升 taskCount/并发槽,校验并加载 druid-kafka-indexing-service 扩展。
查询时快时慢、抖动明显 小而多的 segments 造成调度与扫描开销 观察段数、大小与时间分布;启用/加强 Compaction,合并小段,优化段大小与行数。
Broker/Historical 内存吃紧或 OOM 结果集过大、并发高、上下文参数不合理 Broker/Historical JVM/查询指标;限制返回量;开启/调整向量化与查询上下文;按"基础集群调优"增配与配额。
无法消费 Kafka(提示需加载扩展) Kafka 索引扩展未加载到 Overlord/MiddleManager 启动日志与 druid.extensions.loadList;在两端加载扩展并重启,按官方 Kafka 摄取文档核对配置。
升级后启动报 Java 版本/弃用告警 运行在 Java 11,版本已弃用或即将移除支持 启动日志告警;迁移至 JDK 17/21;官方计划在 37.0.0 结束 Java 11 支持,提前验证依赖。

其他系列

🚀 AI篇持续更新中(长期更新)

AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究 ,持续打造实用AI工具指南! AI-调查研究-108-具身智能 机器人模型训练全流程详解:从预训练到强化学习与人类反馈

💻 Java篇持续更新中(长期更新)

Java-154 深入浅出 MongoDB 用Java访问 MongoDB 数据库 从环境搭建到CRUD完整示例 MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

相关推荐
John_Rey2 小时前
Rust底层深度探究:自定义分配器(Allocators)——控制内存分配的精妙艺术
开发语言·后端·rust
isyuah2 小时前
Rust Miko 框架系列(二):快速上手与基础示例
后端·rust
Moe4882 小时前
JDK动态代理和CGLIB动态代理源码解析
java·后端
用户68545375977692 小时前
布隆过滤器删不掉数据?布谷鸟过滤器:让我来!🐦
后端
isyuah2 小时前
Rust Miko 框架系列(四):深入路由系统
后端·rust
虎子_layor2 小时前
号段模式(分布式ID)上手指南:从原理到实战
java·后端
腾讯云数据库2 小时前
「腾讯云NoSQL」技术之向量数据库篇:自研分布式向量数据库,实现毫秒级时序一致备份的挑战和实践
数据库·nosql
烽学长2 小时前
(附源码)基于Spring boot的校园志愿服务管理系统的设计与实现
java·spring boot·后端
shark_chili2 小时前
硬核安利一个监控告警开源项目Nightingale
后端