随着实时数据在数据工程和分析中变得越来越重要,选择合适的数据仓库技术取决于多种因素。其中包括数据的数量、速度、种类和价值、业务需求、预算限制和可用的专业知识。彻底了解每个选项的优点和局限性可以指导您做出明智的决策,构建适合您的实时数据需求的强大且高效的数据仓库。
什么是 Apache Druid?
Apache Druid 是一个开源分析数据库,专为高性能实时分析而设计。它特别适合对事件数据进行商业智能(OLAP) 查询。 Druid 通常用于实时洞察大规模数据至关重要的环境,例如电子商务、金融服务和数字广告。
Apache Druid 的主要功能包括:
实时分析:
Druid 擅长在摄取数据时提供快速分析,从而能够立即洞察数据流。它提供跨分布式系统的快速查询执行和大容量数据摄取,确保低延迟。它擅长处理各种事件数据类型,包括点击流、物联网数据和事件数据记录器(例如 Tesla 车辆中使用的事件数据记录器)。
可扩展性:
专为可扩展性而设计,它可以有效处理大量数据,并且可以扩展以满足不断增长的需求。
低延迟:
Druid 针对低延迟查询进行了优化,非常适合快速响应时间至关重要的交互式应用程序。
高吞吐量摄取:
它可以以高吞吐量摄取大量事件数据,使其适合点击流分析、网络监控和欺诈检测等应用。
灵活的数据聚合:
它支持快速灵活的数据聚合,这对于汇总和分析大型数据集至关重要,并有助于快速数据切片、切块和聚合查询。
分布式架构:
其分布式架构可实现强大的容错能力和高可用性,在多个服务器之间分配数据和查询负载。
列式存储:
它使用列式存储格式,可增强分析查询的性能。
时间分区数据:
它拥有稳健的架构,具有基于时间的分片、分区、面向列的存储、索引、数据压缩以及维护版本化、物化视图以实现高可用性。
Druid 通常因其能够提供即时洞察、支持实时和批处理以及强大的可扩展性而被选中,这使其成为需要快速分析大量事件驱动数据的组织的有利选择。 p>
图标题>
使用 Druid 的典型数据摄取、存储和数据服务层:
图标题>
德鲁伊如何运作:
其架构具有弹性和可扩展性,针对OLAP(在线分析处理)进行了优化具有专为高效分析而设计的数据格式。操作是大规模并行的,确保在查询执行和数据摄取期间进行资源感知处理。 Druid 允许同时摄取批量和实时数据。对预取操作的支持有助于在一秒内完成查询。 Druid 中的数据分层允许对基础设施资源进行战略性利用。它隔离长时间运行的查询,确保它们不会干扰其他操作。
Druid 的关键组件:
协调员:
Druid Coordinator在数据分发和管理中起着至关重要的作用。它负责将数据分发到 Druid Deep 存储中。它还负责将数据副本分发到历史节点,显着提高查询响应的效率和速度。通过确保数据适当地填充到历史节点中,Druid Coordinator 有效减少延迟,从而促进高速查询。
霸主:
Druid Overlord 是 Apache Druid 架构中的关键组件,主要负责管理和协调数据摄取。其主要功能包括:
- 任务管理:Overlord 负责监督数据摄取任务的分配和监督,这些任务可以是实时的,也可以是批量的。它确保这些任务在可用资源上有效地分配和执行。
- 可扩展性:它在扩展摄取过程、通过动态地将任务分配给中间管理器节点来处理变化的负载方面发挥着至关重要的作用。
- 容错:如果任务失败,Overlord 负责检测这些问题并重新分配任务,以确保持续可靠的数据摄取。
- 负载平衡:Overlord 还管理 Druid 中间管理器节点上的负载,确保均匀分配任务以获得最佳性能。 < /里>
路由器:
Druid Router 负责接收来自客户端的查询,并将它们定向到适当的查询服务节点,例如 Broker 节点或直接定向到 Historical 节点,具体取决于查询类型和配置。
经纪人:
Druid Broker 是 Apache Druid 架构的关键组件,专注于查询处理和分发。当查询提交给Druid时,Broker在聚合来自各个数据节点的结果方面发挥着核心作用。它将部分查询发送到这些节点,然后组合它们的结果以形成最终响应。
Broker 节点知道数据段在集群中的位置。它将查询智能地路由到包含相关数据段的节点,优化查询执行过程以提高效率和速度。代理还可以缓存查询结果,这有助于加快频繁查询的响应时间,因为它避免了重复重新处理相同的数据。综上所述,Druid Broker 对于编排 Druid 集群内的查询处理至关重要,确保高效的查询执行、结果聚合和负载均衡,从而优化系统的性能和可扩展性。
历史:
Druid Historical 节点是 Apache Druid 架构中的关键组件,专为高效数据存储和检索而设计。以下是它们的主要特征:
- 单线程段处理:在 Druid Historical 节点中,每个数据段由单个线程处理。这种方法简化了处理模型,有助于有效利用系统资源进行查询和数据检索。
- 自动分层:历史节点支持数据自动分层。数据可以根据用途或其他标准分为不同的层。这种分层有助于优化存储和查询性能,因为可以将频繁访问的数据放置在更快、更容易访问的层上。
- 协调器的数据管理:Druid 协调器将数据移动到历史节点内的适当层。它管理数据放置并确保数据存储在正确的层上,平衡负载并优化存储利用率。
- 内存映射:历史节点使用内存映射文件进行数据存储。内存映射允许这些节点利用操作系统的虚拟内存进行数据管理,从而实现高效的数据访问并减少查询的 I/O 开销。
本质上,Druid Historical 节点专门用于可靠、高效的长期数据存储和检索,具有单线程处理、自动分层、协调器主导的数据管理和内存映射等功能,以提高性能。
中层经理:
Druid Middle Manager 在 Apache Druid 的数据摄取过程中至关重要。 Druid Middle Managers 在 Druid 的数据摄取管道中至关重要,负责处理摄取任务的分发和执行,同时确保可扩展性和高效的资源管理。
- 数据摄取管理:中层管理人员负责管理 Druid 系统的数据摄取。它们处理实时和批量数据摄取任务。
- 任务分配:每个 Middle Manager 节点都可以运行一个或多个摄取数据的任务。这些任务由 Druid Overlord 分配和监控,Druid Overlord 将摄取工作负载分配给可用的中层管理人员。
- 可扩展性:中层管理人员的架构允许水平可扩展性。随着数据摄取需求的增加,可以向系统添加更多的 Middle Manager 节点以有效分配负载。
- 实时数据处理:在实时数据摄取的情况下,中层管理人员参与初始数据处理和移交到历史节点进行长期存储。
- 工作节点:中层管理人员充当工作节点。他们执行 Overlord 分配的任务,包括数据索引、处理和临时存储。
图标题>
基于 SQL 的摄取(示例):
插入到 tbl
选择
TIME_PARSE("时间戳") AS __time,
XXX,
YYY,
ZZZ
从表(
外部(
'{"type": "s3", "uris": ["s3://bucket/file"]}',
'{“类型”:“json”}',
'[{“名称”:“XXX”,“类型”:“字符串”},{“名称”:“YYY”,“类型”:“字符串”},{“名称”:“ZZZ”,“类型” : "string"}, {"name": "timestamp", "type": "string"}]'
)
)
按楼层分区(__今日时间)
按 XXX 进行聚类
基于 JSON 的摄取(示例):
图标题>
图标题>
深度存储:
Apache Druid 中的深度存储是一个可扩展且持久的数据存储系统,用于永久保留数据。 Druid 中的深度存储提供了强大、可扩展且持久的解决方案,对于维护大规模数据分析和商业智能操作中的数据完整性和可用性至关重要。
- 永久存储层:深度存储充当 Druid 的主要数据存储库,所有摄取的数据都将长期存储在其中保留。这对于确保数据在各个 Druid 进程生命周期之外的持久性至关重要。
- 支持各种存储系统:Druid 被设计为与底层存储系统无关。它可以与 Amazon S3、Google Cloud Storage、Hadoop 分布式文件系统 (HDFS) 和Microsoft Azure 存储。
- 数据分段:深度存储中的数据被组织成分段,本质上是分区、压缩和索引文件。这种分段有助于高效的数据检索和查询。
- 容错和恢复:深度存储提供了在系统故障时恢复和重新加载数据段的弹性。这可以确保数据不会丢失并且可以一致地访问。
- 可扩展性:深度存储的扩展独立于计算资源。随着数据的增长,可以在不影响Druid集群性能的情况下扩展深度存储。
- 存储和处理解耦:Druid 通过分离存储来实现灵活且经济高效的资源管理和加工。计算资源可以根据需要扩展或缩减,与深度存储中的数据量无关。
- 数据备份和归档:深度存储还可以作为备份和归档解决方案,确保历史数据得到保留并可以访问以供将来分析。
深层存储中的段:
Apache Druid 中深度存储中的分段具有独特的特征,可以优化存储效率和查询性能。每个段通常包含 3 到 5 百万行数据。此大小是有效数据处理的粒度与足够大以确保良好的压缩和查询性能之间的平衡。
段内的数据根据时间进行分区。这种时间分区是 Druid 架构的核心,因为它可以有效地处理和查询时间序列数据。在段内,数据可以按维度值聚集。此集群增强了基于这些维度过滤或聚合数据的查询的性能。一旦创建,段就是不可变的——它们不会改变。每个段都有版本,使 Druid 能够维护相同数据的不同版本。这种不变性和版本控制对于有效缓存至关重要,因为缓存在替换或更新段之前保持有效。
Druid 中的段是自描述的,这意味着它们包含有关其结构和模式的元数据。此功能对于模式演化非常重要,因为即使模式随时间发生变化,它也允许 Druid 理解和处理段。 Druid 中分段设计的这些方面对于其高性能分析能力至关重要,特别是在处理大量时序数据、优化查询性能以及确保数据一致性和可靠性方面。
细分的一些主要特征是
列式格式:深度存储中的数据以列式格式存储。这意味着每列数据都是单独存储的,从而增强了查询性能,特别是对于分析和聚合查询,因为只需要读取和处理必要的列。
- 字典编码:字典编码用于有效地存储数据。它涉及为列创建唯一的值字典,其中紧凑标识符替换每个值。这种方法显着减少了重复或相似数据所需的存储空间。
- 压缩表示:段中的数据经过压缩,以减少其在深度存储中的大小。压缩可以降低存储成本并加快存储和处理节点之间的数据传输速度。
- 位图索引:位图索引用于快速查询,特别是过滤和搜索操作。它们可以通过快速识别与查询条件匹配的行来对高基数列进行高效查询。
德鲁伊的其他功能:
Apache Druid 包含额外的高级功能,可增强其数据分析的性能和灵活性。这些功能包括:
多级缓存
Druid 在其架构内的各个级别实现缓存,从代理到数据节点。这种多层缓存策略包括:
- 代理缓存:在代理级别缓存查询结果,这可以显着加快重复查询的响应时间。
- 历史节点缓存:在历史节点中缓存数据段,提高频繁访问数据的查询性能。
- 查询级缓存:允许缓存部分查询结果,以便在后续查询中重复使用。
查询通道和优先级
Druid 支持查询规划和优先级划分,这对于管理和优化查询工作负载至关重要。此功能允许管理员根据查询的重要性或紧急程度对查询进行分类和优先级排序。例如,关键的实时查询可以优先于不太紧急的批量查询,确保重要的任务首先完成。
逼近和矢量化:
近似算法:Druid 可以使用各种近似算法(如 HyperLogLog、Theta Sketches 等)来提供更快的查询响应,对于大型数据集的聚合和计数特别有用。这些算法以少量的准确度换取了速度和资源效率的显着提升。
矢量化是指批量处理数据,而不是一次处理一个元素。矢量化查询执行允许 Druid 同时对多个数据点执行操作,显着提高查询性能,尤其是在具有 SIMD 的现代硬件上(单指令、多数据) 功能。
摘要:
上面讨论的组件和功能使 Druid 成为一个高效且适应性强的实时分析系统,能够处理具有不同查询工作负载的大量数据,同时确保快速且资源高效的数据处理。