无码人妻精品一区二区三18禁,影音先锋男人AV橹橹色,污污污污污污www网站免费,日韩成人av无码一区二区三区,欧美性受xxxx狂喷水

TDengine與Cassandra對比測試

Fang Pan

2019-08-14 / ,

摘要:為幫助用戶了解TDengine Database的指標,特將TDengine與Cassandra從數據庫的讀、寫、查詢、壓縮比等方面進行了對比測試。從測試結果上看,TDengine的性能遠超Cassandra,寫入性能約為20倍,讀取性能約為17倍,聚合函數性能約為4000倍,按標簽分組查詢性能約為2500倍,按時間分組查詢性能約為119倍。

測試環境

 對比測試的測試程序和數據庫服務在同一臺4核8GB的Dell臺式機上部署,臺式機型號為OptiPlex-3050,詳細配置如下

OS: Ubuntu 16.04 x64
CPU: Intel(R) Core(TM) i3-7100 CPU @ 3.90GHz
Memory: 8GB
Disk: 1TB HDD

測試數據集及其生成方法

1.測試數據生成方法

本次測試調研了兩類比較熱門的測試數據集:

  • 1. 紐約出租車運行數據,因該數據中抹去了單臺車輛的信息,無法對其進行建模
  • 2. faker生成工具,因其只能生成字符串,并不適合物聯網場景下處理的數據。

所以,為了使得測試可輕易重復,自己寫了一個生成模擬數據的程序來進行本次測試。


 測試數據生成程序模擬若干溫濕度計生成的數據,其中溫度為整數、濕度為浮點數,同時每個溫度計包含設備ID、設備分組、設備名稱三個標簽。為了盡可能真實地模擬溫濕度計的生成數據,沒有使用完全隨機數,而是針對每個溫度計確保生成的數據值呈正態分布。


 測試數據的頻率為1秒鐘,數據集包含10000臺設備,每臺設備10000條記錄。每條數據采集記錄包含3個標簽字段,2個數據字段,1個時間戳字段。

2.測試數據生成程序源碼

 采用java程序生成測試數據集,測試程序源代碼行數較多,因此您可以到 下載,執行如下語句

cd tests/comparisonTest/dataGeneratorjavac com/taosdata/generator/DataGenerator.java

3.測試數據生成程序用法

相關參數如下

  • dataDir 生成的數據文件路徑
  • numOfFiles 生成的數據文件數目
  • numOfDevices 測試數據集中的設備數目
  • rowsPerDevice 測試數據集中每臺設備包含的記錄條數

4.生成測試數據

 執行如下命令,會在~/testdata目錄下生成100個數據文件,每個文件包含100臺設備的測試數據;合計10000臺設備,每臺設備10000條記錄

mkdir ~/testdatajava com/taosdata/generator/DataGenerator -dataDir ~/testdata -numOfDevices 10000 -numOfFiles 100 -rowsPerDevice 10000

TDengine環境準備

TDengine是一個開源的專為物聯網、車聯網、工業互聯網、IT運維等設計和優化的大數據平臺。除核心的快10倍以上的時序數據庫(Time-Series Database)功能外,還提供緩存、數據訂閱、流式計算等功能,最大程度減少研發和運維的工作量

1.安裝部署

  • 下載tdengine-1.6.1.0.tar.gz,地址//www.yakult-sh.com.cn/
  • 安裝TDengine,解壓后運行install.sh進行安裝
  • 啟動TDengine,運行sudo systemctl start taosd
  • 測試是否安裝成功,運行TDengine的shell命令行程序taos,可以看到如下類似信息

Welcome to the TDengine shell, server version:1.6.1.0 client version:1.6.1.0Copyright (c) 2017 by TAOS Data, Inc. All rights reserved.

taos>

2.數據建模

TDengine Database為相同結構的設備創建一張超級表(STable),而每個具體的設備則單獨創建一張數據表。因此,超級表的數據字段為采集時間、溫度、濕度等與時間序列相關的采集數據;標簽字段為設備編號、設備分組編號、設備名稱等設備本身固定的描述信息。
創建超級表的SQL語句為

