DolphinDB与Spark的性能对比测试报告

本页提供一份关于 DolphinDB、Spark(含 Spark+Hive)在同一数据集与环境下进行性能对比测试的报告信息(含作者与发布日期)。

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

What this page covers

技能认证特训营活动提示

页面顶部包含活动报名提示信息,并提供限时报名链接入口。

DolphinDB与Spark的性能对比测试报告(标题与作者日期)

本节给出报告标题、作者与发布日期等基本信息。

概述

本节介绍 Spark/Hive/Hadoop 与 DolphinDB 的定位与特性,并说明三种方案的性能对比范围与指标。

环境配置(硬件与集群)

本节说明测试硬件环境、相关软件版本与部署方式,并描述并发测试的资源约束与分配特征。

数据集及数据库设计

本节说明使用的 NYSE TAQ 数据集的来源与规模,并给出各系统的分区与存储设计方案。

数据导入和查询测试(导入、空间、查询、并发)

本节对比三种方案在导入耗时、磁盘占用、查询、内存计算与并发查询方面的表现,并给出原因分析与稳定性现象。

小结

本节汇总导入、存储占用、SQL 查询、计算能力与并发稳定性结论,并给出适用建议与部署复杂度观察。

附录(数据预览、Hive建表语句、导入脚本/配置)

本节提供数据预览信息,以及 Hive 建表语句、DolphinDB 导入脚本片段与 Spark/Hive 导入配置参数。

Facts Index

