您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)如何分析時(shí)序數(shù)據(jù)庫(kù)DolphinDB與Spark的性能對(duì)比測(cè)試報(bào)告,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
Spark是基于內(nèi)存計(jì)算的通用大數(shù)據(jù)并行計(jì)算框架,內(nèi)置多種組件,如批處理、流處理、機(jī)器學(xué)習(xí)和圖處理。Hive是基于Hadoop的數(shù)據(jù)倉(cāng)庫(kù),支持類SQL的命令查詢,提升了Hadoop的易用性。Spark與Hive、Hadoop通常是搭配使用,利用Hive中的數(shù)據(jù)分區(qū)可以方便地管理和過(guò)濾數(shù)據(jù),提高查詢效率。
DolphinDB是C++編寫(xiě)的高性能分布式時(shí)序數(shù)據(jù)庫(kù),內(nèi)置高吞吐低延遲的列式內(nèi)存引擎,集成了功能強(qiáng)大的編程語(yǔ)言,支持類Python和SQL的腳本語(yǔ)言,可以直接在數(shù)據(jù)庫(kù)中進(jìn)行復(fù)雜的編程和運(yùn)算。DolphinDB內(nèi)部用Data Source來(lái)抽象分區(qū)數(shù)據(jù)。在Data Source之上,可以完成SQL,機(jī)器學(xué)習(xí),批處理和流處理等計(jì)算任務(wù)。一個(gè)Data Source既可以是內(nèi)置的數(shù)據(jù)庫(kù)分區(qū),也可以是外部數(shù)據(jù)。如果Data Source是內(nèi)置數(shù)據(jù)庫(kù)的分區(qū),大部分計(jì)算都可以在本地完成,極大地提升了計(jì)算和查詢效率。
本報(bào)告將對(duì)DolphinDB、Spark直接訪問(wèn)HDFS(Spark+Hadoop,下文稱為Spark)、Spark通過(guò)Hive組件訪問(wèn)HDFS(Spark+Hive+Hadoop,下文稱為Spark+Hive)三者進(jìn)行性能對(duì)比測(cè)試。測(cè)試內(nèi)容包括數(shù)據(jù)導(dǎo)入、磁盤(pán)空間占用、數(shù)據(jù)查詢以及多用戶并發(fā)查詢。通過(guò)對(duì)比測(cè)試,我們能更深入的了解影響性能的主要因素,以及不同工具的最佳應(yīng)用場(chǎng)景。
2.1 硬件配置
本次測(cè)試使用了兩臺(tái)配置完全相同的服務(wù)器(機(jī)器1,機(jī)器2),各個(gè)配置參數(shù)如下:
主機(jī):DELL PowerEdge R730xd
CPU:Intel Xeon(R) CPU E5-2650 v4(24核 48線程 2.20GHz)
內(nèi)存:512 GB (32GB × 16, 2666 MHz)
硬盤(pán):17T HDD (1.7T × 10, 222 MB/s 讀??;210 MB/s 寫(xiě)入)
網(wǎng)絡(luò):萬(wàn)兆以太網(wǎng)
OS: CentOS Linux release 7.6.1810 (Core)
2.2 集群配置
測(cè)試的DolphinDB版本為L(zhǎng)inux v0.95。測(cè)試集群的控制節(jié)點(diǎn)部署在機(jī)器1上,每臺(tái)機(jī)器上各部署三個(gè)數(shù)據(jù)節(jié)點(diǎn),共六個(gè)數(shù)據(jù)節(jié)點(diǎn)。每個(gè)數(shù)據(jù)節(jié)點(diǎn)配置8個(gè)worker,7個(gè)executor,24G內(nèi)存。
測(cè)試的Spark版本為2.3.3,搭載Apache Hadoop 2.9.0。Hadoop與Spark配置為完全分布式模式,機(jī)器1為Master,并且在機(jī)器1、機(jī)器2上都具有Slave。Hive的版本是1.2.2,機(jī)器1、機(jī)器2上都具有Hive。元數(shù)據(jù)存儲(chǔ)在機(jī)器1上的MySql數(shù)據(jù)庫(kù)中。Spark 與Spark + Hive使用Standalone模式下的client 方式來(lái)提交應(yīng)用。
測(cè)試時(shí),DolphinDB、Spark、Spark+Hive均配置6塊硬盤(pán),不同并發(fā)數(shù)下使用的CPU、內(nèi)存總和都相同,都是48個(gè)線程,144G內(nèi)存。Spark與Spark+Hive使用的資源只是對(duì)于特定的應(yīng)用,每個(gè)應(yīng)用有6個(gè)executor,在多用戶并發(fā)的情況下,Spark、Spark+Hive單個(gè)用戶使用的資源會(huì)隨著用戶數(shù)量增多而減少。不同并發(fā)數(shù)下每個(gè)用戶使用的資源如表1所示。
表1.Spark、Spark+Hive不同并發(fā)數(shù)下單用戶使用的資源
3.1 數(shù)據(jù)集
測(cè)試數(shù)據(jù)集是紐約證券交易所(NYSE)提供的TAQ數(shù)據(jù)集,包含 8000 多支股票在2007.08.01-2007.08.31一個(gè)月內(nèi)的Level 1報(bào)價(jià)數(shù)據(jù),包含交易時(shí)間, 股票代碼, 買入價(jià), 賣出價(jià), 買入量, 賣出量等報(bào)價(jià)信息。數(shù)據(jù)集中共有 65 億(6,561,693,704)條報(bào)價(jià)記錄,一個(gè) CSV 中保存一個(gè)交易日的記錄,該月共23個(gè)交易日,未壓縮的 23個(gè)CSV 文件共計(jì) 277 GB。
數(shù)據(jù)來(lái)源:https://www.nyse.com/market-data/historical
3.2 數(shù)據(jù)庫(kù)設(shè)計(jì)
表2. TAQ在各個(gè)系統(tǒng)中的數(shù)據(jù)類型。
在 DolphinDB database 中,我們按照date、symbol列組合分區(qū),第一分區(qū)使用日期DATE來(lái)進(jìn)行值分區(qū),共23個(gè)分區(qū),第二分區(qū)使用股票代碼SYMBOL來(lái)進(jìn)行范圍分區(qū),分區(qū)數(shù)量100個(gè),每個(gè)分區(qū)大約120M左右。
Spark存儲(chǔ)在HDFS上的數(shù)據(jù)以23個(gè)csv對(duì)應(yīng)23個(gè)目錄。Spark+Hive采用兩層分區(qū),第一層分區(qū)使用日期DATE列進(jìn)行靜態(tài)分區(qū),第二層分區(qū)使用股票代碼SYMBOL進(jìn)行動(dòng)態(tài)分區(qū)。
具體腳本見(jiàn)附錄。
4.1 數(shù)據(jù)導(dǎo)入測(cè)試
原始數(shù)據(jù)均勻地分布在兩臺(tái)服務(wù)器的6個(gè)硬盤(pán)上,這樣可以充分利用集群中的所有資源。DolphinDB通過(guò)異步多節(jié)點(diǎn)的方式并行導(dǎo)入數(shù)據(jù),Spark與Spark+Hive并行啟動(dòng)6個(gè)應(yīng)用來(lái)讀取數(shù)據(jù),把數(shù)據(jù)存儲(chǔ)到HDFS中。各個(gè)系統(tǒng)導(dǎo)入數(shù)據(jù)的時(shí)間如表3所示。各個(gè)系統(tǒng)中數(shù)據(jù)占用的磁盤(pán)空間如表4所示。數(shù)據(jù)導(dǎo)入腳本見(jiàn)附錄。
表3. DolphinDB、Spark、Spark+Hive導(dǎo)入數(shù)據(jù)時(shí)間
表4. DolphinDB、Spark、Spark+Hive中數(shù)據(jù)占用的磁盤(pán)空間
DolphinDB的導(dǎo)入性能明顯優(yōu)于Spark和Spark+Hive,是Spark的4倍左右,是Spark + Hive的6倍左右。DolphinDB使用C++編寫(xiě)并且內(nèi)部有很多優(yōu)化,極大地利用了磁盤(pán)的IO。
DolphinDB占用的磁盤(pán)空間大于Spark與Spark+Hive,大約是他們的2倍,這是因?yàn)镾park和Spark+Hive在Hadoop上都使用Parquet格式,Parquet格式通過(guò)Spark寫(xiě)入到Hadoop上默認(rèn)使用snappy壓縮。
4.2 數(shù)據(jù)查詢測(cè)試
為保證測(cè)試公平,每個(gè)查詢語(yǔ)句要進(jìn)行多次測(cè)試,每次測(cè)試之前均通過(guò) Linux 系統(tǒng)命令分別清除系統(tǒng)的頁(yè)面緩存、目錄項(xiàng)緩存和硬盤(pán)緩存。DolphinDB還清除其內(nèi)置緩存。
表5中的查詢語(yǔ)句涵蓋了大部分查詢場(chǎng)景,包含分組、排序、條件、聚合計(jì)算、點(diǎn)查詢、全表查詢,用來(lái)評(píng)估DolphinDB、Spark、Spark+Hive在不同用戶數(shù)量提交下的性能。
表5. DolphinDB、Spark、Spark+Hive查詢語(yǔ)句
4.2.1 DolphinDB與Spark單用戶查詢測(cè)試
以下是DolphinDB與Spark單用戶查詢的結(jié)果,結(jié)果中的耗時(shí)為查詢8次的平均用時(shí)。
表6. DolphinDB、Spark單用戶查詢結(jié)果
從結(jié)果可以看出,DolphinDB的查詢性能是Spark+HDFS的200倍左右。查詢Q1到Q6都是以DolphinDB的分區(qū)字段為過(guò)濾條件,DolphinDB只需要加載指定分區(qū)的數(shù)據(jù),無(wú)需全表掃描,而Spark從Q1到Q6都需要全表掃描,耗費(fèi)大量的時(shí)間。對(duì)于查詢Q7,DolphinDB和Spark都需要全表掃描,但是DolphinDB只加載相關(guān)的列,無(wú)需加載所有列,而Spark則需要加載所有數(shù)據(jù)。由于Query運(yùn)行時(shí)間被數(shù)據(jù)加載主導(dǎo),DolphinDB和Spark的性能差距沒(méi)有之前的查詢語(yǔ)句的大。
4.2.2 DolphinDB與Spark+Hive單用戶查詢測(cè)試
由于DolphinDB的數(shù)據(jù)經(jīng)過(guò)分區(qū),且在查詢的時(shí)候?qū)崿F(xiàn)謂詞下推,效率明顯高于Spark。此處我們使用Spark搭載Hive組件來(lái)訪問(wèn)HDFS,對(duì)比DolphinDB和Spark+Hive的查詢性能。以下是DolphinDB、Spark+Hive單用戶查詢的結(jié)果,結(jié)果中的耗時(shí)為查詢8次的平均用時(shí)。
表7. DolphinDB、Spark+Hive單用戶查詢結(jié)果
結(jié)果顯示,DolphinDB的查詢性能明顯優(yōu)于Spark+Hive,是Spark+Hive的數(shù)十倍。與表6的結(jié)果相比,Spark+Hive的查詢速度比Spark要快得多,DolphinDB具有的優(yōu)勢(shì)明顯下降了很多。這是因?yàn)镠ive對(duì)數(shù)據(jù)進(jìn)行分區(qū),且在查詢語(yǔ)句的條件帶有分區(qū)字段的時(shí)候,只加載部分?jǐn)?shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)過(guò)濾,提高效率。查詢語(yǔ)句Q7掃描全表的時(shí)候會(huì)出現(xiàn)內(nèi)存溢出。
DolphinDB、Spark+Hive都對(duì)數(shù)據(jù)進(jìn)行了分區(qū),且在加載數(shù)據(jù)時(shí)都可以實(shí)現(xiàn)謂詞下推,達(dá)到數(shù)據(jù)過(guò)濾的效果,但是DolphinDB的查詢速度優(yōu)于Spark+Hive。這是因?yàn)镾park+Hive區(qū)讀取HDFS上的數(shù)據(jù)是不同系統(tǒng)之間的訪問(wèn),數(shù)據(jù)要經(jīng)過(guò)序列化、網(wǎng)絡(luò)傳輸、反序列化的過(guò)程,非常耗時(shí),從而影響性能。DolphinDB的大部分計(jì)算都在本地完成,減少了數(shù)據(jù)傳輸,因此更加高效。
4.2.3 DolphinDB與Spark計(jì)算能力對(duì)比
上面DolphinDB分別與Spark、Spark+Hive的查詢性能對(duì)比,由于數(shù)據(jù)分區(qū)、查詢時(shí)的數(shù)據(jù)過(guò)濾以及傳輸影響了Spark的性能,因此這里我們先把數(shù)據(jù)加載到內(nèi)存中,再進(jìn)行相關(guān)的計(jì)算,比較DolphinDB和Spark+Hive。我們省略了Spark+Hive,因?yàn)槭褂肏ive只是為了數(shù)據(jù)過(guò)濾,讀取HDFS上的數(shù)據(jù)更加高效,這里的測(cè)試數(shù)據(jù)已經(jīng)在內(nèi)存中。
表8是測(cè)試計(jì)算能力的語(yǔ)句。每次測(cè)試都包含兩個(gè)語(yǔ)句,第一個(gè)語(yǔ)句是把數(shù)據(jù)加載到內(nèi)存中,第二個(gè)語(yǔ)句是對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行計(jì)算。DolphinDB會(huì)自動(dòng)緩存數(shù)據(jù),Spark則通過(guò)自己的默認(rèn)緩存機(jī)制重新創(chuàng)建一個(gè)臨時(shí)表TmpTbl。
表8. DolphinDB與Spark計(jì)算能力對(duì)比語(yǔ)句
以下是DolphinDB與Spark計(jì)算能力的測(cè)試結(jié)果,結(jié)果中的耗時(shí)是測(cè)試5次的平均用時(shí)。
表9. DolphinDB與Spark計(jì)算能力測(cè)試結(jié)果
由于數(shù)據(jù)已經(jīng)在內(nèi)存中,對(duì)比表6,Spark使用的時(shí)間大幅度減少,但是DolphinDB的計(jì)算能力仍然比Spark優(yōu)越。DolphinDB用C++編寫(xiě),自己管理內(nèi)存,比起Spark使用JVM來(lái)管理內(nèi)存更加高效。另外,DolphinDB內(nèi)置了更高效的算法,提高了計(jì)算性能。
DolphinDB的分布式計(jì)算以分區(qū)為單位,計(jì)算指定內(nèi)存的數(shù)據(jù)。Spark加載整個(gè)HDFS上的塊,一個(gè)數(shù)據(jù)塊包含了具有不同symbol值的數(shù)據(jù),雖然緩存,但是仍然要篩選,所以在Q1與Q2的比值較大。Spark計(jì)算時(shí)使用的廣播變量是經(jīng)過(guò)壓縮的,傳輸?shù)狡渌膃xecutor上再解壓影響性能。
4.2.4 多用戶并發(fā)查詢
我們使用表5中的查詢語(yǔ)句,對(duì)DolphinDB、Spark、Spark+Hive進(jìn)行多用戶并發(fā)查詢測(cè)試。以下是測(cè)試結(jié)果,結(jié)果中的耗時(shí)是查詢8次的平均用時(shí)。
表10. DolphinDB、Spark、Spark+Hive多用戶并發(fā)查詢結(jié)果
圖1. DolphinDB、Spark多用戶查詢結(jié)果對(duì)比
圖2. DolphinDB、Spark+Hive多用戶查詢結(jié)果對(duì)比
從上面的結(jié)果可以看出,隨著并發(fā)數(shù)量的增加,三者的查詢時(shí)間逐漸增加。當(dāng)達(dá)到8個(gè)用戶并發(fā)的時(shí)候Spark性能較之前少量的用戶并發(fā)情況下顯著下降,Spark 在執(zhí)行Q7的時(shí)候會(huì)導(dǎo)致worker死亡。Spark+ Hive在多用戶訪問(wèn)的時(shí)候與DolphinDB一樣,基本保持穩(wěn)定,但是執(zhí)行Q7查詢語(yǔ)句的一直會(huì)出現(xiàn)內(nèi)存溢出的異常。
Spark+ Hive的查詢配置與Spark 一樣,因?yàn)橛蟹謪^(qū)的作用,并且可以過(guò)濾數(shù)據(jù),查詢數(shù)據(jù)量比較小,所以效率相對(duì)于Spark掃描全部數(shù)據(jù)比較好。
DolphinDB在并發(fā)查詢中性能明顯優(yōu)于Spark 與Spark+ Hive,從上圖可以看出在多用戶并發(fā)訪問(wèn)情況下,隨著用戶數(shù)量的增加,DolphinDB相對(duì)于Spark 的優(yōu)勢(shì)幾乎是線性增長(zhǎng),相對(duì)于Spark + Hive 的優(yōu)勢(shì)基本保持不變,體現(xiàn)了有數(shù)據(jù)分區(qū)在查詢的時(shí)候?qū)崿F(xiàn)數(shù)據(jù)過(guò)濾的重要性。
DolphinDB在多用戶并發(fā)的情況下實(shí)現(xiàn)了多用戶的數(shù)據(jù)共享,不像Spark 的數(shù)據(jù)只是針對(duì)于具體的應(yīng)用。所以在8個(gè)并發(fā)用戶的情況下,Spark 每個(gè)用戶分配到的資源比較少,性能顯著下降。DolphinDB的數(shù)據(jù)共享可以減少資源的使用,在有限的資源下,把更多的資源留給用戶計(jì)算使用,提高用戶并發(fā)的效率,增大用戶的并發(fā)數(shù)量。
在數(shù)據(jù)的導(dǎo)入方面,DolphinDB可以并行加載,Spark與Spark+Hive 則通過(guò)多個(gè)應(yīng)用同時(shí)加載來(lái)導(dǎo)入數(shù)據(jù)。DolphinDB的導(dǎo)入速度是Spark 和Spark+ Hive 的4-6倍。在磁盤(pán)空間上,DolphinDB占用的磁盤(pán)空間是Spark與Spark+ Hive在Hadoop上占用的磁盤(pán)空間的兩倍左右,Spark與Spark + Hive使用了snappy壓縮。
在數(shù)據(jù)的SQL查詢方面,DolphinDB的優(yōu)勢(shì)更加明顯。優(yōu)勢(shì)主要來(lái)自四個(gè)方面:(1)本地化計(jì)算,(2)分區(qū)過(guò)濾,(3)優(yōu)化的內(nèi)存計(jì)算,(4)跨會(huì)話的數(shù)據(jù)共享。在單用戶查詢情況下,DolphinDB的查詢速度是Spark的幾倍到上百倍,是Spark+ Hive 的幾十倍。Spark 讀取HDFS 是不同的系統(tǒng)之間的調(diào)用,其中包含了數(shù)據(jù)的序列化,網(wǎng)絡(luò),反序列化非常消耗時(shí)間,且占據(jù)很多的資源。DolphinDB的SQL查詢大部分是本地化計(jì)算,大幅減少了數(shù)據(jù)傳輸和加載的時(shí)間。Spark+ Hive 相對(duì)與Spark速度提升很大,主要是因?yàn)镾park + Hive只掃描相關(guān)分區(qū)的數(shù)據(jù),實(shí)現(xiàn)了數(shù)據(jù)的過(guò)濾。在剔除本地化和分區(qū)過(guò)濾的因素后(即所有數(shù)據(jù)已經(jīng)在內(nèi)存中),DolphinDB的計(jì)算能力仍然優(yōu)于Spark數(shù)倍。DolphinDB基于分區(qū)的分布式計(jì)算效率很高,且對(duì)內(nèi)存的管理比Spark基于JVM的管理更加優(yōu)秀。Spark的多用戶并發(fā)會(huì)隨著用戶數(shù)量的增多效率逐漸下降,在查詢大數(shù)據(jù)量的時(shí)候用戶過(guò)多導(dǎo)致worker 死亡。Spark + Hive的多用戶并發(fā)相對(duì)比較穩(wěn)定,但是加載數(shù)據(jù)過(guò)大會(huì)出現(xiàn)內(nèi)存溢出錯(cuò)誤。 多用戶情況下, DolphinDB可以實(shí)現(xiàn)數(shù)據(jù)的共享,從而減少加載數(shù)據(jù)使用的資源,查詢速度是Spark的數(shù)百倍,是Spark+Hive 的幾十倍。隨著用戶數(shù)量的增加,DolphinDB相對(duì)于Spark的性能優(yōu)勢(shì)更加明顯。涉及到分區(qū)查詢的情況下,Spark+ Hive與DolphinDB顯著提高查詢性能。
Spark是一個(gè)非常優(yōu)秀的通用分布式計(jì)算引擎,在SQL查詢、批處理、流處理、機(jī)器學(xué)習(xí)等方面均有上佳表現(xiàn)。但由于SQL查詢通常只需要對(duì)數(shù)據(jù)計(jì)算一次,相對(duì)于機(jī)器學(xué)習(xí)需要上百次的迭代,內(nèi)存計(jì)算的優(yōu)勢(shì)無(wú)法充分體現(xiàn)。因此,我們更建議將Spark用于計(jì)算密集型的機(jī)器學(xué)習(xí)。
在測(cè)試過(guò)程中,我們也發(fā)現(xiàn)DolphinDB是一個(gè)非常輕量級(jí)的實(shí)現(xiàn),集群的搭建簡(jiǎn)單快速, Spark + Hive+ Hadoop 集群安裝配置非常復(fù)雜。
附錄1. 數(shù)據(jù)預(yù)覽
附錄2. Hive創(chuàng)建表語(yǔ)句
CREATE TABLE IF NOT EXISTS TAQ (time TIMESTAMP, bid DOUBLE, ofr DOUBLE, bidsiz INT, ofrsiz INT, mode INT, ex TINYINT, mmid STRING)PARTITIONED BY (date DATE, symbol STRING) STORED AS PARQUET;
附錄3.
DolphinDB導(dǎo)入數(shù)據(jù)腳本:
fps1、fps2分別代表機(jī)器1、2上所有的csv路徑的vector fps是包含fps1和fps2 的vector allSites1、allSites2 分別代表機(jī)器1、2上數(shù)據(jù)節(jié)點(diǎn)名稱的vector allSite 是包含 allSites1和allSites2的vector DATE_RANGE=2007.07.01..2007.09.01 date_schema=database('', VALUE, DATE_RANGE) symbol_schema=database('', RANGE, buckets) db=database(FP_DB, COMPO,[date_schema,symbol_schema]) taq = db.createPartitionedTable(schema, `taq, `date`symbol) for(i in 0..1){ for(j in 0..(size(fps[i])-1)) { rpc(allSites[i][j] % size(allSite[i])],submitJob,"loadData" , "loadData" ,loadTextEx{database(FP_DB), "taq", `date`symbol, fps[i][j]} ) } }
Spark與Hive導(dǎo)入數(shù)據(jù)的配置:
--master local[8] --executor-memory 24G
看完上述內(nèi)容,你們對(duì)如何分析時(shí)序數(shù)據(jù)庫(kù)DolphinDB與Spark的性能對(duì)比測(cè)試報(bào)告有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。