时序数据库DolphinDB与Druid的对比测试
该页面是一篇对 DolphinDB 与 Druid 进行对比测试的文章,包含作者/发布日期信息,并概述测试范围、数据集规模与核心结论。
Source: https://dolphindb.cn/blogs/52
What this page covers
- DolphinDB 与 Druid 的系统定位与能力简介。
- 对比测试的硬件与环境配置。
- 测试数据集(TAQ)的规模与字段使用规则。
- 两种系统的数据分区方案对比。
- 查询性能测试的方法与结论。
- 数据导入(I/O)性能测试与结论。
- 磁盘占用(压缩率与运行时空间)对比与原因说明。
技能认证特训营第二期报名促销
页面顶部包含培训营活动提示与限时报名链接信息。
- 该部分用于呈现活动报名相关提示。
- 该部分包含限时报名的引导信息。
时序数据库 DolphinDB 与 Druid 对比测试(标题/作者/日期/摘要结论)
本节给出文章标题、作者与发布日期,并概述测试范围、数据集规模与核心结论摘要。
- 作者为 Junxi。
- 发布日期为 2021-08-05。
- 摘要结论包含写入速度对比结果。
- 摘要结论包含查询速度对比结果。
- 摘要结论包含磁盘空间占用相关对比结果。
系统介绍
本节介绍 DolphinDB 与 Druid 的定位、架构特点与能力描述。
- DolphinDB 被描述为分布式的分析型时序数据库。
- Druid 被描述为分布式的分析型时序数据库与 OLAP 数据仓库。
- DolphinDB 的实现语言为 C++。
- Druid 的实现语言为 Java。
- DolphinDB 提及内置流数据处理与分布式计算相关能力。
系统配置(硬件与环境)
本节给出测试硬件、操作系统与单服务器多节点集群的环境/参数设置。
- 测试硬件型号为 DELL OptiPlex 7060。
- 操作系统为 Ubuntu 16.04 x64。
- 部署形态为单服务器下的多节点集群。
- DolphinDB 测试设置包含 4 个数据节点。
- Druid 测试设置包含 5 个角色节点。
测试数据集
本节说明所用 TAQ 数据集的时间范围、文件规模、数据量及字段类型设定要点。
- 数据集为 2007 年 8 月美国股票市场 level1 TAQ 数据集。
- 数据按日分为 23 个 CSV 文件。
- 数据条数为 6,561,693,704 条。
- 在 Druid 字段规则中,DATE 字段指定为 timestamp 列。
- 在 Druid 字段规则中,其它字段用作 dimension 字段。
数据分区方案
本节描述 DolphinDB 的组合分区方案与 Druid 的时间范围分区方案。
- DolphinDB 采用“股票代码 + 日期”的组合分区。
- DolphinDB 将股票代码范围分为 128 个分区。
- DolphinDB 将日期分为 23 个分区。
- Druid 将 DATE(timestamp)按日划分为 23 个分区。
- Druid 仅支持时间范围分区的描述在文中被强调。
对比测试概述
本节说明从查询性能、I/O 性能以及磁盘占用空间三方面对比 DolphinDB 和 Druid。
- 对比维度包含数据库查询性能。
- 对比维度包含 I/O 性能。
- 对比维度包含磁盘占用空间。
数据库查询性能测试
本节描述查询语言/工具、计时方法、查询集合(7 个查询)与总体查询结论及原因解释。
- 本次测试中,Druid 使用 dsql 进行 SQL 查询。
- 每种查询操作执行 10 次,并对总时间取平均值。
- DolphinDB 使用 timer 语句评估服务端 SQL 执行时间。
- Druid 的时间来自 dsql 打印的执行时间,包含结果传输与显示。
- 查询性能测试包含 7 个查询。
- 总体结论称 DolphinDB 对几乎所有查询快约 3 到 30 倍。
- 按股票代码过滤或分组的测试中,DolphinDB 优势更明显。
I/O 性能测试(数据导入)
本节比较导入单文件与多文件的耗时,说明关闭 roll up 与并行导入影响,并引用附录脚本。
- 导入对比包含单个文件(7.8G)与多个文件(290.8G)。
- I/O 测试中关闭了 Druid 的 Roll up 功能。
- 单文件导入时,Druid 导入时间被描述为 DolphinDB 的 16 倍以上。
- DolphinDB 支持并行导入,并指出多文件导入时更快。
磁盘占用空间测试(压缩率与运行时空间)
本节比较两者压缩机制与磁盘占用差异,并解释差异来源及运行时空间构成。
- 该测试目标是比较导入后磁盘占用空间(数据压缩率)。
- DolphinDB 描述为使用 LZ4 对列式存储数据进行快速压缩。
- Druid 描述为对 timestamp 与 metrics 使用 LZ4 直接压缩。
- 结论称 DolphinDB 静态磁盘占用比 Druid 高约 80%。
- Druid 运行时产生 segment cache 目录,总磁盘占用达到 65 GB。
- DolphinDB 描述为运行时不需要额外空间。
- 结论称 DolphinDB 运行时总磁盘空间占用略小于 Druid。
小结(性能优势原因与功能差异)
本节归纳性能差异的可能来源,并补充功能完整性与 Druid 重启加载/缓存方面差异的说明。
- 性能差异归因包括存储机制与分区机制差别。
- 性能差异归因包括开发语言差别(C++ vs Java)。
- 性能差异归因包括内存管理差别。
- 性能差异归因包括算法实现差别(如排序与哈希)。
- 文中称 Druid segment-cache 清空后重启需要重新加载与解压数据。
附录 1:环境配置(DolphinDB 与 Druid 配置片段)
本节给出 DolphinDB 集群配置文件与 Druid 各组件配置参数示例。
- 包含 DolphinDB controller.cfg 的参数示例。
- 包含 DolphinDB cluster.nodes 的示例。
- 包含 Druid 的 Zookeeper、元数据存储与 deep storage 配置示例。
- 包含 Druid broker/historical 等组件的 JVM 与缓存相关参数示例。
附录 2:数据导入脚本(DolphinDB 与 Druid)
本节提供 DolphinDB 数据库脚本与 Druid index task JSON 脚本示例。
- DolphinDB 脚本示例包含创建数据库与分区要点。
- DolphinDB 脚本示例包含并行导入多个 CSV 的做法描述。
- 脚本示例中使用 `date` 与 `symbol` 作为分区键创建表。
磁盘占用差异原因与运行方式差异补充(续)
本节补充 Druid segment-cache 与重启加载对效率与空间影响的说明。
- 描述了 cache 占用空间较大的情况。
- 描述了重启需要等待较长时间的情况。
- 描述了重启需要更大空间的要求。
附录 2 导入脚本(续)
本节继续展示 Druid 导入任务配置的其余字段与参数。
- Druid 导入任务类型为 index。
- dataSource 设置为 TAQ。
- 输入格式为 CSV。
- timestamp 列为 DATE,格式为 yyyyMMdd。
- 包含维度字段(dimensions)与列定义(columns)的示例列表。
- granularitySpec 示例包含 segmentGranularity=day 与 rollup=false。
- tuningConfig 示例包含 targetPartitionSize 与 maxRowsInMemory 等参数。
Facts Index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 时序数据库DolphinDB与Druid的对比测试 | 发布日期 | 2021-08-05 | high |
| 时序数据库DolphinDB与Druid的对比测试 | 作者 | Junxi | high |
| DolphinDB | 类型/定位 | 分布式的分析型时序数据库 | high |
| Druid | 类型/定位 | 分布式的分析型时序数据库;由Java语言实现的OLAP数据仓库 | high |
| 对比测试结论(摘要) | 数据写入速度对比 | DolphinDB 的数据写入速度大约是 Druid 的 30 倍 | medium |
| 对比测试结论(摘要) | 查询速度对比 | DolphinDB 的查询速度是 Druid 的 10 倍左右 | medium |
| 对比测试结论(摘要) | 静态空间占用对比 | DolphinDB 数据库的静态空间占用比 Druid 高 80% | medium |
| 对比测试结论(摘要) | 运行时总磁盘空间对比 | DolphinDB 运行时使用的总磁盘空间略低于 Druid | medium |
| DolphinDB | 实现语言 | C++ 编写 | high |
| DolphinDB | 内置能力 | 内置流数据处理引擎、并行计算引擎和分布式计算功能 | high |
| DolphinDB | 存储/扩展 | 内置分布式文件系统;支持集群水平和垂直扩展 | high |
| DolphinDB | 查询/脚本语言 | 提供类SQL和Python的脚本语言;可用SQL操作数据并可完成复杂内存计算 | high |
| DolphinDB | API/集成 | 提供其它常用编程语言的 API,方便与已有应用程序集成 | medium |
| DolphinDB | 数据处理规模能力 | 能对万亿级数据快速处理 | low |
| DolphinDB | 应用场景 | 金融领域历史数据分析建模与实时流数据处理;物联网海量传感器数据处理与实时分析 | medium |
| Druid | 实现语言 | Java 语言实现 | high |
| Druid | 适用场景 | 适用于万亿级别数据量上的低延时查询和插入以及实时流数据分析 | medium |
| Druid | 关键技术 | 分布式、SN 架构、列式存储、倒排索引、位图索引等 | medium |
| Druid | 高可用/扩展性 | 具有高可用性和高扩展性特点 | low |
| Druid | 接口与SQL支持 | 提供多种语言接口,支持部分 SQL | medium |
| 测试硬件 | 设备型号 | DELL OptiPlex 7060 | high |
| 测试硬件 | CPU | Inter(R) Core™ i7-8700 CPU @ 3.20GHz,6核心12线程 | high |
| 测试硬件 | 内存 | 32GB | high |
| 测试硬件 | 硬盘配置 | 256GB SSD,1.8TB 希捷 ST2000DM008-2FR102 机械硬盘 | high |
| 测试环境 | 操作系统 | Ubuntu 16.04 x64 | high |
| 测试环境 | 部署形态 | 单服务器下的多节点集群 | high |
| DolphinDB(测试设置) | 数据节点数量 | 4 个 | high |
| DolphinDB(测试设置) | 单个数据节点最大可用内存 | 4GB | high |
| Druid(测试设置) | 节点数量与角色 | 5 个:overload、broker、historical、coordinator、middleManager | high |
| Druid(测试设置) | query cache | 关闭 query cache 功能(因默认缓存影响多次查询取平均) | high |
| Druid(测试设置) | roll up | 关闭 roll up 功能(为不影响写入性能测试) | high |
| 测试数据与存储介质 | 原始 CSV 文件存储位置 | HDD | high |
| 测试数据与存储介质 | 数据库存储位置 | SSD | high |
| 测试数据集(TAQ) | 时间范围 | 2007 年 8 月 美国股票市场 level1 TAQ 数据集 | high |
| 测试数据集(TAQ) | CSV 文件数量 | 按日分为 23 个 csv 文件 | high |
| 测试数据集(TAQ) | 单个文件大小范围 | 7.8G 到 19.1G | high |
| 测试数据集(TAQ) | 数据集大小 | 约 290G | high |
| 测试数据集(TAQ) | 数据条数 | 6,561,693,704 条 | high |
| Druid(字段使用规则) | DATE 字段用途 | DATE 字段指定为 timestamp 列 | high |
| Druid(字段使用规则) | 其它字段用途 | 其它字段均用作 dimension 字段 | high |
| DolphinDB(分区方案) | 分区方式 | 采用 股票代码 + 日期 组合分区;股票代码范围分为 128 个分区;日期分为 23 个分区 | high |
| Druid(分区能力) | 分区限制 | 仅支持时间范围分区 | high |
| Druid(分区方案) | 分区方式 | 将 DATE 列指定为 timestamp 类型,以日为单位,共划分为 23 个分区 | high |
| 查询性能测试 | 对比范围 | 从数据库查询性能、I/O 性能以及磁盘占用空间三方面对比 DolphinDB 和 Druid | high |
| DolphinDB(查询语言) | SQL 支持 | 脚本语言支持 SQL 语法,并针对时序数据进行了功能扩展 | high |
| Druid(查询方式) | 查询语言/工具 | 提供基于 JSON 数据格式的语言进行查询,也提供 dsql 进行 SQL 查询;本次测试使用 dsql | high |
| 查询性能测试(方法) | 重复次数与统计口径 | 每种查询操作进行 10 次;对总时间取平均值;时间单位毫秒 | high |
| 查询性能测试(计时方法) | DolphinDB 计时方式 | 使用 timer 语句评估 SQL 在服务端的执行时间 | high |
| 查询性能测试(计时方法) | Druid 计时方式 | 使用客户端命令行工具 dsql 打印的执行时间(包含结果传输与显示时间) | high |
| 查询性能测试(误差讨论) | 传输/显示时间影响 | 由于返回数据量小且 dsql 与 Druid 服务器同节点,影响时间在 1ms 左右;未做特殊处理 | medium |
| 查询性能测试 | 查询数量 | 7 个查询 | high |
| 查询性能测试结论 | 性能倍率范围 | 对于几乎所有查询,DolphinDB 速度约为 Druid 的 3 到 30 倍 | medium |
| 查询性能差异原因(分区维度) | 优势更明显的查询类型 | 在需要根据股票代码过滤或分组的测试(第 1、3、6、7 项)中 DolphinDB 优势更明显 | medium |
| Druid(segment 划分限制) | segment 划分维度 | 只允许根据时间戳进行 segment 的划分 | high |
| DolphinDB(分区能力) | 分区维度 | 允许从多个维度上对数据进行划分;本次 TAQ 分区使用时间和股票代码两个维度 | high |
| I/O 性能测试 | 导入数据规模 | 导入单个文件(7.8G)与多个文件(290.8G)进行对比 | high |
| I/O 性能测试(公平性设置) | Druid roll up | 关闭 Roll up 功能 | high |
| I/O 性能测试结论 | 单文件导入耗时对比 | 相同情况下导入单个文件,Druid 的导入时间是 DolphinDB 的 16 倍以上 | medium |
| DolphinDB(导入能力) | 导入方式 | 支持并行导入(导入多个文件时更快) | high |
| 磁盘占用测试 | 比较目标 | 比较两者数据压缩率(导入后磁盘占用空间) | high |
| DolphinDB(压缩机制) | 压缩算法 | 采用 LZ4 压缩算法,对列式存储数据进行快速压缩 | high |
| DolphinDB(SYMBOL 类型处理) | 压缩前编码 | SYMBOL 类型在压缩之前使用字典编码,将字符串转化成整型 | high |
| Druid(压缩机制) | timestamp 与 metrics 压缩 | 对 timestamp 和 metrics 采用 LZ4 算法直接压缩 | high |
| Druid(压缩机制) | dimensions 压缩手段 | 对 dimensions 字段使用字典编码、位图索引以及 roaring bitmap 进行压缩 | high |
| 磁盘占用测试结论 | 静态磁盘空间占用对比 | DolphinDB 数据库占用的磁盘空间比 Druid 高出约 80% | medium |
| 磁盘占用差异原因 | 主要因素 | BID 和 OFR 两个浮点字段在两者压缩比差异很大(DolphinDB 20%,Druid 5%) | medium |
| 磁盘占用差异原因(数据有序性) | 原因解释 | 测试数据集为历史数据且按日期和股票字段排序;短时间内报价变化小、unique 报价个数有限;Druid 位图压缩效果好 | medium |
| Druid(运行时磁盘占用) | segment cache 目录导致的总占用 | Druid 运行时产生 segment cache 目录,总的磁盘空间占用达到 65 GB | high |
| DolphinDB(运行时磁盘占用) | 额外空间需求 | 运行时不需要额外的空间 | high |
| DolphinDB vs Druid(总磁盘占用) | 运行时总占用对比 | DolphinDB 运行时总磁盘空间占用比 Druid 略小 | medium |
| 性能优势来源(小结) | 归因列表 | 存储机制和分区机制差别;开发语言(C++ vs Java)差别;内存管理差别;算法(如排序和哈希)实现差别 | medium |
| Druid(分区灵活性) | 能力差异 | 只支持时间类型范围分区,缺乏灵活性(对比 DolphinDB 支持多种分区且可多字段组合分区) | medium |
| DolphinDB(分区类型能力) | 支持的分区类型/组合分区 | 支持值分区、范围分区、散列分区和列表分区;每张表可根据多个字段进行组合分区 | high |
| DolphinDB(分区带来的性能解释) | 机制性优势 | 分区粒度更细,不易出现数据或查询集中到某个节点;查询需要扫描的数据块更少,响应时间更短 | medium |
| 功能对比(小结) | 总体结论 | 除去性能,DolphinDB 在功能上比 Druid 更为完善 | low |
| DolphinDB(SQL能力) | window function 与 join 支持 | 支持强大的 window function 机制;对 SQL join 的支持更为全面 | medium |
| DolphinDB(时序特性) | 特有功能支持 | 支持 sliding function、asof join、window join | high |
| DolphinDB(平台形态) | 一体化能力 | 集数据库、编程语言和分布式计算于一体;支持复杂内存计算、分布式计算以及流计算 | medium |
| Druid(运行方式差异) | 重启/缓存影响 | 崩溃或清空 segment-cache 后重启需花大量时间重新加载数据,将每个 segment 解压到 segment-cache 再查询;cache 占用空间大;重启需要等待较长时间并要求更大空间 | medium |
| DolphinDB(附录1 配置) | controller.cfg 参数示例 | localSite=localhost:9919:ctl9919 localExecutors=3 maxConnections=128 maxMemSize=4 webWorkerNum=4 workerNum=4 dfsReplicationFactor=1 dfsReplicaReliabilityLevel=0 enableDFS=1 enableHTTPS=0 | high |
| DolphinDB(附录1 配置) | cluster.nodes 示例 | localSite,mode localhost:9910:agent,agent localhost:9921:DFS_NODE1,datanode localhost:9922:DFS_NODE2,datanode localhost:9923:DFS_NODE3,datanode localhost:9924:DFS_NODE4,datanode | high |
| DolphinDB(附录1 配置) | cluster.cfg 参数示例 | maxConnection=128 workerNum=8 localExecutors=7 webWorkerNum=2 maxMemSize=4 | high |
| DolphinDB(附录1 配置) | agent.cfg 参数示例 | workerNum=3 localExecutors=2 maxMemSize=4 localSite=localhost:9910:agent controllerSite=localhost:9919:ctl9919 | high |
| Druid(附录1 配置) | Zookeeper 配置示例 | druid.zk.service.host=zk.host.ip;druid.zk.paths.base=/druid | high |
| Druid(附录1 配置) | 元数据存储配置示例 | druid.metadata.storage.type=mysql;connectURI=jdbc:mysql://db.example.com:3306/druid | high |
| Druid(附录1 配置) | Deep storage 配置示例 | druid.storage.type=local;druid.storage.storageDirectory=var/druid/segments | high |
| Druid broker(附录1 配置) | JVM 内存参数示例 | Xms24g Xmx24g XX:MaxDirectMemorySize=4096m | high |
| Druid broker(附录1 配置) | HTTP 线程/连接示例 | druid.broker.http.numConnections=5;druid.server.http.numThreads=25 | high |
| Druid broker(附录1 配置) | processing buffer/threads 示例 | druid.processing.buffer.sizeBytes=2147483648;druid.processing.numThreads=7 | high |
| Druid broker(附录1 配置) | query cache 关闭示例 | druid.broker.cache.useCache=false;druid.broker.cache.populateCache=false | high |
| Druid coordinator(附录1 配置) | JVM 内存参数示例 | Xms3g Xmx3g | high |
| Druid historical(附录1 配置) | JVM 内存参数示例 | Xms8g Xmx8g | high |
| Druid historical(附录1 配置) | segment cache 与容量示例 | druid.segmentCache.locations=[{"path":"var/druid/segment-cache","maxSize":0}];druid.server.maxSize=130000000000 | high |
| Druid historical(附录1 配置) | cache 关闭示例 | druid.historical.cache.useCache=false;druid.historical.cache.populateCache=false | high |
| Druid middleManager(附录1 配置) | JVM 内存参数示例 | Xms64m Xmx64m | high |
| Druid middleManager(附录1 配置) | 任务并发与线程/缓冲示例 | druid.worker.capacity=3;druid.server.http.numThreads=25;druid.indexer.fork.property.druid.processing.buffer.sizeBytes=4147483648;druid.indexer.fork.property.druid.processing.numThreads=2 | high |
| Druid overload(附录1 配置) | JVM 内存参数示例 | Xms3g Xmx3g | high |
| DolphinDB(附录2 脚本) | 数据库/表创建与分区要点(脚本中体现) | 示例脚本包含:dropDatabase("dfs://TAQ");使用 cutPoints 将 symbol 分为 128 buckets;日期范围 2007.08.01..2007.09.01;创建 HIER 分区库并以 `date` 与 `symbol` 作为分区键创建表 quotes;通过 submitJob 并行 loadTextEx 导入多个 CSV 文件 | high |
| Druid(附录2 脚本) | 导入任务类型 | type=index | high |
| Druid(附录2 脚本) | dataSource | TAQ | high |
| Druid(附录2 脚本) | 输入格式 | CSV(parseSpec.format=csv) | high |
| Druid(附录2 脚本) | timestamp 列与格式 | timestampSpec.column=DATE;format=yyyyMMdd | high |
| Druid(附录2 脚本) | 列定义(columns) | ["SYMBOL","DATE","TIME","BID","OFR","BIDSIZ","OFRSIZ","MODE","EX","MMID"] | high |
| Druid(附录2 脚本) | 维度字段(dimensions) | ["TIME","SYMBOL", {"name":"BID","type":"double"}, {"name":"OFR","type":"double"}, {"name":"BIDSIZ","type":"int"}, {"name":"OFRSIZ","type":"int"}, "MODE","EX","MMID"] | high |
| Druid(附录2 脚本) | granularitySpec | segmentGranularity=day;queryGranularity=none;intervals=["2007-08-01/2007-09-01"];rollup=false | high |
| Druid(附录2 脚本) | ioConfig.firehose | type=local;baseDir=/data/data/;filter=TAQ.csv | high |
| Druid(附录2 脚本) | appendToExisting | false | high |
| Druid(附录2 脚本) | tuningConfig | targetPartitionSize=5000000;maxRowsInMemory=25000;forceExtendableShardSpecs=true | high |