Entity Attribute Value Confidence
DolphinDB与Spark的性能对比测试报告publish_date2021-08-05high
DolphinDB与Spark的性能对比测试报告authorJunxihigh
Sparkdescription基于内存计算的通用大数据并行计算框架,内置批处理、流处理、机器学习和图处理等组件。high
Hivedescription基于Hadoop的数据仓库,支持类SQL命令查询,用于提升Hadoop易用性。high
Spark与Hive、Hadoop组合使用rationale利用Hive的数据分区方便管理与过滤数据,提高查询效率。medium
DolphinDBimplementation_languageC++high
DolphinDBdescription高性能分布式时序数据库,内置高吞吐低延迟的列式内存引擎,集成功能强大的编程语言,支持类Python和SQL的脚本语言。high
DolphinDBdata_source_abstraction内部用Data Source抽象分区数据;一个Data Source可以是内置数据库分区或外部数据。high
DolphinDBlocal_compute_advantage当Data Source为内置数据库分区时,大部分计算可在本地完成,从而提升计算与查询效率。medium
性能对比测试范围systems_comparedDolphinDB;Spark直接访问HDFS(Spark+Hadoop,文中称Spark);Spark通过Hive访问HDFS(Spark+Hive+Hadoop,文中称Spark+Hive)。high
性能对比测试内容measures数据导入、磁盘空间占用、数据查询、多用户并发查询。high
测试硬件环境servers_count两台配置完全相同的服务器(机器1、机器2)。high
测试硬件环境host_modelDELL PowerEdge R730xdhigh
测试硬件环境cpuIntel Xeon(R) CPU E5-2650 v4(24核 48线程 2.20GHz)high
测试硬件环境memory512 GB(32GB × 16,2666 MHz)high
测试硬件环境disk17T HDD(1.7T × 10,222 MB/s读取;210 MB/s写入)high
测试硬件环境network万兆以太网high
测试硬件环境osCentOS Linux release 7.6.1810 (Core)high
DolphinDBversion_testedLinux v0.95high
DolphinDB测试集群control_node_location控制节点部署在机器1上high
DolphinDB测试集群data_nodes每台机器部署三个数据节点,共六个数据节点high
DolphinDB数据节点workers_executors_memory每个数据节点配置8个worker,7个executor,24G内存high
Sparkversion_tested2.3.3high
Apache Hadoopversion_tested2.9.0high
Hiveversion_tested1.2.2high
Hadoop与Spark部署mode完全分布式模式;机器1为Master;机器1、机器2均具有Slavehigh
Hive部署与元数据metastore机器1、机器2上都具有Hive;元数据存储在机器1上的MySql数据库中high
Spark与Spark+Hive提交方式submission_modeStandalone模式下的client方式提交应用high
测试资源配置(DolphinDB/Spark/Spark+Hive)disk_count均配置6块硬盘high
测试资源约束(不同并发数)total_cpu_memory_sameCPU、内存总和都相同:48个线程、144G内存high
Spark与Spark+Hive单应用资源executors_per_app每个应用有6个executorhigh
Spark与Spark+Hive多用户并发资源分配per_user_resources_decrease多用户并发时单个用户使用资源会随用户数量增多而减少high
单用户资源分配(Spark与Spark+Hive)threads_memory_at_concurrency并发从1到8时,单用户线程从48降至6,内存从144GB降至18GBhigh
数据集name_sourceNYSE提供的TAQ数据集high
TAQ数据集content_description包含8000多支股票在2007.08.01-2007.08.31一个月内的Level 1报价数据(交易时间、股票代码、买入价、卖出价、买入量、卖出量等)high
TAQ数据集records_count65亿(6,561,693,704)条报价记录high
TAQ数据集files_and_size一个CSV保存一个交易日;该月23个交易日;未压缩23个CSV共计277GBhigh
TAQ数据来源urlhttps://www.nyse.com/market-data/historicalhigh
DolphinDB数据库分区设计(TAQ)partitioning按date、symbol列组合分区;第一分区用DATE值分区(23个分区);第二分区用SYMBOL范围分区(100个分区);每个分区约120Mhigh
Spark在HDFS上的数据组织(TAQ)storage_layout23个csv对应23个目录high
Spark+Hive分区设计(TAQ)partitioning两层分区:第一层按DATE静态分区,第二层按SYMBOL动态分区high
数据导入测试方法data_distribution原始数据均匀分布在两台服务器的6个硬盘上以充分利用集群资源high
DolphinDB数据导入方式import_method通过异步多节点方式并行导入数据high
Spark与Spark+Hive数据导入方式import_method并行启动6个应用读取数据并存储到HDFShigh
导入性能对比(表3解释文字)import_time_for_277gbDolphinDB 8分钟;Spark 34分钟;Spark+Hive 52分钟high
导入性能倍数(表3解释文字)relative_speedDolphinDB导入速度约为Spark的4.25倍、Spark+Hive的6.5倍high
磁盘占用对比(表4解释文字)disk_space_after_import_277gbDolphinDB 50GB;Spark 26.4GB;Spark+Hive 28.9GBhigh
Spark与Spark+Hive磁盘占用较小原因(表4解释文字)reasonHDFS上采用默认带Snappy压缩的Parquet格式medium
DolphinDB导入性能优势原因reason使用C++编写且内部优化,充分利用磁盘IOmedium
查询测试公平性措施cache_clearing每个查询多次测试;每次前通过Linux命令清除页面缓存、目录项缓存和硬盘缓存;DolphinDB还清除内置缓存high
查询语句覆盖范围(表5描述)coverage涵盖分组、排序、条件、聚合、点查询、全表查询等场景,用于评估不同用户数量下性能high
单用户查询测试方法timing_statistic耗时为查询8次的平均用时(用于单用户查询结果描述)high
DolphinDB vs Spark(单用户查询)relative_performance_summaryDolphinDB查询性能约为Spark+HDFS的200倍左右(文中总结性表述)medium
DolphinDB vs Spark(Q1-Q6差异原因)reasonQ1-Q6以DolphinDB分区字段过滤;DolphinDB仅加载指定分区而无需全表扫描;Spark需要全表扫描high
DolphinDB vs Spark(Q7差异原因)reasonQ7需全表扫描;DolphinDB仅加载相关列;Spark需加载所有数据;加载主导导致差距缩小high
DolphinDB vs Spark+Hive(单用户查询)relative_performance_summaryDolphinDB性能明显优于Spark+Hive,为Spark+Hive的数十倍(文中总结性表述)medium
Spark+Hive单用户查询failure_case执行全表扫描查询Q7时出现内存溢出,无法得出结果high
DolphinDB相对Spark+Hive优势原因reasonSpark+Hive读取HDFS属于跨系统访问,涉及序列化、网络传输、反序列化耗时;DolphinDB多在本地完成计算减少传输high
计算能力对比测试设计method先将数据加载到内存再计算;每次测试包含两条语句(加载+计算);DolphinDB自动缓存数据;Spark用默认缓存机制创建临时表TmpTblhigh
计算能力测试统计口径timing_statistic耗时为测试5次的平均用时high
DolphinDB vs Spark(纯计算)relative_performance_summary在数据已在内存、排除磁盘IO后,DolphinDB计算效率仍显著优于Spark(文中总结性表述)medium
DolphinDB计算效率原因reasonC++编写、自主管理内存;内置更高效算法;相比Spark基于JVM管理内存更高效medium
Spark计算性能影响因素(文中分析)reason按HDFS块加载,块内包含不同symbol值需筛选;广播变量压缩传输后在executor解压影响性能medium
多用户并发查询测试queries_and_statistic使用表5查询语句;耗时为查询8次平均用时high
并发增加对耗时的影响trend随着并发数量增加,三者查询时间逐渐增加high
Spark多用户并发failure_case8个用户并发时性能显著下降;执行Q7会导致worker死亡high
Spark+Hive多用户并发failure_case多用户访问基本稳定,但执行Q7一直出现内存溢出异常high
Spark+Hive相对Spark的效率原因(并发段落)reason分区与过滤使查询数据量较小,优于Spark扫描全部数据medium
DolphinDB并发优势解释(资源/共享)reason多用户数据共享减少加载数据资源占用;Spark资源针对具体应用且并发增加导致单用户资源减少从而性能下降medium
导入性能小结relative_speedDolphinDB导入速度为Spark与Spark+Hive的4-6倍medium
磁盘占用小结relative_disk_spaceDolphinDB占用磁盘空间约为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_observationDolphinDB较轻量,集群搭建简单快速;Spark+Hive+Hadoop集群安装配置非常复杂medium
Hive建表语句(附录2)schema_partition_storageTAQ表字段:time TIMESTAMP, bid DOUBLE, ofr DOUBLE, bidsiz INT, ofrsiz INT, mode INT, ex TINYINT, mmid STRING;分区:date DATE, symbol STRING;存储:PARQUEThigh
Spark/Hive导入配置(附录)spark_submit_params--master local[8] --executor-memory 24Ghigh