隨著工業(yè)4.0時(shí)代的到來(lái),工業(yè)互聯(lián)網(wǎng)和企業(yè)的智能化、信息化都將不斷推進(jìn),傳統(tǒng)的工業(yè)實(shí)時(shí)數(shù)據(jù)庫(kù)和關(guān)系數(shù)據(jù)庫(kù)已經(jīng)難以完全勝任工業(yè)大數(shù)據(jù)的存儲(chǔ),
了解HBase
HBase是一個(gè)高可靠性、高性能、面向列、可伸縮的分布式存儲(chǔ)系統(tǒng),利用HBase技術(shù)可在廉價(jià)PC Server上搭建起大規(guī)模結(jié)構(gòu)化存儲(chǔ)集群。
與傳統(tǒng)數(shù)據(jù)庫(kù)的相比,
(1)線性擴(kuò)展,隨著數(shù)據(jù)量增多可以通過(guò)節(jié)點(diǎn)擴(kuò)展進(jìn)行支撐;
(2)數(shù)據(jù)存儲(chǔ)在hdfs上,備份機(jī)制健全;
(3)通過(guò)zookeeper協(xié)調(diào)查找數(shù)據(jù),訪問(wèn)速度快。
HBase實(shí)戰(zhàn)案例
為了更好的介紹HBase在人工智能場(chǎng)景下的使用,下面我們
目前,該公司的業(yè)務(wù)場(chǎng)景里面有很多面板相關(guān)的特征數(shù)據(jù),每張面板數(shù)據(jù)大概3.2k。這些面板數(shù)據(jù)又被分成很多組,每個(gè)面板特征屬于某個(gè)組。組和面板的數(shù)據(jù)分布如下:
——43%左右的組含有1張面板數(shù)據(jù);
——47%左右的組含有2~9張面板數(shù)據(jù);
——其余的組面板數(shù)范圍為10~10000張。
現(xiàn)在的業(yè)務(wù)需求主要有以下兩類:
——根據(jù)組的id查找該組下面的所有面板數(shù)據(jù);
——根據(jù)組id+面板id查找某個(gè)面板的具體數(shù)據(jù)。
原有方案:MySQL+OSS
之前業(yè)務(wù)數(shù)據(jù)量比較小的情況使用的存儲(chǔ)主要為MySQL以及OSS(對(duì)象存儲(chǔ))。相關(guān)表主要有面板組表group和面板表face。表的格式如下:
因?yàn)槊總€(gè)面板組包含的玻璃特征數(shù)相差很大(1~10000),所以基于上面的表設(shè)計(jì),我們需要
我們?nèi)绻枰鶕?jù)面板組id查找該組下面的所有面板,那么需要從MySQL中讀取很多行的數(shù)據(jù),從中獲取到組和面板對(duì)應(yīng)的關(guān)系,然后到OSS里面根據(jù)面板id獲取所有相關(guān)的特征數(shù)據(jù)。
這樣的查詢導(dǎo)致鏈路非常長(zhǎng)。從上面的設(shè)計(jì)可看出,如果查詢的組包含的面板張數(shù)比較多的情況下,那么我們需要從MySQL里面掃描很多行,然后再?gòu)腛SS里面拿到這些特征數(shù)據(jù),
HBase解決方案:
針對(duì)這兩個(gè)問(wèn)題,格創(chuàng)東智的大數(shù)據(jù)團(tuán)隊(duì)進(jìn)行了分析,認(rèn)為這是
——HBase擁有動(dòng)態(tài)列的特性,支持萬(wàn)億行,百萬(wàn)列;
——HBase支持多版本,所有的修改都會(huì)記錄在HBase中;
——HBase 2.0引入了MOB(Medium-Sized Object)特性,支持小文件存儲(chǔ)。
HBase的MOB特性針對(duì)文件大小在1k~10MB范圍的,比如圖片,短視頻,文檔等,具有低延遲,讀寫(xiě)強(qiáng)一致,檢索能力強(qiáng),水平易擴(kuò)展等關(guān)鍵能力。
上面我們創(chuàng)建了名為glass的表,IS_MOB屬性說(shuō)明列簇c將啟用MOB特性,MOB_THRESHOLD是MOB文件大小的閾值,單位是字節(jié),這里的設(shè)置說(shuō)明文件大于2k的列都當(dāng)做小文件存儲(chǔ)。大家可能注意到上面原始方案中采用了OSS對(duì)象存儲(chǔ),那我們?yōu)槭裁床恢苯邮褂肙SS存儲(chǔ)面板特征數(shù)據(jù)呢,如果有這個(gè)疑問(wèn),可以看看下面表的性能測(cè)試:
String CF_DEFAULT="c";根據(jù)上面的對(duì)比,使用HBase MOB特性來(lái)存儲(chǔ)小于10MB的對(duì)象相比直接使用對(duì)象存儲(chǔ)有一些優(yōu)勢(shì)。
我們現(xiàn)在來(lái)看看具體的表設(shè)計(jì),使用面板id作為列名。我們只使用了HBase的一張表就替換了之前方面的三張表!雖然我們啟用了MOB,但是具體插入的方法和正常使用一樣,代碼片段如下:
Put put=new Put(groupId.getBytes());
用戶如果需要根據(jù)面板組id獲取所有面板數(shù)據(jù),可以使用下面方法:
這樣我們可以拿到某個(gè)組id對(duì)應(yīng)的所有面板數(shù)據(jù)。如果需要根據(jù)組id+面板id查找某個(gè)面板的具體數(shù)據(jù),看可以使用下面方法:
經(jīng)過(guò)上面的改造,在2臺(tái)HBaseWorker節(jié)點(diǎn)內(nèi)存為32GB,核數(shù)為8,每個(gè)節(jié)點(diǎn)掛載四塊大小為250GB的SSD磁盤,并寫(xiě)入100W行,每行有1W列,讀取一行的時(shí)間在100ms-500毫秒左右。在每行有1000個(gè)face的情況下,讀取一行的時(shí)間基本在20-50毫秒左右,相比之前的10秒提升200~500倍。
從下面這張對(duì)比表,我們可以清楚的看到
現(xiàn)在,我們已經(jīng)將面板特征數(shù)據(jù)存儲(chǔ)在Cloudera HBase之中,這個(gè)只是數(shù)據(jù)應(yīng)用的第一步,如何將隱藏在這些數(shù)據(jù)背后的價(jià)值發(fā)揮出來(lái)?這就得