create table devices(ts timestamp, temperature int, humidity float) tags(devid int, devname binary(16), devgroup int);


 以設備ID作為表名(例如device id為1,則表名為dev1),使用自動建表語句,寫入一條記錄的語句為

insert into dev1 using devices tags(1,'d1',0) values(1545038786000,1,3.560000);

3.測試程序源碼

 本文采用TDengine的原生C語言接口,編寫數據寫入及查詢程序,后續的其他文章會提供基于JDBCDriver的測試程序。


測試程序源代碼行數較多,因此您可以到 下載,執行如下語句

cd tdengine

make

會在當前目錄下生成可執行文件./tdengineTest

4.測試程序用法

TDengine的測試程序用法與Cassandra的用法相同,寫入相關參數

  • writeClients 并發寫入的客戶端鏈接數目,默認為1
  • rowsPerRequest 一次請求中的記錄條數,默認為100,范圍1-1000
  • dataDir 讀取的數據文件路徑,來自于測試數據生成程序
  • numOfFiles 從數據文件路徑中讀取的文件個數

例如

./tdengineTest -dataDir ./data -numOfFiles 10 -writeClients 2 -rowsPerRequest 100

查詢相關參數

  • sql 將要執行的SQL語句列表所在的文件路徑,以逗號區分每個SQL語句

例如

./tdengineTest -sql ./sqlCmd.txt

Cassandra環境準備

 Apache Cassandra是一個高度可擴展的高性能分布式數據庫,用于處理大量商用服務器上的大量數據,提供高可用性,無單點故障。這是一種NoSQL類型的數據庫。

1.安裝部署

  • 下載并安裝Cassandra

echo "deb //www.apache.org/dist/cassandra/debian 311x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list


curl //www.apache.org/dist/cassandra/KEYS | sudo apt-key add -


sudo apt-get update

sudo apt-get install cassandra

  • 啟動Cassandra服務

sudo service cassandra start

  • 測試是否安裝成功,運行Cassandra的shell命令行程序cqlsh,可以看到如下類似信息

Connected to Test Cluster at 127.0.0.1:9042.[cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]Use HELP for help.

cqlsh>

2.Cassandra數據建模

 創建一個名為Cassandra.test的measurement,所有設備都屬于該measurement。每條記錄包含六個數據字段,分別為時間戳(毫秒),溫度(整型),濕度(浮點),設備編號(整型)、設備分組編號(整型)、設備名稱(字符型)。主鍵為(設備分組編號、設備編號、設備名稱,時間戳)。因為Cassandra的where語句里只對主鍵進行搜索,所以在后面查詢時需要進行篩選的列一定要放進主鍵里。同時,因為Cassandra里group by語句只能對主鍵且按照主鍵的順序進行聚合,所以這里將后面聚合查詢用到的設備分組編號放在主鍵的第一位。

3.Cassandra測試程序源碼

 本文采用Cassandra的原生Java語言接口,編寫數據寫入及查詢程序,測試程序源代碼行數較多,因此您可以到 下載。


 安裝Cassandra Java 客戶端。本次測試使用DataStax提供的客戶端,具體可見。 DataStax使用maven管理源碼,在Cassandra/Cassandratest/pom.xml 里DataStax客戶端已經被添加入maven的庫里。

4.Cassandra測試程序用法

測試準備


由于Cassandra建表寫入查詢速度比較慢,在本次測試中很容易出現timeout錯誤,測試無法進行下去。因此測試前一定需要修改Cassandra服務端和客戶端的timeout的默認值。

  • 服務端修改, 將/etc/Cassandra/Cassandra.yaml 中所有含有“timeout”的設置選項里的默認值增加100-1000倍。
  • 客戶端修改, 在測試源代碼Cassandra/目錄下提供了“application.conf”文件,里面修改了客戶端timeout默認值,執行源代碼時需要提供這個文件的路徑。

