关于dolphindb:DolphinDB与Elasticserach在金融数据集上的性能对比测试

34次阅读

共计 5453 个字符,预计需要花费 14 分钟才能阅读完成。

Elasticsearch 是一款十分风行的日志检索和剖析工具,尤其在实时性、扩展性、易用性和全文检索方面有着十分优异的综合体现。知乎上有一篇文章,Golion:降维打击!应用 ElasticSearch 作为时序数据库,并且获得了十分不错的成果。很多知乎用户不禁询问,Elasticsearch 是否能够用于海量金融数据的存储和剖析?

为此咱们对 DolphinDB 和 Elasticsearch 在不同规模的金融数据集做了综合的比照测试。测试的内容包含 I /O,磁盘空间占用,内存耗费,数据库查问(过滤查问和分组统计)4 大项。测试后果没有意外,在金融数据处理畛域体现非常抢眼的时序数据库 DolphinDB 完胜 Elasticsearch。

  • 分组统计(聚合计算),DolphinDB 的体现优于 Elasticsearch 10 倍左右,而且随着数据集的增大劣势更显著。特地的,当测试用例波及工夫类型字段时,DolphinDB 的体现尤为突出。
  • 简略的过滤查问,DolphinDB 的性能是 Elasticsearch 的 100 倍。
  • 在数据导入方面,Elasticsearch 的耗时是 DolphinDB 的 25~75 倍,并且随着数据集增大,有变大的趋势。
  • 在磁盘空间占用上,DolphinDB 做到了对原始数据的压缩,而 Elasticsearch 为了保护文档的索引等信息(不包含长期数据),在磁盘上占用了比原始数据更大的空间。总体差距在 10 倍左右。

1. 零碎介绍

1.1 DolphinDB 简介

DolphinDB database 是一款剖析型的分布式时序数据库,采纳列式存储,内置流数据处理引擎,并行计算和分布式计算引擎,并提供分布式文件系统,反对集群扩大。DolphinDB 以 C ++ 编写,响应速度极快。提供类 SQL 和 Python 的脚本语言对数据进行操作。提供其它罕用编程语言的 API,不便与已有应用程序集成。在金融畛域中的历史数据分析建模与实时流数据处理,以及物联网畛域中的海量传感器数据处理与实时剖析等场景中表现出色。

1.2 Elasticsearch 简介

Elasticsearch 是一个基于 Lucene 的搜寻服务器,它是基于本地磁盘存储数据的分布式系统,并面向文档进行存储。它和传统的数据库有以下相似的比照关系:

Relational DB =>Databases =>Tables => Rows => Columns

Elasticsearch =>Indices=>Types=>Documents => Fields

Elasticsearch 集群能够蕴含多个索引 (Indices),对应 DolphinDB 的数据库;每一个索引能够蕴含多个类型 (Types),对应 DolphinDB 中的表;每一个类型蕴含多个文档 (Documents),对应 DolphinDB 数据中的行;而后每个文档蕴含多个字段 (Fields),对应 DolphinDB 中的列的概念。

2. 系统配置

2.1 硬件配置

本次测试的硬件配置如下:

设施:DELL OptiPlex 7060

CPU:Inter® Core™ i7-8700 CPU @ 3.20GHz,6 外围 12 线程

内存:32GB

硬盘:2TB 机械硬盘

操作系统:Ubuntu 16.04 x64

2.2 环境配置

本次的测试环境为单服务器下的多节点集群。为了在单机环境下最大限度地施展出两者的性能,须要对 DolphinDB 以及 Elasticsearch 进行节点参数的设置。设置 DolphinDB 的数据节点的个数为 4 个,单个数据节点最大可用内存设置为 7 GB。设置 Elasticsearch 的节点个数为 4 个,因为 Elasticsearch 基于 Lucene,故须要调配肯定内存用于 Lucene 中的段被加载入内存中,这对 Elasticsearch 的性能也会造成很大的影响,本次测试调配 8 GB 内存给 Lucene,并设置 Elasticsearch 中的单个节点的最大可用内存为 6 GB,且禁止 swapping。

3. 测试数据集

为了更加全面地测试 DolphinDB 和 Elasticsearch 的性能,咱们应用了三个不同规模的股票数据集。数据表 CN_Stock 中蕴含了从 2008.01.01 到 2017.12.31 中国沪深股票的每日报价数据。数据表 US_Prices 中蕴含了从 1990.01.02 到 2016.12.30 美国股票市场的每日报价数据。数据表 TAQ 中蕴含了 2007 年 8 月份的 4 天美国股票市场 level1 的高频数据,共 60.6 GB。测试数据集的详情如下表所示:

