Apache IoTDB 系列教程-1:數據模型

什麼是時序數據?

物聯網誕生於1999年,在其理念和技術的不斷革新下,無處不在的設備和設施正在被愈來愈多的經過網絡鏈接起來,並不斷向雲端發送實況數據。數據庫

以國家級氣象觀測站爲例,全國有近6萬個氣象觀測站,每一個氣象觀測站有70種氣象物理量須要採集。某市地鐵每列列車擁有3200個指標須要測量,全市列車數達300列。服務器運維監控中,一臺服務器須要同時監測IOPS、CPU、網絡等十餘項指標。這些例子中展示出兩個概念:設備與度量指標。所謂度量指標(又被稱爲工況、測點)是指用戶關心的能反映目標的某種情況的數據項,例如CPU利用率、溫度、溼度等等。設備是指一個擁有一系列度量指標的實體,例如一臺服務器、一個進程、一列車、一個氣象觀測站等等。一個設備的一個度量指標造成了一條時序數據的惟一標識。apache

隨着時間推移,這條時序數據會產生一系列(時間戳,值)的二元組數據點,構成了時間序列數據集。所以,咱們定義一條時間序列是由一個時間序列標識(設備和度量指標),一系列時間戳和數據值對組成的無限集。一個時間序列數據庫將管理百萬甚至千萬條這樣的時間序列。服務器

IoTDB 數據模型及手動建立方式

IoTDB 的元數據管理採用目錄樹的結構,不一樣層級之間用 . 分割。根節點默認爲 root ,除此以外主要有三個概念。存儲組、設備、測點。網絡

手動建立存儲組:運維

set storage group to root.FU01

手動建立時間序列:編碼

create timeseries root.FU01.deviceType1.AZQ01.Temperature with datatype=FLOAT, encoding=GORILLA, compression=SNAPPY

設備不須要建立,當建立時間序列時會默認將倒數第二層當作設備。以上述時間序列爲例,設備 ID 會被設置爲root.FU01.deviceType1.AZQ01 。一個設備一個時間戳的多個測點值,最好一次同時寫入,儘可能避免亂序數據產生。url

當建立足夠多的時間序列後,元數據看起來就是下面這樣一顆樹了:.net

數據類型目前支持 6 種命令行

BOOLEAN、INT3二、INT6四、FLOAT、DOUBLE、TEXT

編碼方式主要有 4 種code

TS_2DIFF (時間列的默認編碼方式):適用 INT3二、INT64
RLE:適用 INT3二、INT6四、FLOAT、DOUBLE(對於 FLOAT 和 DOUBLE 是有損壓縮,默認保留2位小數,可在配置文件中修改 float_precision)
GORILLA:適用 FLOAT、DOUBLE
PLAIN:全搭

壓縮方式:

UNCOMPRESSED、SNAPPY(默認)

推薦建模方式

存儲組:推薦10-50個左右,每一個存儲組是一個獨立的存儲引擎,增長存儲組可增長寫入並行度。

設備:推薦10萬如下

總時間序列數(測點數):推薦1000萬如下

每條序列的數據條數沒有限制。

正常負載下此建模方式沒問題,若是系統提示系統負載太高,可將 enable_parameter_adapter 設置爲 false,須要手動配置參數,防止爆內存,簡單的規則爲:

memtable_size_threshold=tsfile_size_threshold

= IoTDB分配內存/2/存儲組個數/4 (有亂序數據)

= IoTDB分配內存/2/存儲組個數/2 (無亂序數據)

IoTDB 分配內存在 conf/iotdb-env.sh 中設置 MAX_HEAP_SIZE。 配置文件在 conf/iotdb-engine.properties。

推薦負載按這個調大多沒問題,負載再高能夠聯繫咱們,這個手動調整參數在 0.11 版本就會去掉,解放生產力!

一個方法判斷有無亂序:只要每一個設備寫入時間戳都是遞增的,就沒亂序數據,不然均可能產生亂序數據。

舉個例子:設備 root.turbine.d1 有三個測點 s1, s2, s3

# 無亂序數據
insert into root.turbine.d1(timestamp,s1,s2,s3) values(1,1,2,3);
insert into root.turbine.d1(timestamp,s1,s2,s3) values(2,1,2,3);

# 時間戳先寫 2,再寫 1,可能有亂序數據
insert into root.turbine.d1(timestamp,s1,s2,s3) values(2,1,2,3);
insert into root.turbine.d1(timestamp,s1,s2,s3) values(1,1,2,3);

# 時間戳先寫 1,再寫 1,雖然是不一樣測點,但還屬於一個設備,可能有亂序數據
insert into root.turbine.d1(timestamp,s1,s2) values(1,1,2);
insert into root.turbine.d1(timestamp,s3) values(1,3);

自動建立元數據模式

除了手動建立元數據的方式,還支持自動建立元數據,自動建立元數據是在數據寫入的過程進行的。主要針對提早不知道序列總數,實時消費消息隊列進行寫入的場景,代碼中就不須要每條數據都建立序列了。

當咱們對一條時間序列寫入數據時,會首先檢查其存儲組是否存在,若是不存在會自動建立。咱們把 root 定義爲第 0 層,存儲組默認是第一層,也就是 root 下的一層,可在配置文件中修改默認建立的層級 default_storage_group_level。

自動建立的數據類型是根據寫入值的類型自動推斷出來的。假如傳入的是字符串格式的數據,即用 JDBC 的 insert 語句寫入,或者 Session 中值類型爲 String 的 insertRecord(s) 接口寫入,會根據值的格式來判斷,主要有四種格式的字符串,以及默認類型:

不帶 . 的整數:如 123     =>  FLOAT
帶 . 的浮點數:如 12.34   =>  FLOAT
布爾型:true,false      =>  BOOLEAN
其餘類型:abc,124sa     =>  TEXT

對於前 3 種格式的字符串的默認類型,均可以在配置文件中配置,(0.10.0 版本,目前的 master 分支, boolean_string_infer_type 參數附近)

簡單試用

歡迎下載試用:http://iotdb.apache.org/Download/

腳本默認前臺,須要手動後臺啓動,

nohup ./sbin/start-server.sh >/dev/null 2>&1 &

接下來能夠啓動 Cli 命令行:

./sbin/start-client.sh -h 127.0.0.1 -p 6667 -u root -pw root
or
./sbin/start-client.sh  (默認用root鏈接本機)

在 0.10.0 版本中,即將更名爲 start-cli.sh

總結

今天主要介紹 IoTDB 的數據模型,快速啓動,推薦建模方式,手動調參小技巧,以及動態建立元數據相關的知識。下一節會介紹 IoTDB 的基本 SQL 查詢功能。

相關文章
相關標籤/搜索