寫入相關參數

  • writeClients 并發寫入的客戶端鏈接數目,默認為1
  • rowsPerRequest 一次請求中的記錄條數,默認為100,范圍1-1000
  • dataDir 讀取的數據文件路徑,來自于測試數據生成程序
  • numOfFiles 從數據文件路徑中讀取的文件個數
  • conf Cassandra客戶端參數文件所在路徑(修改timeout默認值)

例如

cd cassandra/cassandratest/target


java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -datadir ./data -numofFiles 100 -rowsperrequest 2000 -writeclients 4 -conf cassandra/application.conf

查詢相關參數

  • sql 將要執行的SQL語句列表所在的文件路徑,以逗號區分每個SQL語句

例如

cd cassandra/cassandratest/target


java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql cassandra/sqlCmd.txt -conf cassandra/application.conf

寫入性能對比

 數據庫的一個寫入請求可以包含一條或多條記錄,一次請求里包含的記錄條數越多,寫入性能就會相應提升。在以下測試中,使用R/R表示Records/Request ,即一次請求中的記錄條數。同時,一個數據庫可以支持多個客戶端鏈接,鏈接數增加,系統總的寫入通吐量也會相應增加。因此測試中,對于每一個數據庫,都會測試一個客戶端和多個客戶端連接的情況。

1.TDengine的寫入性能

 TDengine按照每次請求包含1,100,500,1000,2000條記錄各進行測試,同時也測試了不同客戶端連接數的情況。測試步驟如下所示,您可以修改示例中的參數,完成多次不同的測試。

1.清空上次測試數據

運行TDengine的shell命令行程序taos,執行刪除測試數據庫語句Welcome to the TDengine shell, server version:1.6.1.0 client version:1.6.1.0Copyright (c) 2017 by TAOS Data, Inc. All rights reserved.


taos>drop database db;


2.測試執行開啟5個客戶端讀取~/testdata目錄中的100個數據文件,每個請求寫入1000條數據,可以參考如下命令./tdengineTest -dataDir ~/testdata -numOfFiles 100 -writeClients 5 -rowsPerRequest 1000

寫入吞吐量如下,單位為記錄數/秒

R/R1 client2 clients3 clients4 clients5 clients6 clients7 clients
126824436995513762869645296864772277
100415800734484895522976085108790211710741192199
50047984688261210830321195100126919613642561417004
100050075191449411219141239157136798914181041476560
2000512820105552011741641306904142663514584341477208
表1 TDengine的寫入吞吐量
TDengine與Cassandra對比測試 - TDengine Database 時序數據庫
圖1 TDengine的寫入吞吐量

2.Cassandra的寫入性能

 Cassandra按照每次請求包含1,10,50, 100,500,1000條記錄各進行測試,同時也測試了不同客戶端連接數的情況。測試步驟如下所示,您可以修改示例中的參數,完成多次不同的測試。

1.清空上次測試數據運行Cassandra的shell命令行程序cqlsh,可以看到如下類似信息Connected to Test Cluster at 127.0.0.1:9042.[cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]Use HELP for help.cqlsh> drop database Cassandra;


2.測試執行開啟5個客戶端讀取~/testdata目錄中的100個數據文件,每個請求寫入1000條數據,可以參考如下命令java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -dataDir ~/testdata -numOfFiles 100 -writeClients 5 -rowsPerRequest 1000 -conf cassandra/application.conf

寫入吞吐量如下,單位為記錄數/秒

R/R1 client2 clients3 clients4 clients5 clients6 clients7 clients
13515492555295991633163806597
1035998355423512434135350773588636102
5031743494235162655752572825681555831
10038328503875451956940578535933561708
50030417362643807839066394593975839918
100021555252932622426559267652651126693
表2 Cassandra的寫入吞吐量
TDengine與Cassandra對比測試 - TDengine Database 時序數據庫
圖2 Cassandra的寫入吞吐量

3.TDengin和Cassandra的最佳性能對比

 基于以上的測試數據,將TDengine和Cassandra測試出的最佳寫入速度進行對比,結果如下

