車聯網屬於物聯網的一個分支,經過車載終端採集數據,利用無線網絡傳輸到雲服務平臺進行持久化存儲,最終提供基於實時/歷史數據的個性化服務。git
目前初創型的車輛網企業,接入的車輛一般低於10萬,數據採集頻率遠遠大於1秒。這個級別的數據規模,若是採用HBase系的技術方案,須要至少6臺8核32G配置的機器,而採用TDengine做爲數據存儲引擎,一臺2核8G的機器就能夠完成。github
TDengine做爲時序處理引擎,能夠徹底不用Kafka、HDFS/HBase/Spark、Redis等軟件,大幅簡化大數據平臺的設計,下降研發成本和運營成本。由於須要集成的開源組件少,於是系統能夠更加健壯,也更容易保證數據的一致性。sql
車載終端採集的數據字段很是多,不少企業按照國標ISO 22901創建數據模型,也有公司按照業務須要使用自定義的數據模型。但一般,採集數據都包含以下字段,本文也採用這種方法構造數據模型。數據庫
不一樣於其餘時序數據引擎,TDengine爲每輛車單首創建一張數據表,數據字段爲採集時間、車輛標誌、經度、緯度、海拔、方向、速度等與時間序列相關的採集數據;標籤字段爲車牌號、車輛型號等車輛自己固定的描述信息。這裏面有一個小技巧,浮點數據壓縮比相對整型數據壓縮比不好,經度緯度一般精確到小數點後7位,所以將經度緯度增大1E7倍轉爲長整型存儲,將海拔、方向、速度增大1E2倍轉爲整型存儲。緩存
建立數據庫的語句爲bash
create database db cache 8192 ablocks 2 tblocks 1000 tables 10000;
複製代碼
建立超級表的SQL語句爲網絡
create table vehicle(ts timestamp, longitude bigint, latitude bigint, altitude int, direction int, velocity int) tags(card int, model binary(10));
複製代碼
以車輛vid做爲表名(例如vid爲1,車牌號爲25746,類型爲bmw),那麼建立數據表的語句爲多線程
create table v1 using tags(25746, ‘bmw’);
複製代碼
仍然以車輛v1爲例,寫入一條記錄到表v1的SQL語句爲架構
insert into v1 values(1562150939000,1,2,3,4,5);
複製代碼
測試數據的生成,能夠採用批量數據寫入方法,相似運維
insert into v1 values(1562150939000,1,1,1,1,1) (1562150969000,2,2,2,2,2) (1562150999000,3,3,3,3,3) (……)(……);
複製代碼
本文采用C語言編寫了一個車輛模擬數據生成程序,該程序首先10萬張數據表,而後每張數據表寫入1個月的數據(數據間隔1分鐘,計44000條數據)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "time.h"
#include "taos.h"
int main(int argc, char *argv[]) {
taos_init();
TAOS *taos = taos_connect("127.0.0.1", "root", "taosdata", NULL, 0);
if (taos == NULL) {
printf("failed to connect to server, reason:%s\n", taos_errstr(taos));
exit(1);
}
if (taos_query(taos, "create database db cache 8192 ablocks 2 tblocks 1000 tables 10000") != 0) {
printf("failed to create database, reason:%s\n", taos_errstr(taos));
exit(1);
}
taos_query(taos, "use db");
char sql[65000] = "create table vehicles(ts timestamp, longitude bigint, latitude bigint, altitude int, direction int, velocity int) tags(card int, model binary(10))";
if (taos_query(taos, sql) != 0) {
printf("failed to create stable, reason:%s\n", taos_errstr(taos));
exit(1);
}
int begin = time(NULL);
for (int table = 0; table < 100000; ++table) {
sprintf(sql, "create table v%d using vehicles tags(%d, 't%d')", table, table, table);
if (taos_query(taos, sql) != 0) {
printf("failed to create table t%d, reason:%s\n", table, taos_errstr(taos));
exit(1);
}
for (int loop = 0; loop < 44; loop++) {
int len = sprintf(sql, "insert into v%d values", table);
for (int row = 0; row < 1000; row++) {
len += sprintf(sql + len, "(%ld,%d,%d,%d,%d,%d)", 1561910400000L + 60000L * (row + loop * 1000L), row, row, row, row, row);
}
if (taos_query(taos, sql) != 0) {
printf("failed to insert table t%d, reason:%s\n", table, taos_errstr(taos));
}
}
}
int end = time(NULL);
printf("insert finished, time spend %d seconds", end - begin);
}
}
複製代碼
將改C文件命名爲test.c,在相同目錄下建立makefile文件
ROOT = ./
TARGET = exe
LFLAGS = -Wl,-rpath,/usr/lib/ -ltaos -lpthread -lm -lrt
CFLAGS = -O3 -g -Wall -Wno-deprecated -fPIC -Wno-unused-result -Wconversion -Wno-char-subscripts -D_REENTRANT -Wno-format -D_REENTRANT -DLINUX -msse4.2 -Wno-unused-function -D_M_X64 -std=gnu99 -I/usr/local/include/taos/
all: $(TARGET)
exe:
gcc $(CFLAGS) ./test.c -o $(ROOT)/test $(LFLAGS)
clean:
rm $(ROOT)test
複製代碼
編譯以後,將測試程序和數據庫在同一臺2核8G的臺式機上運行,寫入時間共計爲3946秒,至關於4400000000條/3946秒=111.5萬條/秒,折算成點數爲111.5*5=557萬點/秒。
insert finished, time spend 3946 seconds
複製代碼
該程序是單線程運行的,如將其修改爲多線程,速度還會有更大提高,可是僅就目前的性能來看,對於車輛網的場景也已經足夠。
TDengine在數據查詢方面作了不少針對時序數據的優化。基於上面生成的測試數據集進行查詢,這是一些常見SQL語句的運行結果,性能仍是有點嚇人的。
查詢類型 | 查詢時間 |
---|---|
1車當前值查詢 | 2.3ms |
1車1小時明細查詢 | 2.1ms |
1車1日明細查詢 | 6.3ms |
1車10日明細查詢 | 15.4ms |
1車31日明細查詢 | 31.6ms |
查詢類型 | 查詢時間 |
---|---|
1車1小時聚合查詢 | 1.9ms |
1車1日聚合查詢 | 1.7ms |
1車10日聚合查詢 | 2.3ms |
1車31日聚合查詢 | 2.2ms |
查詢類型 | 查詢時間 |
---|---|
1車單日聚合查詢 | 3.2ms |
10車單日聚合查詢 | 5.1ms |
100車單日聚合查詢 | 10.4ms |
1000車單日聚合查詢 | 51.4ms |
10000車單日聚合查詢 | 455.9ms |
100000車單日聚合查詢 | 2074.8ms |
查詢類型 | 查詢時間 |
---|---|
1車單月聚合查詢 | 3.1ms |
10車單月聚合查詢 | 4.1ms |
100車單月聚合查詢 | 7.7ms |
1000車單月聚合查詢 | 33.7ms |
10000車單月聚合查詢 | 289.5ms |
100000車單月聚合查詢 | 1197.ms |
查詢類型 | 查詢時間 |
---|---|
1車單月曲線查詢 | 6.9ms |
10車單月曲線查詢 | 13.2ms |
100車單月曲線查詢 | 75.6ms |
1000車單月曲線查詢 | 710.9ms |
10000車單月曲線查詢 | 7137.6ms |
100000車單月曲線查詢 | 32130.8ms |
數據庫服務進程只消耗了約2.7GB的內存,CPU佔用能夠忽略不計。
TDengine提供的時序數據解決方案,單機狀況下的平均寫入速度在百萬條/秒級別,單輛車的全部查詢均能作到實時,多輛車的查詢速度也很是快,是車聯網乃至物聯網的必備利器。
TDengine是濤思數據擁有自主知識產權的高性能、可伸縮、高可靠、零管理的物聯網大數據平臺軟件,能夠將數據庫、緩存、消息隊列、流式計算等功能徹底融合在一塊兒。因爲針對物聯網大數據特色作了各類優化,TDengine的數據插入、查詢的性能比通用的大數據平臺好10倍以上,存儲空間也大爲節省,採用SQL接口,與第三方軟件能無縫集成,大幅簡化了物聯網平臺的系統架構,大幅減小了研發和運維的複雜度與成本。TDengine可普遍運用於物聯網、車聯網、工業大數據等領域。2019年7月12日,TDengine開源,在GitHub全球趨勢排行榜上連續幾天排名第一。
目前在GitHub上,TDengine的Star數已超10,000,GitHub地址:github.com/taosdata/TD… ,歡迎來GitHub上Star咱們!