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

使用TDengine快速搭建車聯網平臺

Simon Guan

2019-07-10 / ,

車(che)(che)聯網屬于(yu)物聯網的一個(ge)分支,通過車(che)(che)載終端采集數據,利用無線網絡傳(chuan)輸到(dao)云服(fu)務平臺(tai)進行持久(jiu)化存儲,最終提供基(ji)于(yu)實時/歷史數據的個(ge)性化服(fu)務。

目前初(chu)創型的(de)(de)(de)車輛網企業,接(jie)入的(de)(de)(de)車輛通(tong)常低于10萬(wan),數據采(cai)集(ji)頻率遠(yuan)(yuan)遠(yuan)(yuan)大于1秒(miao)。這個(ge)級別(bie)的(de)(de)(de)數據規(gui)模,如果采(cai)用(yong)HBase系的(de)(de)(de)技術(shu)方案,需要至少6臺8核32G配置的(de)(de)(de)機(ji)器,而采(cai)用(yong)TDengine Database作為數據存儲引擎,一臺2核8G的(de)(de)(de)機(ji)器就(jiu)可(ke)以完成。

技術架構

TDengine Database作為時序處理引擎,可以(yi)完全不用Kafka、HDFS/HBase/Spark、Redis等軟(ruan)件,大幅(fu)簡化大數據平臺的設(she)計,降低(di)研發成本和運(yun)營成本。因(yin)為需(xu)要集成的開源組(zu)件少,因(yin)而系(xi)統可以(yi)更加健壯,也更容易保(bao)證數據的一(yi)致性。

  • 基于HBase的解決方案,架構圖如下
TDengine Database
圖 1 基于HBase的技術架構圖
  • 而基于TDengine的解決方案,架構圖如下
TDengine Database
圖 2 基于TDengine的技術架構圖

數據模型

車載終端采(cai)集(ji)的數據(ju)(ju)字(zi)段非常(chang)多(duo),很多(duo)企業(ye)按照國標ISO 22901建立數據(ju)(ju)模型,也有公司按照業(ye)務需要使用自定義的數據(ju)(ju)模型。但通常(chang),采(cai)集(ji)數據(ju)(ju)都(dou)包(bao)含(han)如(ru)下字(zi)段,本(ben)文(wen)也采(cai)用這種方法構造數據(ju)(ju)模型。

  • 采集時間(時間戳)
  • 車輛標志(字符串)
  • 經度(雙精度浮點)
  • 維度(雙精度浮點)
  • 海拔(浮點)
  • 方向(浮點)
  • 速度(浮點)
  • 車牌號(字符串)
  • 車輛型號(字符串)
  • 車輛vid(字符串)

不同于其(qi)他時序數(shu)據(ju)引(yin)擎,TDengine為每輛(liang)車單獨創建一張數(shu)據(ju)表,數(shu)據(ju)字(zi)段為采集(ji)時間、車輛(liang)標(biao)志、經度(du)(du)(du)、緯(wei)度(du)(du)(du)、海(hai)拔(ba)、方向、速度(du)(du)(du)等與時間序列相關的(de)(de)采集(ji)數(shu)據(ju);標(biao)簽字(zi)段為車牌號、車輛(liang)型(xing)號等車輛(liang)本身固定(ding)的(de)(de)描述信息。這里面(mian)有一個小技巧,浮點(dian)數(shu)據(ju)壓縮比(bi)相對(dui)整型(xing)數(shu)據(ju)壓縮比(bi)很差,經度(du)(du)(du)緯(wei)度(du)(du)(du)通常精確到小數(shu)點(dian)后7位,因此將經度(du)(du)(du)緯(wei)度(du)(du)(du)增大(da)1E7倍(bei)轉為長整型(xing)存儲(chu),將海(hai)拔(ba)、方向、速度(du)(du)(du)增大(da)1E2倍(bei)轉為整型(xing)存儲(chu)。

創建數據庫的語句為

create database db cache 8192 ablocks 2 tblocks 1000 tables 10000;

創建(jian)超級(ji)表的(de)SQL語句為

create table vehicle(ts timestamp, longitude bigint, latitude bigint, altitude int, direction int, velocity int) tags(card int, model binary(10));

以(yi)車(che)輛vid作為(wei)(wei)表名(例如(ru)vid為(wei)(wei)1,車(che)牌號為(wei)(wei)25746,類(lei)型為(wei)(wei)bmw),那么創(chuang)建數據(ju)表的語句為(wei)(wei)

create table v1 using tags(25746, ‘bmw’);