R/R1 client2 clients3 clients4 clients5 clients6 clients7 clients
TDengine512820105552011741641306904142663514584341477208
Cassandra38328503875451956940578355933561708
表3 TDengine和Cassandra的最佳寫入性能對比
TDengine與Cassandra對比測試 - TDengine Database 時序數據庫
圖3. TDengine和Cassandra的最佳寫入性能對比

 從圖3可以看出,TDengine的寫入速度約為百萬條記錄/秒的量級,而Cassandra的寫入速度約為1~10萬條記錄/秒的量級。因此可以得出結論,在同等數據集和硬件環境下,TDengine的寫入速度遠高于Cassandra,約為20倍。

讀取性能對比

本測試做了簡單的遍歷查詢,就是將寫入的數據全部讀出。

1. TDengine的測試方法

測試SQL語句存儲在tdengine/q1.txt中,測試SQL語句參考select * from db.devices where devgroup=0;


執行方法如下

./tdengineTest -sql ./q1.txt

2.Cassandra的測試方法


測試SQL語句存儲在Cassandra/q1.txt中,測試SQL語句參考select * from devices where devgroup=0;


執行方法如下

java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -conf cassandra/application.conf -sql cassandra/q1.txt

讀取速度如下,單位為秒

LatencyG-0G-10G-20G-30G-40G-50G-60G-70G-80G-90
TDengine0.2350.2120.2080.2180.2090.2100.2090.2090.2160.208
Cassandra3.923.683.653.613.693.573.553.593.663.64
表4 TDengine和Cassandra的讀取性能對比
TDengine與Cassandra對比測試 - TDengine Database 時序數據庫
圖4 TDengine和Cassandra的讀取性能對比

 從圖表中可以看出,TDengine的100萬條的讀取速度穩定在0.21秒,吞吐量約為500萬條記錄/秒,Cassandra的100萬條的讀取速度大約在3.6秒,吞吐量約為30萬條記錄/秒。所以從測試結果來看,TDengine的查詢吞吐量高于Cassandra,約為Cassandra的17倍。

聚合函數性能對比

 本單元的測試包含COUNT,AVERAGE,SUM,MAX,MIN這五個TDEngine和Cassandra共有的聚合函數。所有測試函數都會搭配篩選條件(WHERE)來選取設備的十分之一、十分之二、十分之三、直到全部設備。

1.TDengine的聚合函數性能

測試SQL語句存儲在tdengine/q2.txt中,測試SQL語句參考
select count(*) from db.devices where devgroup<10;


執行方法如下
./tdengineTest -sql ./q2.txt

查詢速度如下表,單位為秒


Latency10%20%30%40%50%60%70%80%90%100%
count0.0180.0260.0160.0180.0170.0240.0240.0270.0300.033
avg0.0070.0140.0150.0200.0240.0380.0440.0500.0570.060
sum0.0060.0100.0190.0180.0310.0360.0340.0370.0430.046
max0.0070.0130.0150.0200.0250.0300.0350.0390.0450.049
min0.0060.0100.0160.0240.0320.0390.0450.0410.0430.049
spread0.0070.0100.0150.0190.0330.0380.0460.0520.0590.066
表5 TDengine聚合函數性能
TDengine與Cassandra對比測試 - TDengine Database 時序數據庫
圖5 TDengine聚合函數性能

2.Cassandra的聚合函數性能

測試SQL語句存儲在Cassandra/q2.txt中。

select count(*) from devices where devgroup<10;


執行方法如下
Java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql cassandra/q2.txt -conf cassandra/application.conf


查詢速度如下表,單位為秒


Latency10%20%30%40%50%60%70%80%90%100%
count33.7967.2387.64105.82131.52160.88188.70213.85240.39264.49
mean28.8857.8387.16114.87145.30173.32204.11235.33261.29290.97
sum29.3558.1986.24115.56145.73173.81203.94234.15260.41292.51
max28.9457.8585.60115.02145.62175.08202.53232.61260.37288.46
min29.5858.2687.27117.22144.01174.20201.88235.98263.69290.27