测试数据集在 DolphinDB 和 Elasticsearch 中各个字段的数据类型如下所示:

(1)CN_Stock 表数据类型映射


(2)US_Prices 表数据类型映射

(3)TAQ 表数据类型映射

4. 分区 / 分片计划

DolphinDB 提供了灵便的分区机制,包含值分区,范畴分区,列表分区,哈希分区和组合分区,而 Elasticsearch 仅反对基于哈希的分片机制。

在 DolphinDB 中,对于表 CN_Stock,按工夫每半年作为一个分区,共分成了 20 个分区;对于表 US_Prices,按工夫每年作为一个分区,共分成 27 个分区;对于表 TAQ,采纳日期、股票代码组合分区形式,共 100 个分区。正本个数设置为 1。

Elasticsearch 仅容许定义分片的个数。对于表 CN_Stock 和表 US_Prices,定义分片个数为 4;对于表 TAQ,定义分片个数为 100。正本个数设置为 1。

5. 比照测试

咱们从数据库查问性能、I/ O 性能、磁盘占用空间、以及内存耗费等方面对 DolphinDB 和 Elasticsearch 进行了比照测试。

5.1 数据库查问性能测试

DolphinDB 脚本语言反对 SQL 语法,同时还在其根底上进行了肯定水平的扩大,性能更加弱小。而在 Elasticsearch 中,须要装置插件来进行 SQL 语句查问,同时也提供了基于 JSON 数据格式的 DSL(Domain Specific Language 特定畛域语言)语言来进行查问,本次测试采纳 DSL 语言。

Elasticsearch 的次要利用场景为搜索引擎,它反对含糊查问,对于一般的 query,Elasticsearch 返回的查问 hits 默认仅为 10 条;对于聚合查问,其返回的 buckets 的默认大小也为 10。而 DolphinDB 中每次查问返回的后果都是全副的后果,不存在含糊查问的状况。

在 Elasticsearch 的聚合查问中,返回后果中存在字段 doc_count_error_upper_bound 以及 sum_other_doc_count,两者别离示意没有在这次聚合中返回、然而可能存在的潜在聚合后果以及这次聚合中没有统计到的文档数。这也很好的证实了 Elasticsearch 默认的对于数据查问操作仅仅只是对数据库中的局部数据进行含糊查问,而不是准确的查询数据库中的所有数据记录。为了将两者放在偏心的环境下进行测试,咱们须要敞开 Elasticsearch 的含糊查问,解决的形式是采纳 Elasticsearch 中的 scroll 接口以及定义 buckets 的大小来对管制 Elasticsearch 返回全副的查问后果。

在本次测试中,应用了 DolphinDB 脚本实现了 DolphinDB 的查问性能测试。应用了 Python 脚本 +DSL 来实现 Elasticsearch 的查问性能测试。

咱们对三张数据表进行了若干种罕用的 SQL 查问。为了减小偶尔因素对后果的影响,本次查问性能测试对每种查问操作均进行 10 次查问,而后对总工夫取平均值,工夫以毫秒为单位。各个测试数据集的测试脚本和后果如下表所示。

(1)CN_Stock 表

DolphinDB 中的查问脚本:


查问性能测试后果(数据量:5,332,932):

(2)US_Prices 表

DolphinDB 中的查问脚本:

查问性能测试后果(数据量:50,591,907):

(3)TAQ 表

DolphinDB 中的查问脚本:

查问性能测试后果(数据量:1,366,036,384):

对于本次的查问性能测试,咱们能够得出以下论断:

(1)在同一张表的所有测试中,DolphinDB 的性能都当先 Elasticsearch 多倍。特地的,对于简略的过滤查问,DolphinDB 的性能是 Elasticsearch 的性能的 1 - 2 个数量级 (见 CN_Stock 表测试后果的 1 -4、US_Prices 表测试后果的 1 -4)。

(2)在无关聚合查问的测试后果中,DolphinDB 的性能也都优于 Elasticsearch,均匀是 8~9 倍。特地的,按工夫分组的聚合查问中,DolphinDB 的性能是 Elasticsearch 的 13-15 倍 (见 CN_Stock 表测试后果的 5 -10,US_Prices 表测试后果的 5 -10)。

(3)在不同的数据规模的雷同类型的查问测试中,咱们能够看出随着数据规模的回升,Elasticsearch 的准确查问的耗时增长幅度远大于 DolphinDB,DolphinDB 在不同数据规模下的稳定性优于 Elasticsearch。

