當(dāng)我們對于數(shù)據(jù)結(jié)構(gòu)字段不夠確定或雜亂無章很難按一個(gè)概念去進(jìn)行抽取的數(shù)據(jù)適合用使用什么數(shù)據(jù)庫哪轿?答案是什么窑业,如果我們使用的傳統(tǒng)數(shù)據(jù)庫愿汰,肯定留有多余的字段,10個(gè)不行乐纸,20個(gè)衬廷,但是這個(gè)嚴(yán)重影響了質(zhì)量。并且如果面對大數(shù)據(jù)庫汽绢,pt級別的數(shù)據(jù)吗跋,這種浪費(fèi)更是嚴(yán)重的,那么我們該使用是什么數(shù)據(jù)庫宁昭?hbase數(shù)個(gè)不錯(cuò)的選擇跌宛,那么我們對于hbase還存在下列問題:
1.Column Family代表什么?
2.HBase通過row和column確定一份數(shù)據(jù)积仗,這份數(shù)據(jù)的值可能有多個(gè)版本疆拘,為什么會(huì)存在多個(gè)版本?
3.查詢的時(shí)候會(huì)顯示那個(gè)版本寂曹?
4.它們的存儲(chǔ)類型是什么哎迄?
5.tableName是什么類型?
6.RowKey 和 ColumnName是什么類型隆圆?
7.Timestamp 是什么類型漱挚?
8.value 是什么類型?
帶著以上幾個(gè)問題去讀下面內(nèi)容:
引言
團(tuán)隊(duì)中使用HBase的項(xiàng)目多了起來渺氧,對于業(yè)務(wù)人員而言旨涝,通常并不需要從頭搭建、維護(hù)一套HBase的集群環(huán)境阶女,對于其架構(gòu)細(xì)節(jié)也不一定要深刻理解(交由HBase集群維護(hù)團(tuán)隊(duì)負(fù)責(zé))颊糜,迫切需要的是快速理解基本技術(shù)來解決業(yè)務(wù)問題。最近在XX項(xiàng)目輪崗過程中秃踩,嘗試著從業(yè)務(wù)人員視角去看HBase衬鱼,將一些過程記錄下來,期望對快速了解HBase憔杨、掌握相關(guān)技術(shù)來開展工作的業(yè)務(wù)人員有點(diǎn)幫助鸟赫。我覺得作為一個(gè)初次接觸HBase的業(yè)務(wù)開發(fā)測試人員,他需要迫切掌握的至少包含以下幾點(diǎn):
深入理解HTable消别,掌握如何結(jié)合業(yè)務(wù)設(shè)計(jì)高性能的HTable
掌握與HBase的交互抛蚤,反正是離不開數(shù)據(jù)的增刪改查,通過HBase Shell命令及Java Api都是需要的
掌握如何用MapReduce分析HBase里的數(shù)據(jù)寻狂,HBase里的數(shù)據(jù)總要分析的岁经,用MapReduce是其中一種方式
掌握如何測試HBase MapReduce,總不能光寫不管正確性吧蛇券,debug是需要的吧缀壤,看看如何在本機(jī)單測debug吧
本系列將圍繞以上幾點(diǎn)展開樊拓,篇幅較長,如果是HBase初學(xué)者建議邊讀邊練塘慕,對于HBase比較熟練的筋夏,可以選讀下,比如關(guān)注下HBase的MapReduce及其測試方法图呢。
從一個(gè)示例說起
傳統(tǒng)的關(guān)系型數(shù)據(jù)庫想必大家都不陌生条篷,我們將以一個(gè)簡單的例子來說明使用RDBMS和HBase各自的解決方式及優(yōu)缺點(diǎn)。
以博文為例蛤织,RDBMS的表設(shè)計(jì)如下:
為了方便理解赴叹,我們以一些數(shù)據(jù)示例下
上面的例子,我們用HBase可以按以下方式設(shè)計(jì)
同樣為了方便理解瞳筏,我們以一些數(shù)據(jù)示例下稚瘾,同時(shí)用紅色標(biāo)出了一些關(guān)鍵概念,后面會(huì)解釋
HTable一些基本概念
Row key
行主鍵姚炕, HBase不支持條件查詢和Order by等查詢摊欠,讀取記錄只能按Row key(及其range)或全表掃描,因此Row key需要根據(jù)業(yè)務(wù)來設(shè)計(jì)以利用其存儲(chǔ)排序特性(Table按Row key字典序排序如1,10,100,11,2)提高性能柱宦。
Column Family(列族)
在表創(chuàng)建時(shí)聲明些椒,每個(gè)Column Family為一個(gè)存儲(chǔ)單元。在上例中設(shè)計(jì)了一個(gè)HBase表blog掸刊,該表有兩個(gè)列族:article和author免糕。
Column(列)
HBase的每個(gè)列都屬于一個(gè)列族,以列族名為前綴忧侧,如列article:title和article:content屬于article列族石窑,author:name和author:nickname屬于author列族。
Column不用創(chuàng)建表時(shí)定義即可以動(dòng)態(tài)新增蚓炬,同一Column Family的Columns會(huì)群聚在一個(gè)存儲(chǔ)單元上松逊,并依Column key排序,因此設(shè)計(jì)時(shí)應(yīng)將具有相同I/O特性的Column設(shè)計(jì)在一個(gè)Column Family上以提高性能肯夏。同時(shí)這里需要注意的是:這個(gè)列是可以增加和刪除的经宏,這和我們的傳統(tǒng)數(shù)據(jù)庫很大的區(qū)別。所以他適合非結(jié)構(gòu)化數(shù)據(jù)驯击。 Timestamp
HBase通過row和column確定一份數(shù)據(jù)烁兰,這份數(shù)據(jù)的值可能有多個(gè)版本,不同版本的值按照時(shí)間倒序排序徊都,即最新的數(shù)據(jù)排在最前面沪斟,查詢時(shí)默認(rèn)返回最新版本。如上例中row key=1的author:nickname值有兩個(gè)版本暇矫,分別為1317180070811對應(yīng)的“一葉渡江”和1317180718830對應(yīng)的“yedu”(對應(yīng)到實(shí)際業(yè)務(wù)可以理解為在某時(shí)刻修改了nickname為yedu币喧,但舊值仍然存在)轨域。Timestamp默認(rèn)為系統(tǒng)當(dāng)前時(shí)間(精確到毫秒),也可以在寫入數(shù)據(jù)時(shí)指定該值杀餐。
Value
每個(gè)值通過4個(gè)鍵唯一索引,tableName+RowKey+ColumnKey+Timestamp=>value朱巨,例如上例中{tableName=’blog’,RowKey=’1’,ColumnName=’author:nickname’,Timestamp=’ 1317180718830’}索引到的唯一值是“yedu”史翘。
存儲(chǔ)類型
TableName 是字符串
RowKey 和 ColumnName 是二進(jìn)制值(Java 類型 byte[])
Timestamp 是一個(gè) 64 位整數(shù)(Java 類型 long)
value 是一個(gè)字節(jié)數(shù)組(Java類型 byte[])。
存儲(chǔ)結(jié)構(gòu)
可以簡單的將HTable的存儲(chǔ)結(jié)構(gòu)理解為
即HTable按Row key自動(dòng)排序冀续,每個(gè)Row包含任意數(shù)量個(gè)Columns琼讽,Columns之間按Column key自動(dòng)排序,每個(gè)Column包含任意數(shù)量個(gè)Values洪唐。理解該存儲(chǔ)結(jié)構(gòu)將有助于查詢結(jié)果的迭代钻蹬。
話說什么情況需要HBase
半結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)
對于數(shù)據(jù)結(jié)構(gòu)字段不夠確定或雜亂無章很難按一個(gè)概念去進(jìn)行抽取的數(shù)據(jù)適合用HBase。以上面的例子為例凭需,當(dāng)業(yè)務(wù)發(fā)展需要存儲(chǔ)author的email问欠,phone,address信息時(shí)RDBMS需要停機(jī)維護(hù)粒蜈,而HBase支持動(dòng)態(tài)增加.
記錄非常稀疏
RDBMS的行有多少列是固定的顺献,為null的列浪費(fèi)了存儲(chǔ)空間。而如上文提到的枯怖,HBase為null的Column不會(huì)被存儲(chǔ)注整,這樣既節(jié)省了空間又提高了讀性能。
多版本數(shù)據(jù)
如上文提到的根據(jù)Row key和Column key定位到的Value可以有任意數(shù)量的版本值度硝,因此對于需要存儲(chǔ)變動(dòng)歷史記錄的數(shù)據(jù)肿轨,用HBase就非常方便了。比如上例中的author的Address是會(huì)變動(dòng)的蕊程,業(yè)務(wù)上一般只需要最新的值椒袍,但有時(shí)可能需要查詢到歷史值。
超大數(shù)據(jù)量
當(dāng)數(shù)據(jù)量越來越大存捺,RDBMS數(shù)據(jù)庫撐不住了槐沼,就出現(xiàn)了讀寫分離策略,通過一個(gè)Master專門負(fù)責(zé)寫操作捌治,多個(gè)Slave負(fù)責(zé)讀操作岗钩,服務(wù)器成本倍增。隨著壓力增加肖油,Master撐不住了兼吓,這時(shí)就要分庫了,把關(guān)聯(lián)不大的數(shù)據(jù)分開部署森枪,一些join查詢不能用了视搏,需要借助中間層审孽。隨著數(shù)據(jù)量的進(jìn)一步增加,一個(gè)表的記錄越來越大浑娜,查詢就變得很慢佑力,于是又得搞分表,比如按ID取模分成多個(gè)表以減少單個(gè)表的記錄數(shù)筋遭。經(jīng)歷過這些事的人都知道過程是多么的折騰打颤。采用HBase就簡單了,只需要加機(jī)器即可漓滔,HBase會(huì)自動(dòng)水平切分?jǐn)U展编饺,跟Hadoop的無縫集成保障了其數(shù)據(jù)可靠性(HDFS)和海量數(shù)據(jù)分析的高性能(MapReduce)。