Druid是一个面向列的、开源的、分布式数据存储系统,用Java编写。它旨在快速摄取海量事件数据,并在此基础上提供低延迟查询。Druid这个名字来源于许多角色扮演游戏中的变形者德鲁伊职业,反映了该系统的架构可以变形以解决不同类型的数据问题。Druid通常用于商业智能和OLAP应用中,以分析高容量的实时和历史数据,它已成为现代人工智能和可观测性管道中的基础工具。
Druid被阿里巴巴、Airbnb、Nielsen、Cisco、eBay、Lyft、Netflix、PayPal、Pinterest、Reddit、Twitter、Walmart、Wikimedia Foundation和Yahoo等科技公司用于生产环境。它在流式数据上处理亚秒级查询的能力,使其成为驱动仪表板、异常检测和实时决策系统的热门选择,包括那些支持机器学习模型监控和生成式人工智能应用的系统。
历史
Druid于2011年由Eric Tschetter、Fangjin Yang、Gian Merlino和Vadim Ogievetsky创建,用于驱动Metamarkets的分析产品,该公司专注于广告行业的实时数据分析。该项目于2012年10月在GPL许可证下开源,允许外部开发者贡献和采用该技术。2015年2月,该项目转向Apache许可证,这是一种更宽松的许可证,促进了更广泛的商业采用和与其他开源生态系统的集成。
自开源以来,Druid通过来自多元化社区的贡献不断演进,主要版本增加了改进的摄取能力、增强的查询性能以及与云存储系统更好的集成等功能。该项目的治理过渡到了Apache软件基金会,在那里它仍然是一个活跃的顶级项目。
架构
完全部署后,Druid作为一组专门化的进程(称为节点)运行,以支持容错架构,其中数据被冗余存储,且没有单点故障。集群包括用于协调、元数据存储和深度存储的外部依赖。Apache ZooKeeper处理协调和领导者选举,而元数据存储(例如,MySQL、PostgreSQL或Derby)跟踪段信息,深度存储设施(例如,HDFS或Amazon S3)提供永久数据备份。
核心设计将数据分离为不可变的段,这些段被分区并复制到历史节点上。实时节点处理传入的流式数据,将其转换为段,然后移交给历史节点进行长期存储。这种分离使Druid能够水平扩展,添加节点以处理增加的数据量或查询负载,而不会中断现有操作。
查询管理
客户端查询首先到达代理节点,代理节点将它们转发到适当的数据节点,无论是历史节点还是实时节点。由于Druid段可能被分区,传入的查询可能需要来自存储在集群中不同节点上的多个段和分区(或分片)的数据。代理能够了解哪些节点拥有所需数据,合并部分结果,并将聚合结果返回给客户端。这种分布式查询引擎即使在跨越数TB或PB的数据集上也能实现亚秒级响应时间。
集群管理
与历史节点中数据管理相关的操作由协调节点监督。这些节点管理段加载、复制和压缩,确保数据均匀分布且可用。Apache ZooKeeper用于注册所有节点,管理节点间通信的某些方面,并提供领导者选举,这有助于维护集群中的一致性和可用性。
特性
Druid提供了几个关键特性,使其区别于传统数据库。它支持低延迟流式数据摄取,允许用户在其到达后几秒内查询数据。它支持任意的切片和切块数据探索,这意味着用户可以在多个维度上过滤、聚合和分组数据,而无需预定义查询。亚秒级分析查询是Druid的标志,通过预聚合、列式存储和高效索引实现。Druid还提供近似和精确计算,给用户在平衡查询速度和精度方面提供了灵活性。
这些特性使Druid非常适合可观测性等用例,在这些用例中,来自分布式系统的指标和日志需要实时分析。在人工智能的背景下,Druid通常用于存储和查询来自神经网络训练运行的遥测数据,或监控已部署的大型语言模型服务的性能,从而能够快速检测异常或退化。
性能
2019年,研究人员使用基于TPC-H标准的非规范化星型模式基准比较了Hive、Presto和Druid的性能。Druid使用“Druid最佳”配置(使用哈希分区表)和“Druid次优”配置(不使用哈希分区)进行了测试。测试通过运行13个TPC-H查询进行,使用TPC-H比例因子30(30GB数据库)、比例因子100(100GB数据库)和比例因子300(300GB数据库)。
Druid的性能在每种场景下都至少比Hive快98%,比Presto快90%,即使使用Druid次优配置也是如此。这种显著的加速优势源于Druid的列式存储格式,它通过只读取查询所需的列来减少I/O,以及使用预计算聚合来避免扫描原始数据。结果突出了Druid在交互式分析中的适用性,在这些分析中低延迟至关重要,例如在亚马逊网络服务或谷歌云部署中。
在AI和可观测性中的用例
Druid的实时分析能力使其成为可观测性平台的关键组件,在这些平台中,它摄取来自应用程序和基础设施的指标、追踪和日志。公司使用Druid驱动跟踪系统健康、检测异常和支持事件响应的仪表板。在AI应用中,Druid用于存储和查询机器学习模型的特征数据,实现实时推理和模型监控。例如,部署基于变换器模型的团队可能会使用Druid记录预测延迟和输入分布,然后查询这些日志以识别漂移或性能问题。
Druid与深度学习工作流的集成也在增长,因为组织寻求分析训练集群生成的大量遥测数据。通过在流式数据上提供亚秒级查询,Druid支持强化学习和其他高级AI范式中常见的迭代实验。其开源性质以及与甲骨文云和Azure等云存储服务的兼容性使其对广泛的用户可访问。
生态系统和集成
Druid与各种数据处理和查询工具集成。它支持从Kafka(一个流行的流式平台)摄取数据,并可以将数据导出到Apache Spark等系统进行批处理。Druid的SQL接口(在后续版本中引入)允许熟悉标准SQL的用户无需学习专有语言即可查询数据。这扩大了其在数据分析师和工程师中的采用。
在AI生态系统中,Druid通常补充数据增强管道,为处理后的特征提供快速存储。它还可以作为模型剪枝实验的后端,在这些实验中,工程师需要比较不同模型版本之间的性能指标。该系统处理高基数维度(如用户ID或设备类型)的能力使其适用于个性化和推荐系统。
参见
- 面向列的DBMS列表
- 机器学习
- 可观测性
参考文献
- Apache Druid官方文档
- 关于Hive、Presto和Druid性能比较的研究论文(2019年)
外部链接
- 官方网站:druid.apache.org