5.2 I/ O 性能测试

Elasticsearch 提供了_bulk API 批量写入数据的性能。在创立一条新的文档时,首先须要形容文档中可能蕴含的每个字段的属性,数据类型(比方 keyword, text, integer 或 date),以及这些字段是否须要被 Lucene 索引或贮存。而后 Elasticsearch 为文档的这些属性构建相应的映射,并创立倒排索引后造成 Lucene 中的段。最初通过 refresh 以及 flush 机制将倒排索引存储于磁盘上。其中将内存中的倒排索引 flush 到磁盘上这一过程是决定 Elasticsearch 性能的要害。值得注意的是,尽管 Elasticsearch 提供了_bulk API 来批量导入数据,同时也能够设置 index.refresh_interval = -1 以及 index. number_of_replicas = 0 来进行导入优化。然而在大批量数据导入的状况下,当内存中的缓冲区满的时候,依然会触发 refresh,并且进行 flush 将数据存储到磁盘上,因而优化的成果并不是很显著,Elasticsearch 数据导入迟缓是一个很显著的毛病。

DolphinDB 中创立一张分布式数据表并写入数据的时候,首先依据分布式数据表的分区类型决定不同分区的数据写入的数据节点地位。在分区外部,数据是采纳列式存储的形式进行组织,通过节点之间的配合来进行数据的导入与查问等操作,数据导入很快,性能极高。

下表是两者的数据导入的 I / O 性能测试后果,从中能够显著的察看到 ES/DDB 的载入耗时比随着数据量的回升而增大,特地的,当数据量为 60.6GB 时,Elasticsearch 导入耗时 12 个小时以上。数据导入脚本见附录。

5.3 磁盘占用空间测试

Elasticsearch 以其搜寻的高效性与时效性著称。它是基于 Lucene 而构建起来的分布式搜索引擎且对 source 字段的内容进行了压缩解决,但其外部是为每个创立的文档构建倒排索引,并将倒排索引存储在磁盘中的。因为在磁盘上须要对每个文档增加额定的索引信息,从而须要更大的存储空间来寄存。而 DolphinDB 并不需要其余的索引信息,真正做到了对原数据的压缩存储。测试后果如下表所示。


5.4 内存占用

为了更加全面的观测到 DolphinDB 与 Elasticsearch 在执行过程中的内存占用状况,应用 Linux 命令 htop 来监督 DolphinDB 和 Elasticsearch 的内存占用状况 (内存总大小为 32GB),后果如下:

5.5 其余方面比拟

(1)Elasticsearch 通过须要装置插件来反对 SQL 语言,同时其内置的 DSL 语言是 JSON 格局,语法比较复杂。而 DolphinDB 内置了残缺的脚本语言,不仅反对 SQL 语言,而且反对命令式、向量化、函数化、元编程、RPC 等多种编程范式,能够轻松实现更多的性能。

(2)Elasticsearch 的主要用途是提供了一个分布式多用户能力的全文搜索引擎,反对含糊查问,文档(行)不须要固定构造,不同文档能够具备不同字段汇合。而 DolphinDB 只反对结构化数据。

(3)DolphinDB 提供 600 余种内置函数,可满足金融畛域的历史数据建模与实时流数据处理,及物联网畛域中的实时监控与数据实时剖析解决等不同的场景需要。提供时序数据处理须要的当先、滞后、累积窗口、滑动窗口等多种指标的函数,且在性能上进行了优化,性能极优。因此与 Elasticsearch 相比,DolphinDB 领有更多的实用场景。

(4)Elasticsearch 用于时序数据库中时并不反对表连贯,而 DolphinDB 不仅反对表连贯,还对 asof join 及 window join 等非同时连贯形式做了优化。

(5)DolphinDB 对数据写入反对分布式事务,Elasticsearch 不反对事务。

6. 小结

Elasticsearch 反对结构化数据和非结构化数据,反对含糊查问,准确查问,和聚合计算,适宜很多利用场景。然而与 DolphinDB 这样业余的时序数据库相比,无论在性能上和性能上,都有很大的差距。尤其当数据量急剧收缩,超过物理内存下限时,内存耗用高、磁盘空间占用高的毛病裸露进去,对历史数据计算时性能有显著的降落。

DolphinDB 和 Elasticsearch 的具体配置信息、DolphinDB 和 Elasticsearch 的测试代码以及数据导入脚本见附录。

正文完
 0