表6 Cassandra聚合函數性能
TDengine與Cassandra對比測試 - TDengine Database 時序數據庫
圖6 Cassandra聚合函數性能

3.聚合函數性能對比

 基于以上的測試數據,將TDengine和Cassandra在1億條記錄數據集的測試結果進行對比

Latencycountaveragesummaxmin
TDengine0.0330.060.0460.0490.049
Cassandra264.49290.97291.51288.46290.27
表7 聚合函數性能對比
TDengine與Cassandra對比測試 - TDengine Database 時序數據庫
圖7 聚合函數性能對比

 從圖7可以看出,TDengine的聚合函數查詢時間在100毫秒以內,而Cassandra的查詢時間在200~300秒左右。因此可以得出結論,在同等數據集和硬件環境下,TDengine的聚合查詢速度遠遠高于Cassandra,超過100倍。

按標簽分組查詢性能對比

 本測試做了按標簽分組函數的性能測試,測試函數會搭配篩選條件(WHERE)來選取設備的十分之一、十分之二、十分之三、直到全部設備。


1. TDengine的測試方法
測試SQL語句存儲在tdengine/q3.txt中,例如

select count(temperature), sum(temperature), avg(temperature) from db.devices where devgroup<10 group by devgroup;

執行方法如下

./tdengineTest -sql ./q3.txt

2. Cassandra的測試方法
測試SQL語句存儲在Cassandra/q3.txt中,例如

select count(temperature), sum(temperature), avg(temperature) from db.devices where devgroup<10 group by devgroup;

執行方法如下

java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql cassandra/q3.txt -conf cassandra/application.conf

讀取速度如下,單位為秒

Latency10%20%30%40%50%60%70%80%90%100%
TDengine0.0300.0280.0310.0410.0690.0660.0770.0910.1020.123
Cassandra31.4062.2192.12122.01154.95185.03217.46249.59281.86308.89
表8 TDengine和Cassandra的按標簽分組查詢性能對比
TDengine與Cassandra對比測試 - TDengine Database 時序數據庫
圖8 TDengine和Cassandra的按標簽分組查詢性能對比

 從測試結果來看,TDengine的分組聚合查詢速度遠高于Cassandra,約為3000倍。

按時間分組性能對比

 本測試做了按時間分組函數的性能測試,測試函數會搭配篩選條件(WHERE)來選取設備的十分之一、十分之二、十分之三、直到全部設備。

1. TDengine的測試方法
測試SQL語句存儲在tdengine/q4.txt中,例如

select count(temperature), sum(temperature), avg(temperature) from db.devices where devgroup<10 interval(1m);

執行方法如下

./tdengineTest -sql ./q4.txt

2. Cassandra的測試方法
因為前面提到的Cassandra 在where和group by 語句里的限制,在測試之前,需要重新寫入數據,在原表中加入“minute”這一列,同時將它放入主鍵的第一位。執行下面命令再寫入一次數據

java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -datadir ~/testdata -numofFiles 100 -rowsperrequest 2000 -writeclients 4 -conf cassandra/application.conf -timetest

測試SQL語句存儲在Cassandra/q4.txt中,例如

select count(temperature), sum(temperature), mean(temperature) from devices where devgroup<10 group by minute;

執行方法如下

java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql cassandra/q4.txt -conf cassandra/application.conf

讀取速度如下,單位為秒

Latency10%20%30%40%50%60%70%80%90%100%
TDengine0.2370.4720.6530.9021.1341.4221.7531.7842.0852.549
Cassandra131.35153.87169.40188.86203.47227.61250.41274.53294.87303.51
表9 TDengine和Cassandra的按時間分組查詢性能對比
TDengine與Cassandra對比測試 - TDengine Database 時序數據庫
圖9 TDengine和Cassandra的按時間分組查詢性能對比

 從測試結果來看,TDengine的按時間分組聚合查詢速度遠高于Cassandra,約為100倍。

壓縮比對比

