Apache Druid 和 StarRocks 简介
Apache Druid 是一个 OLAP 数据存储和分析系统,专为海量数据集的高性能处理而设计。它是由广告分析公司 Metamarkets 开发的。Druid 提供低延迟数据摄取、灵活的数据探索和分析、高性能聚合以及轻松的水平扩展。它可以大规模处理数据并提供预聚合功能。Druid 使用倒排索引和位图索引来优化查询性能。它在广告分析、监控和警报等时间序列应用程序中具有广泛的用例。
Apache Druid 的竞争优势:
- 列式存储,分布式无共享架构
- 支持实时、批量采集,采集后立即查询
- 自我修复、自我平衡
- 数据深度存储,无数据丢失
- 预聚合、基于时间的分区、基于咆哮和简洁位图索引的快速过滤
- 支持近似算法
什么是星石?
StarRocks 是新一代超快大规模并行处理 (MPP) 数据库,专为所有分析场景而设计。它面向多维度分析、实时分析、即席查询。StarRocks 在高并发、低延迟点查询和高吞吐量即席查询方面具有高性能。其统一的批量和实时数据摄取功能使预聚合成为可能。StarRocks 支持各种模式,例如平面模式、星型模式和雪花模式。非常适合对性能、实时分析、高并发和灵活性有苛刻要求的各种场景。
StarRocks的竞争优势:
- 列式存储、矢量化SQL引擎
- 简单、HA架构、易运维
- 支持标准SQL,兼容MySQL协议
- 基于成本优化器(CBO)的智能查询优化
- 实时数据摄取和更新
- 现代物化视图,加速聚合和查询
- 查询联邦,异构数据源联合分析
功能比较
Apache Druid 和 StarRocks 定位为大数据分析引擎。他们有很多共同点。它们都使用列式存储,支持海量数据的摄取、高并发、使用近似算法的不同计数、HA部署和数据自平衡。但两者在数据存储、预聚合、计算框架、易用性、运维难易度等方面存在关键区别。
数据存储
摄取到 Druid 中的数据在存储到深层存储之前会被分成多个段。数据生成后,您只能将数据追加到某个段或覆盖/删除整个段。您无法灵活地修改段中的部分数据。Druid 按时间对数据进行分区,或者有时对特定列进行二次分区以提高局部性,从而减少数据访问时间。此外,Druid 允许您指定排序维度以提高压缩和查询性能。
StarRocks 使用分区和分桶机制来分发数据。您可以根据数据和查询的特征灵活地指定分区键和存储桶键。这有助于减少扫描的数据量并最大限度地提高集群的并行处理能力。StarRocks在组织和存储数据时,会根据指定的列对表数据进行排序。您可以将有特色且经常查询的列放在其他列之前,以加快数据搜索速度。StarRocks的分桶机制类似于Druid的二级分区机制。
总的来说,StarRocks和Druid有类似的存储机制。但Druid只支持基于时间的分区,而 StarRocks一级分区的数据可以是多种数据类型(DATE、DATETIME、INT)。从这个意义上来说,StarRocks 比 Druid 更加灵活。
在数据更新方面,Druid 允许您仅按时间范围删除和更新数据。不支持点删除和更新。当维度或数据频繁变化时,这种限制就更加不方便。StarRocks支持明细数据和聚合数据的分析,以及数据的实时更新。您可以使用StarRocks提供的更新模型和主键模型来实现UPDATE
基于DELETE
主键的操作。
设想
|
场景描述
|
德鲁伊
|
星岩
|
详细数据分析
|
存储和分析原始详细数据,以追加为主要写入方式,数据写入后几乎不更新数据
|
支持
|
支持
|
汇总数据分析
|
存储和分析聚合数据,无需查询明细数据,数据导入后实时聚合,数据写入后几乎无数据更新
|
支持
|
支持
|
数据更新
|
存储和分析需要更新的数据
|
不支持
|
支持
|
预聚合
Druid采用预聚合模型。当数据被摄取时,汇总功能将具有相同维度和时间戳值的行合并为一行,从而显着减少数据量并加快查询速度。但数据聚合后,详细数据就无法再查询。在Druid上查询数据,需要指定时间列来扫描这些时间范围内的预聚合段。Druid 进一步汇总结果以生成最终数据。但是,使用rollup重写查询时,无法保留原始数据。如果需要对大量维度进行小时间粒度的聚合,二次聚合会占用大量的系统资源。
StarRocks 使用智能物化视图在摄取过程中预先聚合数据。它会自动为查询选择最佳的物化视图。当原始表中的数据发生变化时,物化视图也会相应更新。如果不需要查询原始数据,可以使用StarRocks的聚合键模型来存储聚合数据,类似于使用Druid的预聚合模型。
计算框架
矢量化执行通过并行处理多组数据来加速查询。
Druid仍在优化其矢量化技术,其引擎尚未完全矢量化。只有 groupBy 和 Timeseries 查询可以以矢量化方式执行,但有一些限制。其他查询(例如 TopN、Scan、Select 和 Search)不支持矢量化执行。Druid 使用分散-聚集方法来运行查询。这种计算框架虽然简单,但不适合大表连接、嵌套查询等复杂查询。另外,Gather节点存在性能瓶颈。当groupBy后产生大量数据时,Gather节点容易出现内存膨胀,影响集群稳定性。
StarRocks 提供完全矢量化的数据加载和查询引擎。StarRocks采用MPP架构。与将查询透明分发到后端的分散收集方法不同,StarRocks 首先将查询转换为内部执行计划,将执行计划拆分为多个任务,然后将任务分发到多个 BE 节点进行并行处理。数据可以在这些任务之间重新分配,以运行复杂的查询,例如大表联接和嵌套查询。对于groupBy等查询,数据会分布到多个节点执行,避免出现单点性能瓶颈。对于 SQL 优化,StarRocks CBO 自动收集行计数、列基数和最小/最大值,并自动调整连接顺序。编写SQL语句时不再需要考虑SQL执行效率。然而,在 StarRocks 中,存储和计算并不是分开的。该功能将于 2022 年中期推出。