DolphinDB与Spark的性能对比测试报告
本页提供一份关于 DolphinDB、Spark(含 Spark+Hive)在同一数据集与环境下进行性能对比测试的报告信息(含作者与发布日期)。
Source: https://dolphindb.cn/blogs/59
What this page covers
- 页面顶部活动提示与报名入口相关信息。
- 报告标题、作者与发布日期信息。
- Spark/Hive/Hadoop 与 DolphinDB 的定位与对比测试范围。
- 硬件环境、版本与部署方式,以及并发资源约束。
- 数据集来源、规模,以及分区/存储设计。
- 导入、空间、查询、计算与并发等对比测试与分析。
- 小结结论、适用建议与部署复杂度观察。
技能认证特训营活动提示
页面顶部包含活动报名提示信息,并提供限时报名链接入口。
- 页面顶部展示活动报名提示。
- 页面顶部提供限时报名链接入口。
DolphinDB与Spark的性能对比测试报告(标题与作者日期)
本节给出报告标题、作者与发布日期等基本信息。
- 报告标题为“DolphinDB与Spark的性能对比测试报告”。
- 作者为 Junxi。
- 发布日期为 2021-08-05。
概述
本节介绍 Spark/Hive/Hadoop 与 DolphinDB 的定位与特性,并说明三种方案的性能对比范围与指标。
- Spark 被描述为基于内存计算的通用大数据并行计算框架。
- Hive 被描述为基于 Hadoop 的数据仓库,支持类 SQL 查询。
- DolphinDB 被描述为高性能分布式时序数据库,内置列式内存引擎与编程语言。
- 对比对象包括 DolphinDB、Spark+Hadoop(文中称 Spark)、Spark+Hive+Hadoop(文中称 Spark+Hive)。
- 对比指标包括数据导入、磁盘空间占用、数据查询与多用户并发查询。
环境配置(硬件与集群)
本节说明测试硬件环境、相关软件版本与部署方式,并描述并发测试的资源约束与分配特征。
- 测试使用两台配置完全相同的服务器(机器1、机器2)。
- 服务器型号为 DELL PowerEdge R730xd。
- 操作系统为 CentOS Linux release 7.6.1810 (Core)。
- DolphinDB 版本为 Linux v0.95。
- Spark 版本为 2.3.3;Hadoop 为 2.9.0;Hive 为 1.2.2。
数据集及数据库设计
本节说明使用的 NYSE TAQ 数据集的来源与规模,并给出各系统的分区与存储设计方案。
- 数据集来源为 NYSE 提供的 TAQ 数据集,并给出其来源链接。
- 数据集包含 8000 多支股票在 2007.08.01-2007.08.31 的 Level 1 报价数据。
- 数据集包含 65 亿(6,561,693,704)条报价记录。
- DolphinDB 分区按 date 与 symbol 组合设计,并给出分区数量与约每分区数据量。
- Spark 在 HDFS 上按交易日目录组织数据(23 个 CSV 对应 23 个目录)。
数据导入和查询测试(导入、空间、查询、并发)
本节对比三种方案在导入耗时、磁盘占用、查询、内存计算与并发查询方面的表现,并给出原因分析与稳定性现象。
- 导入 277GB 数据:DolphinDB 8 分钟;Spark 34 分钟;Spark+Hive 52 分钟。
- 导入后磁盘占用:DolphinDB 50GB;Spark 26.4GB;Spark+Hive 28.9GB。
- 查询测试覆盖分组、排序、条件、聚合、点查询与全表查询等场景。
- Spark+Hive 执行全表扫描查询 Q7 时出现内存溢出,无法得出结果。
- 随着并发数量增加,三者查询时间逐渐增加。
小结
本节汇总导入、存储占用、SQL 查询、计算能力与并发稳定性结论,并给出适用建议与部署复杂度观察。
- 导入性能小结:DolphinDB 导入速度为 Spark 与 Spark+Hive 的 4–6 倍。
- 磁盘占用小结:DolphinDB 占用空间约为 Spark 与 Spark+Hive 的两倍左右。
- 单用户查询小结:DolphinDB 查询速度为 Spark 的几倍到上百倍。
- 适用建议:更建议将 Spark 用于计算密集型的机器学习场景。
- 部署观察:DolphinDB 较轻量;Spark+Hive+Hadoop 安装配置复杂。
附录(数据预览、Hive建表语句、导入脚本/配置)
本节提供数据预览信息,以及 Hive 建表语句、DolphinDB 导入脚本片段与 Spark/Hive 导入配置参数。
- Hive TAQ 表字段、分区字段与存储格式(PARQUET)在附录中给出。
- Spark/Hive 导入配置参数示例包含“--master local[8] --executor-memory 24G”。
- Hive 表分区字段包含 date 与 symbol。
Facts Index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| DolphinDB与Spark的性能对比测试报告 | publish_date | 2021-08-05 | high |
| DolphinDB与Spark的性能对比测试报告 | author | Junxi | high |
| Spark | description | 基于内存计算的通用大数据并行计算框架,内置批处理、流处理、机器学习和图处理等组件。 | high |
| Hive | description | 基于Hadoop的数据仓库,支持类SQL命令查询,用于提升Hadoop易用性。 | high |
| Spark与Hive、Hadoop组合使用 | rationale | 利用Hive的数据分区方便管理与过滤数据,提高查询效率。 | medium |
| DolphinDB | implementation_language | C++ | high |
| DolphinDB | description | 高性能分布式时序数据库,内置高吞吐低延迟的列式内存引擎,集成功能强大的编程语言,支持类Python和SQL的脚本语言。 | high |
| DolphinDB | data_source_abstraction | 内部用Data Source抽象分区数据;一个Data Source可以是内置数据库分区或外部数据。 | high |
| DolphinDB | local_compute_advantage | 当Data Source为内置数据库分区时,大部分计算可在本地完成,从而提升计算与查询效率。 | medium |
| 性能对比测试范围 | systems_compared | DolphinDB;Spark直接访问HDFS(Spark+Hadoop,文中称Spark);Spark通过Hive访问HDFS(Spark+Hive+Hadoop,文中称Spark+Hive)。 | high |
| 性能对比测试内容 | measures | 数据导入、磁盘空间占用、数据查询、多用户并发查询。 | high |
| 测试硬件环境 | servers_count | 两台配置完全相同的服务器(机器1、机器2)。 | high |
| 测试硬件环境 | host_model | DELL PowerEdge R730xd | high |
| 测试硬件环境 | cpu | Intel Xeon(R) CPU E5-2650 v4(24核 48线程 2.20GHz) | high |
| 测试硬件环境 | memory | 512 GB(32GB × 16,2666 MHz) | high |
| 测试硬件环境 | disk | 17T HDD(1.7T × 10,222 MB/s读取;210 MB/s写入) | high |
| 测试硬件环境 | network | 万兆以太网 | high |
| 测试硬件环境 | os | CentOS Linux release 7.6.1810 (Core) | high |
| DolphinDB | version_tested | Linux v0.95 | high |
| DolphinDB测试集群 | control_node_location | 控制节点部署在机器1上 | high |
| DolphinDB测试集群 | data_nodes | 每台机器部署三个数据节点,共六个数据节点 | high |
| DolphinDB数据节点 | workers_executors_memory | 每个数据节点配置8个worker,7个executor,24G内存 | high |
| Spark | version_tested | 2.3.3 | high |
| Apache Hadoop | version_tested | 2.9.0 | high |
| Hive | version_tested | 1.2.2 | high |
| Hadoop与Spark部署 | mode | 完全分布式模式;机器1为Master;机器1、机器2均具有Slave | high |
| Hive部署与元数据 | metastore | 机器1、机器2上都具有Hive;元数据存储在机器1上的MySql数据库中 | high |
| Spark与Spark+Hive提交方式 | submission_mode | Standalone模式下的client方式提交应用 | high |
| 测试资源配置(DolphinDB/Spark/Spark+Hive) | disk_count | 均配置6块硬盘 | high |
| 测试资源约束(不同并发数) | total_cpu_memory_same | CPU、内存总和都相同:48个线程、144G内存 | high |
| Spark与Spark+Hive单应用资源 | executors_per_app | 每个应用有6个executor | high |
| Spark与Spark+Hive多用户并发资源分配 | per_user_resources_decrease | 多用户并发时单个用户使用资源会随用户数量增多而减少 | high |
| 单用户资源分配(Spark与Spark+Hive) | threads_memory_at_concurrency | 并发从1到8时,单用户线程从48降至6,内存从144GB降至18GB | high |
| 数据集 | name_source | NYSE提供的TAQ数据集 | high |
| TAQ数据集 | content_description | 包含8000多支股票在2007.08.01-2007.08.31一个月内的Level 1报价数据(交易时间、股票代码、买入价、卖出价、买入量、卖出量等) | high |
| TAQ数据集 | records_count | 65亿(6,561,693,704)条报价记录 | high |
| TAQ数据集 | files_and_size | 一个CSV保存一个交易日;该月23个交易日;未压缩23个CSV共计277GB | high |
| TAQ数据来源 | url | https://www.nyse.com/market-data/historical | high |
| DolphinDB数据库分区设计(TAQ) | partitioning | 按date、symbol列组合分区;第一分区用DATE值分区(23个分区);第二分区用SYMBOL范围分区(100个分区);每个分区约120M | high |
| Spark在HDFS上的数据组织(TAQ) | storage_layout | 23个csv对应23个目录 | high |
| Spark+Hive分区设计(TAQ) | partitioning | 两层分区:第一层按DATE静态分区,第二层按SYMBOL动态分区 | high |
| 数据导入测试方法 | data_distribution | 原始数据均匀分布在两台服务器的6个硬盘上以充分利用集群资源 | high |
| DolphinDB数据导入方式 | import_method | 通过异步多节点方式并行导入数据 | high |
| Spark与Spark+Hive数据导入方式 | import_method | 并行启动6个应用读取数据并存储到HDFS | high |
| 导入性能对比(表3解释文字) | import_time_for_277gb | DolphinDB 8分钟;Spark 34分钟;Spark+Hive 52分钟 | high |
| 导入性能倍数(表3解释文字) | relative_speed | DolphinDB导入速度约为Spark的4.25倍、Spark+Hive的6.5倍 | high |
| 磁盘占用对比(表4解释文字) | disk_space_after_import_277gb | DolphinDB 50GB;Spark 26.4GB;Spark+Hive 28.9GB | high |
| Spark与Spark+Hive磁盘占用较小原因(表4解释文字) | reason | HDFS上采用默认带Snappy压缩的Parquet格式 | medium |
| DolphinDB导入性能优势原因 | reason | 使用C++编写且内部优化,充分利用磁盘IO | medium |
| 查询测试公平性措施 | cache_clearing | 每个查询多次测试;每次前通过Linux命令清除页面缓存、目录项缓存和硬盘缓存;DolphinDB还清除内置缓存 | high |
| 查询语句覆盖范围(表5描述) | coverage | 涵盖分组、排序、条件、聚合、点查询、全表查询等场景,用于评估不同用户数量下性能 | high |
| 单用户查询测试方法 | timing_statistic | 耗时为查询8次的平均用时(用于单用户查询结果描述) | high |
| DolphinDB vs Spark(单用户查询) | relative_performance_summary | DolphinDB查询性能约为Spark+HDFS的200倍左右(文中总结性表述) | medium |
| DolphinDB vs Spark(Q1-Q6差异原因) | reason | Q1-Q6以DolphinDB分区字段过滤;DolphinDB仅加载指定分区而无需全表扫描;Spark需要全表扫描 | high |
| DolphinDB vs Spark(Q7差异原因) | reason | Q7需全表扫描;DolphinDB仅加载相关列;Spark需加载所有数据;加载主导导致差距缩小 | high |
| DolphinDB vs Spark+Hive(单用户查询) | relative_performance_summary | DolphinDB性能明显优于Spark+Hive,为Spark+Hive的数十倍(文中总结性表述) | medium |
| Spark+Hive单用户查询 | failure_case | 执行全表扫描查询Q7时出现内存溢出,无法得出结果 | high |
| DolphinDB相对Spark+Hive优势原因 | reason | Spark+Hive读取HDFS属于跨系统访问,涉及序列化、网络传输、反序列化耗时;DolphinDB多在本地完成计算减少传输 | high |
| 计算能力对比测试设计 | method | 先将数据加载到内存再计算;每次测试包含两条语句(加载+计算);DolphinDB自动缓存数据;Spark用默认缓存机制创建临时表TmpTbl | high |
| 计算能力测试统计口径 | timing_statistic | 耗时为测试5次的平均用时 | high |
| DolphinDB vs Spark(纯计算) | relative_performance_summary | 在数据已在内存、排除磁盘IO后,DolphinDB计算效率仍显著优于Spark(文中总结性表述) | medium |
| DolphinDB计算效率原因 | reason | C++编写、自主管理内存;内置更高效算法;相比Spark基于JVM管理内存更高效 | medium |
| Spark计算性能影响因素(文中分析) | reason | 按HDFS块加载,块内包含不同symbol值需筛选;广播变量压缩传输后在executor解压影响性能 | medium |
| 多用户并发查询测试 | queries_and_statistic | 使用表5查询语句;耗时为查询8次平均用时 | high |
| 并发增加对耗时的影响 | trend | 随着并发数量增加,三者查询时间逐渐增加 | high |
| Spark多用户并发 | failure_case | 8个用户并发时性能显著下降;执行Q7会导致worker死亡 | high |
| Spark+Hive多用户并发 | failure_case | 多用户访问基本稳定,但执行Q7一直出现内存溢出异常 | high |
| Spark+Hive相对Spark的效率原因(并发段落) | reason | 分区与过滤使查询数据量较小,优于Spark扫描全部数据 | medium |
| DolphinDB并发优势解释(资源/共享) | reason | 多用户数据共享减少加载数据资源占用;Spark资源针对具体应用且并发增加导致单用户资源减少从而性能下降 | medium |
| 导入性能小结 | relative_speed | DolphinDB导入速度为Spark与Spark+Hive的4-6倍 | medium |
| 磁盘占用小结 | relative_disk_space | DolphinDB占用磁盘空间约为Spark与Spark+Hive在Hadoop上占用的两倍左右;Spark与Spark+Hive使用snappy压缩 | medium |
| DolphinDB SQL查询优势来源(小结) | factors | 本地化计算、分区过滤、优化的内存计算、跨会话的数据共享 | medium |
| 单用户查询速度小结 | relative_performance | 单用户:DolphinDB查询速度为Spark的几倍到上百倍;为Spark+Hive的几十倍 | medium |
| Spark读取HDFS的开销(小结) | reason | 不同系统间调用包含序列化、网络、反序列化,消耗时间并占用资源 | medium |
| Spark+Hive相对Spark速度提升原因(小结) | reason | 只扫描相关分区数据,实现过滤 | medium |
| 纯计算能力小结 | relative_performance | 在剔除本地化与分区过滤因素后(数据已在内存),DolphinDB计算能力仍优于Spark数倍 | medium |
| Spark多用户并发稳定性(小结) | issue | 多用户并发效率随用户增多逐渐下降;查询大数据量时用户过多导致worker死亡 | medium |
| Spark+Hive多用户并发稳定性(小结) | issue | 多用户并发相对稳定,但加载数据过大会出现内存溢出错误 | medium |
| 多用户情况下的相对速度(小结) | relative_performance | 多用户:DolphinDB查询速度为Spark的数百倍,为Spark+Hive的几十倍;且用户数增加时相对Spark优势更明显 | low |
| Spark适用建议(小结) | recommended_use | 更建议将Spark用于计算密集型的机器学习(相对SQL查询通常只需计算一次,内存计算优势不充分) | medium |
| 集群部署复杂度对比(小结) | deployment_observation | DolphinDB较轻量,集群搭建简单快速;Spark+Hive+Hadoop集群安装配置非常复杂 | medium |
| Hive建表语句(附录2) | schema_partition_storage | TAQ表字段:time TIMESTAMP, bid DOUBLE, ofr DOUBLE, bidsiz INT, ofrsiz INT, mode INT, ex TINYINT, mmid STRING;分区:date DATE, symbol STRING;存储:PARQUET | high |
| Spark/Hive导入配置(附录) | spark_submit_params | --master local[8] --executor-memory 24G | high |