时序数据库DolphinDB与Druid的对比测试

该页面是一篇对 DolphinDB 与 Druid 进行对比测试的文章,包含作者/发布日期信息,并概述测试范围、数据集规模与核心结论。

Source: https://dolphindb.cn/blogs/52

What this page covers

技能认证特训营第二期报名促销

页面顶部包含培训营活动提示与限时报名链接信息。

时序数据库 DolphinDB 与 Druid 对比测试(标题/作者/日期/摘要结论)

本节给出文章标题、作者与发布日期,并概述测试范围、数据集规模与核心结论摘要。

系统介绍

本节介绍 DolphinDB 与 Druid 的定位、架构特点与能力描述。

系统配置(硬件与环境)

本节给出测试硬件、操作系统与单服务器多节点集群的环境/参数设置。

测试数据集

本节说明所用 TAQ 数据集的时间范围、文件规模、数据量及字段类型设定要点。

数据分区方案

本节描述 DolphinDB 的组合分区方案与 Druid 的时间范围分区方案。

对比测试概述

本节说明从查询性能、I/O 性能以及磁盘占用空间三方面对比 DolphinDB 和 Druid。

数据库查询性能测试

本节描述查询语言/工具、计时方法、查询集合(7 个查询)与总体查询结论及原因解释。

I/O 性能测试(数据导入)

本节比较导入单文件与多文件的耗时,说明关闭 roll up 与并行导入影响,并引用附录脚本。

磁盘占用空间测试(压缩率与运行时空间)

本节比较两者压缩机制与磁盘占用差异,并解释差异来源及运行时空间构成。

小结(性能优势原因与功能差异)

本节归纳性能差异的可能来源,并补充功能完整性与 Druid 重启加载/缓存方面差异的说明。

附录 1:环境配置(DolphinDB 与 Druid 配置片段)

本节给出 DolphinDB 集群配置文件与 Druid 各组件配置参数示例。

附录 2:数据导入脚本(DolphinDB 与 Druid)

本节提供 DolphinDB 数据库脚本与 Druid index task JSON 脚本示例。

磁盘占用差异原因与运行方式差异补充(续)

本节补充 Druid segment-cache 与重启加载对效率与空间影响的说明。

附录 2 导入脚本(续)

本节继续展示 Druid 导入任务配置的其余字段与参数。

Facts Index