數據寫入

仍然以車輛v1為例(li),寫入一(yi)條(tiao)記錄到(dao)表v1的(de)SQL語句為

insert into v1 values(1562150939000,1,2,3,4,5);

測試數據的生成,可以采(cai)用批量數據寫入(ru)方法,類似(si)

insert into v1 values(1562150939000,1,1,1,1,1) (1562150969000,2,2,2,2,2) (1562150999000,3,3,3,3,3) (……)(……);

本文采用C語言(yan)編寫了一個車輛模(mo)擬數(shu)(shu)據生(sheng)成程序,該(gai)程序首(shou)先10萬張數(shu)(shu)據表,然后每(mei)張數(shu)(shu)據表寫入1個月的(de)數(shu)(shu)據(數(shu)(shu)據間隔1分(fen)鐘,計44000條(tiao)數(shu)(shu)據)

#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);
   }
}

將改(gai)C文件命名為test.c,在相同目(mu)錄(lu)下創建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 

編譯之后,將測(ce)試程(cheng)序(xu)和數(shu)據庫(ku)在同(tong)一臺(tai)(tai)2核8G的(de)臺(tai)(tai)式機(ji)上運(yun)行,寫入時間共(gong)計為3946秒,相當于4400000000條/3946秒=111.5萬(wan)條/秒,折算成點(dian)數(shu)為111.5*5=557萬(wan)點(dian)/秒。

insert finished, time spend 3946 seconds

該程(cheng)序是(shi)單線程(cheng)運(yun)行的,如(ru)將其修改(gai)成多線程(cheng),速度還會有更大提升(sheng),但是(shi)僅就目前的性能(neng)來看,對于(yu)車輛網的場景(jing)也已經(jing)足(zu)夠(gou)。

數據查詢

TDengine在數據查詢(xun)方(fang)面(mian)做了很多針對時序數據的(de)優化。基于上(shang)面(mian)生成的(de)測試數據集(ji)進行查詢(xun),這是一(yi)些常見SQL語句的(de)運行結(jie)果,性能還(huan)是有(you)點嚇人的(de)。

  • 查詢總數
TDengine Database
圖 3 查詢總數

  • 單輛車的明細數據
查詢類型查詢時間
1車當前值查詢2.3ms
1車1小時明細查詢2.1ms
1車1日明細查詢6.3ms
1車10日明細查詢15.4ms
1車31日明細查詢31.6ms
TDengine Database
圖 4 單輛車的明細數據查詢

  • 單輛車的聚合查詢
查詢類型查詢時間
1車1小時聚合查詢1.9ms
1車1日聚合查詢1.7ms
1車10日聚合查詢2.3ms
1車31日聚合查詢2.2ms
TDengine Database
圖 5 單輛車的聚合查詢

  • 多輛車的單日聚合查詢
查詢類型查詢時間
1車單日聚合查詢3.2ms
10車單日聚合查詢5.1ms
100車單日聚合查詢10.4ms
1000車單日聚合查詢51.4ms
10000車單日聚合查詢455.9ms
100000車單日聚合查詢2074.8ms
TDengine Database

  • 多輛車單月聚合查詢
查詢類型查詢時間
1車單月聚合查詢3.1ms
10車單月聚合查詢4.1ms
100車單月聚合查詢7.7ms
1000車單月聚合查詢33.7ms
10000車單月聚合查詢289.5ms
100000車單月聚合查詢1197.ms
TDengine Database
圖 7 多輛車單月聚合查詢

  • 多輛車單月曲線查詢
查詢類型查詢時間
1車單月曲線查詢6.9ms
10車單月曲線查詢13.2ms
100車單月曲線查詢75.6ms
1000車單月曲線查詢710.9ms
10000車單月曲線查詢7137.6ms
100000車單月曲線查詢32130.8ms
TDengine Database
圖 8 多輛車單月曲線查詢

  • 資源消耗

TDengine Database
圖 9 Top截圖

數據(ju)庫(ku)服務(wu)進程只(zhi)消(xiao)耗了約2.7GB的內存,CPU占用(yong)可以忽略不(bu)計。

TDengine Database
圖 10 內存占用

結果分析

TDengine Database提供的時序數據解決方(fang)案,單機情況下的平均寫入速(su)度在百萬條(tiao)/秒(miao)級別(bie),單輛車(che)的所有(you)查詢均能做到(dao)實時,多輛車(che)的查詢速(su)度也非(fei)常快(kuai),是車(che)聯(lian)網乃至物聯(lian)網的必備利(li)器。