訂閱
糾錯(cuò)
加入自媒體

基于HBase的工業(yè)大數(shù)據(jù)存儲(chǔ)實(shí)戰(zhàn)

HBase解決方案:

MySQL + OSS的設(shè)計(jì)方案有兩個(gè)問(wèn)題:第一,原本屬于同一條數(shù)據(jù)的內(nèi)容由于數(shù)據(jù)本身大小的原因無(wú)法存儲(chǔ)到一行里面,導(dǎo)致后續(xù)查下需要訪(fǎng)問(wèn)兩個(gè)存儲(chǔ)系統(tǒng);第二,由于MySQL不支持動(dòng)態(tài)列的特性,所以屬于同一個(gè)面板組的數(shù)據(jù)被拆成多行存儲(chǔ)。

針對(duì)這兩個(gè)問(wèn)題,格創(chuàng)東智的大數(shù)據(jù)團(tuán)隊(duì)進(jìn)行了分析,認(rèn)為這是 HBase 的典型場(chǎng)景,原因如下:

——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)東智的大數(shù)據(jù)團(tuán)隊(duì)使用這三個(gè)功能重新設(shè)計(jì)上面 MySQL + OSS 方案。結(jié)合應(yīng)用場(chǎng)景的兩大查詢(xún)需求,將面板組 id 作為 HBase 的 Rowkey,在創(chuàng)建表的時(shí)候打開(kāi) MOB 功能,如下:

create 'glass', {NAME => 'c', IS_MOB => true, MOB_THRESHOLD => 2048}

上面我們創(chuàng)建了名為 glass 的表,IS_MOB 屬性說(shuō)明列簇 c 將啟用 MOB 特性,MOB_THRESHOLD 是 MOB 文件大小的閾值,單位是字節(jié),這里的設(shè)置說(shuō)明文件大于 2k 的列都當(dāng)做小文件存儲(chǔ)。大家可能注意到上面原始方案中采用了 OSS 對(duì)象存儲(chǔ),那我們?yōu)槭裁床恢苯邮褂?OSS 存儲(chǔ)面板特征數(shù)據(jù)呢,如果有這個(gè)疑問(wèn),可以看看下面表的性能測(cè)試:

對(duì)比屬性對(duì)象存儲(chǔ)云 HBase建模能力KVKV、表格、稀疏表、SQL、全文索引、時(shí)空、時(shí)序、圖查詢(xún)查詢(xún)能力前綴查找前綴查找、過(guò)濾器、索引性能優(yōu)優(yōu),特別對(duì)小對(duì)象有更低的延遲;在復(fù)雜查詢(xún)場(chǎng)景下,比對(duì)象存儲(chǔ)有10倍以上的性能提升成本按流量,請(qǐng)求次數(shù)計(jì)費(fèi),托管式,在高并發(fā),高吞吐場(chǎng)景有更低的成本適合訪(fǎng)問(wèn)頻率低的場(chǎng)景擴(kuò)展性?xún)?yōu)優(yōu)適用對(duì)象范圍通用<10MB

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());
put.addColumn(CF_DEFAULT.getBytes(),glassId1.getBytes(), feature1.getBytes());
put.addColumn(CF_DEFAULT.getBytes(),glassId2.getBytes(), feature2.getBytes());
……
put.addColumn(CF_DEFAULT.getBytes(),glassIdn.getBytes(), featuren.getBytes());
table.put(put);

用戶(hù)如果需要根據(jù)面板組id獲取所有面板數(shù)據(jù),可以使用下面方法:

Get get = new Get(groupId.getBytes());
Result re=table.get(get);

這樣我們可以拿到某個(gè)組id對(duì)應(yīng)的所有面板數(shù)據(jù)。如果需要根據(jù)組id+面板id查找某個(gè)面板的具體數(shù)據(jù),看可以使用下面方法:

Get get = new Get(groupId.getBytes());
get.addColumn(CF_DEFAULT.getBytes(), glassId1.getBytes())
Result re=table.get(get);

經(jīng)過(guò)上面的改造,在2臺(tái) HBaseWorker 節(jié)點(diǎn)內(nèi)存為32GB,核數(shù)為8,每個(gè)節(jié)點(diǎn)掛載四塊大小為 250GB 的 SSD 磁盤(pán),并寫(xiě)入100W 行,每行有1W列,讀取一行的時(shí)間在100ms-500毫秒左右。在每行有1000個(gè)face的情況下,讀取一行的時(shí)間基本在20-50毫秒左右,相比之前的10秒提升200~500倍。

從下面這張對(duì)比表,我們可以清楚的看到HBase方案的巨大優(yōu)勢(shì)。

對(duì)比屬性對(duì)象存儲(chǔ)MySQL+對(duì)象存儲(chǔ)HBase MOB讀寫(xiě)強(qiáng)一致YNY查詢(xún)能力弱強(qiáng)強(qiáng)查詢(xún)響應(yīng)時(shí)間高高低運(yùn)維成本低高低水平擴(kuò)展YYY

現(xiàn)在,我們已經(jīng)將面板特征數(shù)據(jù)存儲(chǔ)在Cloudera HBase 之中,這個(gè)只是數(shù)據(jù)應(yīng)用的第一步,如何將隱藏在這些數(shù)據(jù)背后的價(jià)值發(fā)揮出來(lái)?這就得借助于數(shù)據(jù)分析,在這個(gè)場(chǎng)景就需要采用機(jī)器學(xué)習(xí)的方法進(jìn)行操作。我們可以借助大數(shù)據(jù)分析工具Spark 對(duì)存儲(chǔ)于 HBase 之中的數(shù)據(jù)進(jìn)行分析,而且 Spark 本身支持機(jī)器學(xué)習(xí)的。最后,用戶(hù)就可以通過(guò)訪(fǎng)問(wèn) HBase 里面已經(jīng)挖掘好的特征數(shù)據(jù)進(jìn)行其他的應(yīng)用了。

本文作者:格創(chuàng)東智大數(shù)據(jù)工程師王子超(轉(zhuǎn)載請(qǐng)注明作者及來(lái)源)

<上一頁(yè)  1  2  
聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)