Entity Attribute Value Confidence
时序数据库DolphinDB与Druid的对比测试发布日期2021-08-05high
时序数据库DolphinDB与Druid的对比测试作者Junxihigh
DolphinDB类型/定位分布式的分析型时序数据库high
Druid类型/定位分布式的分析型时序数据库;由Java语言实现的OLAP数据仓库high
对比测试结论(摘要)数据写入速度对比DolphinDB 的数据写入速度大约是 Druid 的 30 倍medium
对比测试结论(摘要)查询速度对比DolphinDB 的查询速度是 Druid 的 10 倍左右medium
对比测试结论(摘要)静态空间占用对比DolphinDB 数据库的静态空间占用比 Druid 高 80%medium
对比测试结论(摘要)运行时总磁盘空间对比DolphinDB 运行时使用的总磁盘空间略低于 Druidmedium
DolphinDB实现语言C++ 编写high
DolphinDB内置能力内置流数据处理引擎、并行计算引擎和分布式计算功能high
DolphinDB存储/扩展内置分布式文件系统;支持集群水平和垂直扩展high
DolphinDB查询/脚本语言提供类SQL和Python的脚本语言;可用SQL操作数据并可完成复杂内存计算high
DolphinDBAPI/集成提供其它常用编程语言的 API,方便与已有应用程序集成medium
DolphinDB数据处理规模能力能对万亿级数据快速处理low
DolphinDB应用场景金融领域历史数据分析建模与实时流数据处理;物联网海量传感器数据处理与实时分析medium
Druid实现语言Java 语言实现high
Druid适用场景适用于万亿级别数据量上的低延时查询和插入以及实时流数据分析medium
Druid关键技术分布式、SN 架构、列式存储、倒排索引、位图索引等medium
Druid高可用/扩展性具有高可用性和高扩展性特点low
Druid接口与SQL支持提供多种语言接口,支持部分 SQLmedium
测试硬件设备型号DELL OptiPlex 7060high
测试硬件CPUInter(R) Core™ i7-8700 CPU @ 3.20GHz,6核心12线程high
测试硬件内存32GBhigh
测试硬件硬盘配置256GB SSD,1.8TB 希捷 ST2000DM008-2FR102 机械硬盘high
测试环境操作系统Ubuntu 16.04 x64high
测试环境部署形态单服务器下的多节点集群high
DolphinDB(测试设置)数据节点数量4 个high
DolphinDB(测试设置)单个数据节点最大可用内存4GBhigh
Druid(测试设置)节点数量与角色5 个:overload、broker、historical、coordinator、middleManagerhigh
Druid(测试设置)query cache关闭 query cache 功能(因默认缓存影响多次查询取平均)high
Druid(测试设置)roll up关闭 roll up 功能(为不影响写入性能测试)high
测试数据与存储介质原始 CSV 文件存储位置HDDhigh
测试数据与存储介质数据库存储位置SSDhigh
测试数据集(TAQ)时间范围2007 年 8 月 美国股票市场 level1 TAQ 数据集high
测试数据集(TAQ)CSV 文件数量按日分为 23 个 csv 文件high
测试数据集(TAQ)单个文件大小范围7.8G 到 19.1Ghigh
测试数据集(TAQ)数据集大小约 290Ghigh
测试数据集(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 和 Druidhigh
DolphinDB(查询语言)SQL 支持脚本语言支持 SQL 语法,并针对时序数据进行了功能扩展high
Druid(查询方式)查询语言/工具提供基于 JSON 数据格式的语言进行查询,也提供 dsql 进行 SQL 查询;本次测试使用 dsqlhigh
查询性能测试(方法)重复次数与统计口径每种查询操作进行 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 GBhigh
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 joinhigh
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=0high
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,datanodehigh
DolphinDB(附录1 配置)cluster.cfg 参数示例maxConnection=128 workerNum=8 localExecutors=7 webWorkerNum=2 maxMemSize=4high
DolphinDB(附录1 配置)agent.cfg 参数示例workerNum=3 localExecutors=2 maxMemSize=4 localSite=localhost:9910:agent controllerSite=localhost:9919:ctl9919high
Druid(附录1 配置)Zookeeper 配置示例druid.zk.service.host=zk.host.ip;druid.zk.paths.base=/druidhigh
Druid(附录1 配置)元数据存储配置示例druid.metadata.storage.type=mysql;connectURI=jdbc:mysql://db.example.com:3306/druidhigh
Druid(附录1 配置)Deep storage 配置示例druid.storage.type=local;druid.storage.storageDirectory=var/druid/segmentshigh
Druid broker(附录1 配置)JVM 内存参数示例Xms24g Xmx24g XX:MaxDirectMemorySize=4096mhigh
Druid broker(附录1 配置)HTTP 线程/连接示例druid.broker.http.numConnections=5;druid.server.http.numThreads=25high
Druid broker(附录1 配置)processing buffer/threads 示例druid.processing.buffer.sizeBytes=2147483648;druid.processing.numThreads=7high
Druid broker(附录1 配置)query cache 关闭示例druid.broker.cache.useCache=false;druid.broker.cache.populateCache=falsehigh
Druid coordinator(附录1 配置)JVM 内存参数示例Xms3g Xmx3ghigh
Druid historical(附录1 配置)JVM 内存参数示例Xms8g Xmx8ghigh
Druid historical(附录1 配置)segment cache 与容量示例druid.segmentCache.locations=[{"path":"var/druid/segment-cache","maxSize":0}];druid.server.maxSize=130000000000high
Druid historical(附录1 配置)cache 关闭示例druid.historical.cache.useCache=false;druid.historical.cache.populateCache=falsehigh
Druid middleManager(附录1 配置)JVM 内存参数示例Xms64m Xmx64mhigh
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=2high
Druid overload(附录1 配置)JVM 内存参数示例Xms3g Xmx3ghigh
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=indexhigh
Druid(附录2 脚本)dataSourceTAQhigh
Druid(附录2 脚本)输入格式CSV(parseSpec.format=csv)high
Druid(附录2 脚本)timestamp 列与格式timestampSpec.column=DATE;format=yyyyMMddhigh
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 脚本)granularitySpecsegmentGranularity=day;queryGranularity=none;intervals=["2007-08-01/2007-09-01"];rollup=falsehigh
Druid(附录2 脚本)ioConfig.firehosetype=local;baseDir=/data/data/;filter=TAQ.csvhigh
Druid(附录2 脚本)appendToExistingfalsehigh
Druid(附录2 脚本)tuningConfigtargetPartitionSize=5000000;maxRowsInMemory=25000;forceExtendableShardSpecs=truehigh