DolphinDB与Elasticserach在金融数据集上的性能对比测试
本页为一篇基于不同规模金融数据集的对比测试文章,围绕 DolphinDB 与 Elasticsearch 的测试动机、测试项与总体结论进行引入与概述。
Source: https://dolphindb.cn/blogs/51
What this page covers
- 文章信息与对比测试的动机、测试项与结论概览。
- DolphinDB 与 Elasticsearch 的系统定位与特性介绍。
- 基准测试硬件与测试环境(单机多节点集群)配置。
- 测试数据集规模、时间范围与字段类型映射说明。
- 分区/分片方案与副本设置对比。
- 查询性能、导入 I/O、磁盘占用、内存占用与功能差异的对比测试。
- 小结与附录链接(配置、代码与脚本)。
技能认证特训营第二期正式开启(限时报名)
页面顶部提供活动报名与福利优惠相关引导信息。
- 提供“技能认证特训营第二期”的报名入口链接。
- 该区块用于引导限时报名相关行动。
DolphinDB与Elasticserach在金融数据集上的性能对比测试
该部分给出文章信息,并引入对比测试的动机、测试项与总体结论。
- 作者署名为 Junxi。
- 发布日期为 2021-08-05。
- 测试对象为 DolphinDB 与 Elasticsearch,覆盖不同规模金融数据集。
- 测试内容包括 I/O、磁盘空间占用、内存消耗与数据库查询。
- 总体结论表述为:DolphinDB 在相关测试中优于 Elasticsearch。
1. 系统介绍
该部分介绍 DolphinDB 与 Elasticsearch 的系统定位、核心特性,并给出概念映射关系。
- DolphinDB 被描述为分析型的分布式时序数据库。
- DolphinDB 采用列式存储。
- DolphinDB 内置流数据处理、并行与分布式计算引擎,并提供分布式文件系统与集群扩展支持。
- Elasticsearch 被描述为基于 Lucene 的搜索服务器,面向文档进行存储的分布式系统。
- 给出 Elasticsearch 与关系型数据库概念的映射关系(Indices/Types/Documents/Fields 对应)。
2. 系统配置
该部分描述基准测试硬件配置与单机多节点集群的软件/参数设置。
- 测试硬件型号为 DELL OptiPlex 7060。
- CPU 为 Inter(R) Core i7-8700 @ 3.20GHz,6 核心 12 线程。
- 内存为 32GB,硬盘为 2TB 机械硬盘,操作系统为 Ubuntu 16.04 x64。
- 部署形态为单服务器下的多节点集群。
- DolphinDB 与 Elasticsearch 均配置为 4 个节点(并给出单节点内存等参数)。
3. 测试数据集
该部分说明三个不同规模金融数据集的来源、时间范围与规模,并说明字段类型映射(以图片呈现)。
- 使用三个不同规模的股票数据集:CN_Stock、US_Prices、TAQ。
- CN_Stock 时间范围为 2008.01.01 到 2017.12.31。
- US_Prices 时间范围为 1990.01.02 到 2016.12.30。
- TAQ 数据为 2007 年 8 月份的 4 天美国股票市场 level1 高频数据。
- TAQ 原始数据大小为 60.6 GB。
4. 分区/分片方案
该部分对比 DolphinDB 分区机制与 Elasticsearch 分片机制,并给出各表的分区/分片与副本设置。
- DolphinDB database 提供值分区、范围分区、列表分区、哈希分区与组合分区。
- Elasticsearch 仅支持基于哈希的分片机制。
- DolphinDB 对 CN_Stock 表按时间每半年分区,共 20 个分区,副本个数 1。
- DolphinDB 对 TAQ 表采用日期与股票代码组合分区,共 100 个分区,副本个数 1。
- Elasticsearch 对 CN_Stock 与 US_Prices 的分片个数为 4;对 TAQ 的分片个数为 100;副本个数为 1。
5. 对比测试
该部分从查询性能、I/O、磁盘占用、内存占用与其他功能差异等维度,对 DolphinDB 与 Elasticsearch 进行对比测试。
- DolphinDB 的脚本语言支持 SQL 语法并在其基础上扩展。
- Elasticsearch 进行 SQL 查询需要安装插件;也提供基于 JSON 的 DSL 查询方式。
- 为公平对比,Elasticsearch 使用 scroll 接口并调整 buckets 大小以控制返回全部结果。
- 查询性能测试中,每种查询操作进行 10 次,取总时间平均值(毫秒)。
- 查询性能结论中,同表测试里 DolphinDB 多次领先;简单过滤查询领先 1~2 个数量级。
- Elasticsearch 提供 _bulk API 进行批量写入数据。
- I/O 导入测试中,当数据量为 60.6GB 时,Elasticsearch 导入耗时 12 小时以上。
- 磁盘占用结论:Elasticsearch 磁盘需求约为 DolphinDB 的 8 到 11 倍(同测试结论表述)。
6. 小结
该部分总结与指出 Elasticsearch 与专业时序数据库在功能与性能上的差距,并给出附录链接。
- 小结称:Elasticsearch 与专业时序数据库相比,在功能与性能上差距较大。
- 小结指出:当数据量超过物理内存上限时,内存与磁盘占用问题更明显,历史数据计算性能下降。
- 附录提供详细配置信息、测试代码与数据导入脚本,并链接至 GitHub 文档。
Facts Index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 文章 | 发布日期 | 2021-08-05 | high |
| 作者 | 署名 | Junxi | high |
| 对比测试 | 测试对象 | DolphinDB 与 Elasticsearch 在不同规模金融数据集上的综合对比测试 | high |
| 对比测试 | 测试内容 | I/O、磁盘空间占用、内存消耗、数据库查询(过滤查询和分组统计) | high |
| 测试结论 | 总体结论 | DolphinDB 在金融数据处理领域测试中完胜 Elasticsearch | medium |
| 分组统计(聚合计算) | 性能差异 | DolphinDB 的表现优于 Elasticsearch 约 10 倍,且数据集越大优势越明显;涉及时间类型字段时优势尤为突出 | medium |
| 简单过滤查询 | 性能差异 | DolphinDB 的性能是 Elasticsearch 的 100 倍 | medium |
| 数据导入 | 耗时差异 | Elasticsearch 的耗时是 DolphinDB 的 25~75 倍,且数据集增大时差距有变大趋势 | medium |
| 磁盘空间占用 | 差异描述 | DolphinDB 压缩原始数据;Elasticsearch 为维护文档索引等信息(不包括临时数据)占用比原始数据更大的空间,总体差距约 10 倍 | medium |
| DolphinDB | 产品类型/定位 | 分析型的分布式时序数据库 | high |
| DolphinDB | 存储方式 | 列式存储 | high |
| DolphinDB | 内置能力 | 内置流数据处理引擎、并行计算和分布式计算引擎,并提供分布式文件系统,支持集群扩展 | high |
| DolphinDB | 实现语言 | C++ | high |
| DolphinDB | 脚本语言 | 提供类SQL和Python的脚本语言对数据进行操作 | high |
| DolphinDB | API支持 | 提供其它常用编程语言的API,方便与已有应用程序集成 | medium |
| DolphinDB | 适用场景 | 金融领域历史数据分析建模与实时流数据处理;物联网海量传感器数据处理与实时分析 | high |
| Elasticsearch | 产品类型/定位 | 基于 Lucene 的搜索服务器 | high |
| Elasticsearch | 系统特征 | 基于本地磁盘存储数据的分布式系统,并面向文档进行存储 | high |
| Elasticsearch 与关系型数据库概念映射 | 映射关系 | Relational DB=>Databases=>Tables=>Rows=>Columns;Elasticsearch=>Indices=>Types=>Documents=>Fields | high |
| 基准测试硬件/系统 | 设备型号 | DELL OptiPlex 7060 | high |
| 基准测试硬件/系统 | CPU | Inter(R) Core i7-8700 @ 3.20GHz,6核心12线程 | high |
| 基准测试硬件/系统 | 内存 | 32GB | high |
| 基准测试硬件/系统 | 硬盘 | 2TB 机械硬盘 | high |
| 基准测试硬件/系统 | 操作系统 | Ubuntu 16.04 x64 | high |
| 测试环境 | 部署形态 | 单服务器下的多节点集群 | high |
| DolphinDB(测试配置) | 数据节点个数 | 4 个 | high |
| DolphinDB(测试配置) | 单个数据节点最大可用内存 | 7 GB | high |
| Elasticsearch(测试配置) | 节点个数 | 4 个 | high |
| Lucene(测试配置) | 分配内存 | 8 GB | high |
| Elasticsearch(测试配置) | 单个节点最大可用内存 | 6 GB | high |
| Elasticsearch(测试配置) | swapping | 禁止 swapping | high |
| 测试数据集 | 数据集数量与类型 | 使用三个不同规模的股票数据集(CN_Stock、US_Prices、TAQ) | high |
| CN_Stock 数据集 | 时间范围 | 2008.01.01 到 2017.12.31(中国沪深股票每日报价) | high |
| US_Prices 数据集 | 时间范围 | 1990.01.02 到 2016.12.30(美国股票市场每日报价) | high |
| TAQ 数据集 | 数据范围 | 2007年8月份的4天美国股票市场 level1 高频数据 | high |
| TAQ 数据集 | 原始数据大小 | 60.6 GB | high |
| DolphinDB database | 分区机制 | 提供值分区、范围分区、列表分区、哈希分区和组合分区 | high |
| Elasticsearch | 分片机制限制 | 仅支持基于哈希的分片机制 | high |
| DolphinDB(CN_Stock 表) | 分区方案 | 按时间每半年一个分区,共 20 个分区;副本个数 1 | high |
| DolphinDB(US_Prices 表) | 分区方案 | 按时间每年一个分区,共 27 个分区;副本个数 1 | high |
| DolphinDB(TAQ 表) | 分区方案 | 日期、股票代码组合分区,共 100 个分区;副本个数 1 | high |
| Elasticsearch(CN_Stock、US_Prices 表) | 分片个数 | 4 | high |
| Elasticsearch(TAQ 表) | 分片个数 | 100 | high |
| Elasticsearch(测试设置) | 副本个数 | 1 | high |
| DolphinDB | 查询语言支持 | 脚本语言支持 SQL 语法,并在其基础上扩展 | high |
| Elasticsearch | SQL 查询支持方式 | 需要安装插件以进行 SQL 语句查询;也提供基于 JSON 的 DSL 语言查询 | high |
| Elasticsearch | 默认返回限制(普通 query) | 返回的查询 hits 默认仅为 10 条 | high |
| Elasticsearch | 默认返回限制(聚合 query) | 返回的 buckets 默认大小为 10 | high |
| DolphinDB | 查询结果返回 | 每次查询返回全部结果,不存在模糊查询的情况 | medium |
| Elasticsearch 聚合结果字段 | 字段含义 | doc_count_error_upper_bound 与 sum_other_doc_count 分别表示未返回但可能存在的潜在聚合结果、以及未统计到的文档数 | high |
| 公平对比设置 | Elasticsearch 精确返回策略 | 使用 scroll 接口并定义 buckets 大小以控制返回全部查询结果(关闭模糊查询) | high |
| 查询性能测试方法 | 实现方式 | DolphinDB 查询性能测试用 DolphinDB 脚本;Elasticsearch 查询性能测试用 Python 脚本 + DSL | high |
| 查询性能测试方法 | 重复次数与统计口径 | 每种查询操作进行 10 次查询,取总时间平均值;时间单位毫秒 | high |
| CN_Stock 查询性能测试 | 数据量(记录数) | 5,332,932 | high |
| US_Prices 查询性能测试 | 数据量(记录数) | 50,591,907 | high |
| TAQ 查询性能测试 | 数据量(记录数) | 1,366,036,384 | high |
| 查询性能结论(同表) | 总体表现 | 同一张表的所有测试中,DolphinDB 性能领先 Elasticsearch 多倍;简单过滤查询领先 1~2 个数量级 | medium |
| 查询性能结论(聚合) | 平均领先倍数 | 聚合查询平均优于 Elasticsearch 8~9 倍;按时间分组的聚合查询优于 13~15 倍 | medium |
| 查询性能结论(规模效应) | 随数据规模增长的耗时变化 | 数据规模上升时,Elasticsearch 精确查询耗时增长幅度远大于 DolphinDB;DolphinDB 稳定性优于 Elasticsearch | medium |
| Elasticsearch | 批量写入接口 | 提供 _bulk API 批量写入数据功能 | high |
| Elasticsearch 数据导入流程 | 关键步骤 | 为字段定义属性与类型并构建映射,创建倒排索引形成 Lucene 段,通过 refresh/flush 机制将倒排索引存储于磁盘 | medium |
| Elasticsearch 导入性能关键因素 | 关键过程 | 将内存中的倒排索引 flush 到磁盘是决定性能的关键 | medium |
| Elasticsearch | 导入优化效果 | 即使使用 _bulk 并设置 index.refresh_interval = -1、index.number_of_replicas = 0,内存缓冲区满仍会触发 refresh 并 flush 到磁盘,优化效果不明显;导入缓慢是显著缺点 | medium |
| DolphinDB | 分布式写入机制 | 创建分布式表写入时先按分区类型决定分区数据写入节点位置;分区内采用列式存储组织数据,由节点协作完成导入与查询 | medium |
| I/O 导入测试结果 | 现象描述 | ES/DDB 载入耗时比随数据量上升而增大;当数据量为 60.6GB 时,Elasticsearch 导入耗时 12 小时以上 | medium |
| 磁盘占用对比 | 原因解释(Elasticsearch) | Elasticsearch 为每个文档构建并存储倒排索引,需要更大磁盘空间;虽对 source 字段内容压缩,但仍因额外索引信息导致膨胀 | medium |
| 磁盘占用对比 | 原因解释(DolphinDB) | DolphinDB 不需要额外索引信息,实现对原数据的压缩存储 | medium |
| 磁盘占用测试结论 | 空间对比(倍数) | Elasticsearch 存储空间约为原始文件约 2 倍;DolphinDB 实际磁盘占用低于原始文件大小;Elasticsearch 磁盘需求约为 DolphinDB 的 8 到 11 倍 | medium |
| 内存占用观测 | 观测工具 | 使用 Linux 命令 htop 监视内存占用 | high |
| 内存占用观测环境 | 内存总大小 | 32GB | high |
| 内存占用对比 | 观测结论 | Elasticsearch 在各种操作下内存占用 90% 以上;DolphinDB 处理中小规模数据时低于 10%,仅在超大规模查询时显著增加 | medium |
| Elasticsearch | SQL 语言支持限制 | 需要安装插件支持 SQL;内置 DSL 为 JSON 格式,语法较复杂 | high |
| DolphinDB | 编程范式支持 | 内置完整脚本语言,支持 SQL、命令式、向量化、函数化、元编程、RPC 等范式 | medium |
| Elasticsearch | 主要用途 | 分布式多用户能力的全文搜索引擎,支持模糊查询;文档(行)可不固定结构,不同文档可有不同字段集合 | high |
| DolphinDB | 数据类型支持限制 | 只支持结构化数据 | high |
| DolphinDB | 内置函数数量 | 600 余种 | medium |
| DolphinDB | 场景能力描述 | 可满足金融历史建模与实时流数据处理、物联网实时监控与实时分析等场景需求;提供领先/滞后、累积窗口、滑动窗口等指标函数并优化性能 | medium |
| Elasticsearch 作为时序数据库时 | 连接能力限制 | 不支持表连接 | high |
| DolphinDB | 连接能力 | 支持表连接,并对 asof join 与 window join 等非同时连接方式做优化 | medium |
| DolphinDB | 事务支持 | 对数据写入支持分布式事务 | high |
| Elasticsearch | 事务支持限制 | 不支持事务 | high |
| 小结(Elasticsearch 能力) | 支持能力 | 支持结构化与非结构化数据,支持模糊查询、精确查询与聚合计算,适合很多应用场景 | medium |
| 小结(对比结论) | 与专业时序数据库差距 | 与 DolphinDB 等专业时序数据库相比,Elasticsearch 在功能与性能上差距很大;数据量超过物理内存上限时内存耗用高、磁盘占用高的问题暴露,历史数据计算性能明显下降 | medium |
| 附录 | 内容与链接 | 提供 DolphinDB 与 Elasticsearch 详细配置信息、测试代码与数据导入脚本,链接指向 GitHub: dolphindb/Tutorials_CN/.../DolphinDB_vs_ElasticSearch_Benchmark_appendix.md | high |
| 技能认证特训营第二期 | 报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |
| Elasticsearch(背景描述) | 优势领域 | 在实时性、扩展性、易用性和全文检索方面综合表现优异 | low |
| 知乎文章引用 | 引用内容 | 引用文章《Golion:降维打击!使用ElasticSearch作为时序数据库》并称取得不错效果 | low |
| Elasticsearch 精确查询公平性设置 | scroll 与 buckets 调整目的 | 用于控制 Elasticsearch 返回全部查询结果以进行公平对比 | high |
| TAQ 查询测试中的 Elasticsearch | 错误情况 | 执行大规模记录筛选时出现 Out of memory,无法返回结果(图片说明) | medium |
| I/O 导入对比(TAQ 60.6GB) | 倍数差异(图片说明) | Elasticsearch 优化后耗时是 DolphinDB 的 76 倍以上(图片说明) | medium |