Druid简介
Apache Druid 是一个开源的分布式实时分析数据库,专为高性能的 OLAP(在线分析处理)查询而设计。Druid 的设计目标是提供低延迟的数据摄取、快速的查询响应和高效的数据聚合能力,使其非常适合于需要实时数据分析的场景,如时间序列分析、仪表盘应用、广告技术、用户行为分析等。
Apache Druid 的产生背景可以追溯到 2011 年,当时互联网广告技术公司 Metamarkets 需要一个能够支持实时数据摄取和快速查询的大规模分析系统。Metamarkets 的业务需求包括实时处理和分析大量的广告数据,以便为客户提供实时的仪表盘和分析服务。
主要动机
- 实时数据处理需求:
- Metamarkets 的业务需要对广告点击、展示和其他用户行为进行实时分析,以便快速响应市场变化和优化广告投放策略。
- 现有的技术栈难以支持低延迟的数据摄取和快速的查询响应时间。
- 高查询性能:
- 需要支持复杂的 OLAP 查询,包括多维分析、聚合和过滤操作。
- 查询性能需要满足亚秒级响应,以便支持实时仪表盘和用户交互分析。
- 大规模数据处理:
- 广告技术领域的数据量非常大,系统需要能够扩展以处理数 TB 甚至 PB 级的数据。
- 系统需要支持高可用性和容错性,以应对集群节点的故障。
技术挑战
- 实时性与历史数据的结合:
- 需要一个系统能够同时处理实时数据流和批量历史数据,提供一致的查询接口。
- 数据存储与查询效率:
- 传统的行存储数据库在处理大规模数据和复杂查询时效率较低,Druid 选择了列式存储以提高查询性能。
- 使用预聚合和索引技术来加速查询。
- 分布式架构的复杂性:
- 需要设计一个分布式系统架构,以便支持数据的水平扩展和高可用性。
发展历程
- 早期开发:
- Druid 最初由 Metamarkets 的工程团队开发,以满足其特定的业务需求。
- 早期版本在公司内部使用,并不断优化以提高性能和稳定性。
- 开源发布:
- 由于 Druid 的独特能力和性能,Metamarkets 决定将其开源,以便社区和其他企业能够从中受益。
- 开源后,Druid 得到了广泛的关注和使用,特别是在需要实时分析的大数据应用中。
- 社区和生态系统:
- 开源之后,Druid 社区不断壮大,吸引了许多开发者和企业的参与和贡献。
- 通过社区的努力,Druid 增强了其功能,支持更多的数据源、查询优化和集成选项。
核心特性
- 实时数据摄取:
- Druid 支持从流数据源(如 Apache Kafka、Amazon Kinesis)中实时摄取数据,能够以低延迟的方式处理实时数据流。
- 支持批量数据摄取,允许从 Hadoop、S3 等批处理数据源中导入数据。
- 低延迟查询:
- 通过列式存储和多种索引技术(如倒排索引、位图索引),Druid 能够提供亚秒级的查询响应时间。
- 支持复杂的 OLAP 查询,包括聚合、过滤、排序和分组操作。
- 水平可扩展性:
- Druid 的分布式架构允许水平扩展,能够处理从数 TB 到 PB 级别的数据。
- 通过分片和复制机制,Druid 提供高可用性和数据冗余,确保系统的可靠性。
- 高可用性:
- 通过数据分片的复制和分布式架构,Druid 提供高可用性,确保即使在节点故障的情况下也能继续提供服务。
- 灵活的数据模型:
- Druid 支持 schema-on-read,即数据在写入时不需要预定义模式,允许灵活地处理不同格式的数据。
- 支持半结构化数据,能够处理 JSON 等复杂数据类型。
- 时间序列分析:
- Druid 特别适合时间序列数据的存储和分析,支持丰富的时间切片和聚合功能。
- 丰富的集成能力:
- 支持与多种数据源和流处理平台的集成,如 Apache Kafka、Hadoop、AWS S3 等。
- 提供 REST API 和 SQL 查询接口,便于与各种 BI 工具和应用进行集成。
- 深度存储和元数据管理:
- 支持多种深度存储选项(如 HDFS、S3、GCS)用于持久化数据段。
- 使用关系型数据库(如 PostgreSQL 或 MySQL)存储元数据,管理任务状态和数据段信息。
Druid的优点
- 实时数据摄取:支持从流数据源(如 Apache Kafka)中实时摄取数据,能够快速处理和查询最新的数据。
- 低延迟查询:通过列式存储和多种索引(如倒排索引、位图索引),Druid 提供亚秒级的查询响应时间,适合需要快速响应的应用。
- 水平扩展性:分布式架构允许通过添加节点来水平扩展,支持从 TB 到 PB 级别的数据处理。
- 高可用性和容错性:通过数据分片和复制机制,Druid 提供高可用性,确保系统在节点故障时仍能正常运行。
- 灵活的数据模型:支持 schema-on-read,允许灵活处理和查询半结构化数据。
- 时间序列分析优化:Druid 特别适合时间序列数据,支持丰富的时间切片和聚合操作。
Druid的缺点
- 复杂性:Druid 的架构较为复杂,需要对多个组件进行配置和管理,包括协调器、历史节点、实时节点、代理节点等。
- 数据更新限制:Druid 更适合追加写入的场景,虽然支持数据更新和删除,但这些操作相对复杂和资源密集。
- 存储成本:为了优化查询性能,Druid 会创建大量的索引和预聚合数据,这可能导致较高的存储成本。
- 学习曲线:对于新用户来说,理解和使用 Druid 可能需要一定的学习成本,特别是在配置和调优方面。
使用场景
- 实时仪表盘和监控:Druid 常用于构建实时仪表盘和监控系统,提供实时数据可视化和分析。
- 用户行为分析:支持实时分析用户行为数据,如点击流、用户活动日志等,以便快速洞察用户行为模式。
- 广告技术:在广告技术领域,Druid 用于实时竞价、广告效果分析和优化等场景。
- 物联网(IoT)数据分析:Druid 可以处理和分析大量的 IoT 传感器数据,提供实时监控和预测分析。
- 业务智能和运营分析:支持企业进行实时业务分析和决策支持,如销售数据分析、财务监控等。
Druid的架构
Apache Druid 用于为实时分析应用程序提供支持,这些应用程序需要在负载下对流式和批处理数据进行大规模快速查询。Druid 在其摄取、存储和查询层中具有独特的分布式架构,可以处理大型聚合所需的规模和应用程序所需的性能。
Druid 是一种基于服务的架构,由用于摄取、查询和编排的独立可扩展服务组成,每个服务都可以进行微调,以优化混合使用案例和工作负载的集群资源。例如,可以将更多资源定向到 Druid 的查询服务,同时随着工作负载的变化提供更少的资源来摄取。Druid 服务可以失败,但不会影响其他服务的运行。
Druid 部署是一个可扩展的商用硬件集群,具有用于特定功能的节点类型。在小型配置中,所有这些节点都可以在单个服务器(甚至笔记本电脑)上一起运行。对于大型部署,每个节点类型都有一台或多台服务器,并且可以扩展到数千个节点,以满足更高的吞吐量要求。
架构组件
Druid 的架构由多个组件组成,每个组件负责不同的任务:
- Master 组件:
- Coordinator: 管理数据分片的分配和复制,负责数据的负载均衡和版本管理。
- Overlord: 管理数据摄取任务,负责任务的调度和资源分配。
- Data 组件:
- Historical: 存储不可变的历史数据段,负责查询的执行和数据的持久化。
- MiddleManager: 处理实时数据摄取任务,将数据写入到实时数据段。
- Query 组件:
- Broker: 接收查询请求,将请求路由到合适的 Historical 和 MiddleManager 节点,并汇总结果返回给用户。
- Deep Storage:
- 用于持久化存储数据段的长期存储,可以是 HDFS、S3、GCS 等分布式存储系统。
- Metadata Storage:
- 存储 Druid 的元数据,包括任务状态、数据段信息等,通常使用关系型数据库(如 PostgreSQL 或 MySQL)。
数据处理流程
- 数据摄取:数据可以从流数据源(如 Kafka)或批处理数据源(如 Hadoop)摄取。MiddleManager 处理实时数据,生成实时数据段。
- 数据存储:实时数据段在一定时间后被合并并持久化到 Deep Storage,成为历史数据段。Historical 节点负责加载和管理这些段。
- 查询执行:
- Broker 接收用户的查询请求,解析并优化查询,将查询分发到合适的 Historical 和 MiddleManager 节点。
- 各节点并行处理查询并返回结果,Broker 汇总并返回最终结果给用户。
摄取层
在 Druid 中,摄取(有时称为索引)将数据加载到表中。Druid 从源系统读取数据,无论是文件还是流,并将数据存储在分段中。
当数据被摄取到 Druid 中时,它会自动被索引、分区,并选择性地进行部分预聚合(称为“rollup”)。压缩的位图索引支持跨多个列进行快速筛选和搜索。数据按时间分区,也可以按其他维度分区。
Stream Data 流数据
Druid 从一开始就被设计为在交付时快速摄取和立即查询流数据。不需要连接器,因为 Druid 包括使用 Apache Kafka 和 Amazon Kinesis API 对数据流的固有 Exactly-Once 摄取。Druid 持续备份到深度存储还确保了流数据的零 RPO。
Batch Data 批处理数据
Druid 可以轻松地从对象存储(包括 HDFS、Amazon S3、Azure Blob 和 Google Cloud Storage)中提取数据,以及从数据库和其他来源提取数据文件。数据文件可以采用多种常见格式,包括 JSON、CSV、TSV、Parquet、ORC、Avro 和 Protobuf。Druid 支持 SQL 批量导入和数据库内转换。
存储格式
Druid 将数据存储到区段中。每个区段都是一个文件,通常最多包含几百万行数据。每个 Druid 表可以有一个 Segment 到数百万个 Segment,分布在集群中。
在区段中,数据存储是面向列的。查询仅加载每个请求所需的特定列。每列的存储都按数据类型进行优化,这进一步提高了扫描和聚合的性能。字符串列使用压缩的字典编码进行存储,而数字列使用压缩的原始值进行存储。
交互式查询
Druid 的交互式查询引擎用于性能敏感型查询。查询引擎和存储格式共同设计为使用尽可能少的资源提供最高的查询性能(以及混合工作负载的最佳性能价格)。
使用此引擎,Druid 仅从预加载到数据节点的内存或本地存储中的段中读取。这确保了快速的性能,因为数据与计算资源位于同一位置,不必通过网络移动。然后使用 scatter/gather 查询数据以实现最佳并行化。
首先,查询引擎会修剪区段列表,根据 time-internals 和其他筛选条件创建与查询相关的区段列表。接下来,将查询分成离散的部分,并并行发送到管理每个相关段或该段副本(“scatter”)的数据节点。在数据节点上,子查询被处理并发送回查询节点以合并最终结果集(“gather”)。
Scatter/gather 从最小的单个服务器集群(所有 Druid 都在一台服务器上)到拥有数千台服务器的集群工作,即使对于数 PB 的非常大的数据集,也能为大多数查询提供亚秒级性能。
Druid的未来
截至目前,Apache Druid 并未被淘汰,反而在大数据分析领域继续保持活跃和重要的地位。Druid 以其高性能的实时数据摄取和查询能力,仍然是许多企业和组织在处理大规模数据分析任务时的重要选择。以下是一些支持 Druid 持续使用的原因:
- 持续的社区支持和开发
- 活跃的开源社区:Druid 由一个活跃的开源社区维护,该社区不断进行改进和更新,以确保 Druid 的功能、性能和稳定性保持在行业的前沿。
- 新特性和改进:开发者持续为 Druid 引入新特性,例如更好的查询优化、更高效的数据存储格式、增强的安全性和集成能力。
- 强大的性能优势
- 实时数据分析:Druid 的实时数据摄取和低延迟查询能力,使其在需要快速响应和决策的场景中具有独特的优势。
- 高效的列式存储:通过列式存储和索引技术,Druid 能够在处理大规模数据集时提供高效的查询性能。
- 广泛的应用场景
- 时间序列和多维分析:Druid 在时间序列分析、用户行为分析、监控和仪表盘应用中得到广泛应用,特别是在互联网、广告技术和金融行业。
- 企业级应用:许多大型企业和组织使用 Druid 作为其大数据分析平台的一部分,以支持实时分析需求。
- 持续的企业支持
- 商业支持和集成:一些公司提供对 Druid 的商业支持和服务,帮助企业更好地部署和管理 Druid 集群。
- 与其他工具的集成:Druid 能够与各种数据源、流处理平台(如 Kafka)、和 BI 工具(如 Tableau)集成,增强了其在数据生态系统中的适用性。
尽管大数据分析领域有许多工具和技术可供选择,但 Apache Druid 以其独特的优势和持续的发展,在实时数据分析场景中仍然是一个重要的选择。Druid 的持续发展和社区支持确保了它在未来的相关性和适用性。
参考链接: