器→工具, 开源项目

开源实时分析数据库Druid

钱魏Way · · 175 次浏览
!文章内容如有错误或排版问题,请提交反馈,非常感谢!

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的架构由多个组件组成,每个组件负责不同的任务:

    • Master组件:
      • Coordinator: 管理数据分片的分配和复制,负责数据的负载均衡和版本管理。
      • Overlord: 管理数据摄取任务,负责任务的调度和资源分配。
    • Data组件:
      • Historical: 存储不可变的历史数据段,负责查询的执行和数据的持久化。
      • MiddleManager: 处理实时数据摄取任务,将数据写入到实时数据段。
    • Query组件:
      • Broker: 接收查询请求,将请求路由到合适的Historical和MiddleManager节点,并汇总结果返回给用户。
    • DeepStorage:
      • 用于持久化存储数据段的长期存储,可以是HDFS、S3、GCS等分布式存储系统。
    • MetadataStorage:
      • 存储Druid的元数据,包括任务状态、数据段信息等,通常使用关系型数据库(如PostgreSQL或MySQL)。

    数据处理流程

    • 数据摄取: 数据可以从流数据源(如Kafka)或批处理数据源(如Hadoop)摄取。MiddleManager处理实时数据,生成实时数据段。
    • 数据存储: 实时数据段在一定时间后被合并并持久化到DeepStorage,成为历史数据段。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的持续发展和社区支持确保了它在未来的相关性和适用性。

    参考链接:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注