1.原始數據的磁盤占用

 本次測試共生成100個測試數據文件,存儲在~/testdata目錄下,使用du命令查看~/testdata目錄的文件大小

cd ~/testdata

du -h .

如下圖所示

TDengine與Cassandra對比測試 - TDengine Database 時序數據庫
圖10 原始數據的磁盤占用情況

2.查看TDengine的磁盤占用

 TDengine的磁盤文件默認位置在目錄/var/lib/taos/data下,在查看磁盤文件大小時,首先將TDengine的服務停止

sudo systemctl stop taosd

然后,調用du命令,查看/var/lib/taos/data目錄下文件的大小

cd /var/lib/taos/datadu -h .

如下圖所示

TDengine與Cassandra對比測試 - TDengine Database 時序數據庫
圖11 TDengine的磁盤占用情況

3.查看Cassandra的磁盤占用

 Cassandra的磁盤文件默認位置在目錄/var/lib/Cassandra/data/keyspace_name下,在查看磁盤文件大小時,首先將Cassandra的服務停止

sudo service Cassandra stop

 本測試中,數據存儲在/var/lib/Cassandra/data/Cassandra目錄下,調用du命令,查看該目錄下文件的大小。

cd /var/lib/Cassandra/data/Cassandra

du -sh .

如下圖所示

TDengine與Cassandra對比測試 - TDengine Database 時序數據庫
圖12 Cassandra的磁盤占用情況

4.磁盤占用情況對比

 生成的測試數據文件占用的磁盤大小為3941MB,Cassandra磁盤占用12GB,TDengine磁盤占用459MB。在相對比較隨機數據集的情況下,TDengine的壓縮比約為Cassandra壓縮比的26.7倍。


 在物聯網場景下,大多數采集數據的變化范圍都比較小。由于TDengine采用列式存儲,因此可以預期,TDengine在真實場景的壓縮比表現會更好。

功能對比

 TDengine與Cassandra都是用與處理時序數據的存儲引擎,其功能比較接近,各有特色。

功能支持TDengineCassandra
SQL語法支持支持不支持
查詢中的計算支持*支持不支持
非主鍵分組支持不支持
私有化部署支持支持支持
水平擴展能力支持支持
系統連接管理支持支持
查詢任務管理支持支持
數據導入工具支持支持
數據導出工具支持支持
Web管理工具支持支持
多介質分級存儲支持支持
Telegraf數據采集支持支持
Grafana數據可視化支持支持
RESTFul支持支持
C/C++支持不支持
JDBC/ODBC支持不支持
GO支持支持
Python支持支持
數據庫參數配置支持支持
配置副本數支持支持
數據時效支持支持
數據分區支持支持
流式計算支持不支持
數據訂閱支持不支持
微秒級精度支持支持
聚合函數支持支持支持
數據降采樣支持支持
數據分頁支持支持
數據插值支持支持
歷史數據修改不支持支持
時間線刪除支持支持
數據清空支持支持

表10 TDengine與Cassandra的功能對比
 *note: Cassandra的select語句中不支持數學運算,如有需要,可以使用用戶自定義函數。具體參見

總結

 此次測試,從數據庫的讀、寫、查詢、壓縮比等方面對TDengine和Cassandra進行了對比測試。測試用數據集、測試程序源碼、執行的SQL語句都可以從 下載,測試具備可重復性。


 從測試結果上看,TDengine Database的性能遠超Cassandra,寫入性能約為20倍,讀取性能約為17倍,聚合函數性能約為4000倍,按標簽分組查詢性能約為2500倍,按時間分組查詢性能約為119倍,具體見下表。

TDengineCassandra
寫入吞吐量1477208 記錄數/秒記錄數61708/秒
100萬條記錄讀取時間0.21秒3.64秒
1億條記錄取平均值時間0.06秒264.49秒
1億條記錄按標簽分組取均值時間0.123308.39秒
1億條記錄按時間分組取均值時間2.549秒303.51秒

表11 TDengine與Cassandra的性能對比匯總