朱明++王志瑞
摘要: Hbase有著先天的優(yōu)勢(shì)和先天的劣勢(shì),而劣勢(shì)就是其較差的數(shù)據(jù)定位能力,也就是數(shù)據(jù)查詢能力。因?yàn)槊嫦蛄械奶攸c(diǎn),Hbase只能單單地以rowkey為主鍵作查詢,而無法對(duì)表進(jìn)行多維查詢和join操作,并且查詢通常都是全表掃描,耗費(fèi)資源較大,查詢效率較低。類比于傳統(tǒng)型數(shù)據(jù)庫里的一些查詢方式,本文對(duì)Hbase的存儲(chǔ)原理進(jìn)行了研究,借助分布式計(jì)算框架Mapreduce在Hbase上構(gòu)建了二級(jí)索引,就可以對(duì)表進(jìn)行有針對(duì)性的定位和高效率的查找,同時(shí)也減輕zookeeper服務(wù)對(duì)資源調(diào)度的壓力。
關(guān)鍵詞: Hbase; 大數(shù)據(jù)處理; Secondary Indexing
中圖分類號(hào):TP311
文獻(xiàn)標(biāo)志碼:A
文章編號(hào):2095-2163(2017)04-0059-03
0引言
隨著企業(yè)在發(fā)展過程中積累數(shù)據(jù)的日益遞增,關(guān)于大量業(yè)務(wù)數(shù)據(jù)的存儲(chǔ)和處理即已成為關(guān)涉企業(yè)運(yùn)營效率的熱點(diǎn)研究問題之一,此時(shí)則需對(duì)自身的數(shù)據(jù)庫作出調(diào)整。而Google公司關(guān)于BigTable的開源實(shí)現(xiàn),更為非傳統(tǒng)型數(shù)據(jù)庫探討研發(fā)提供了高端設(shè)計(jì)可能。作為非傳統(tǒng)型數(shù)據(jù)庫的優(yōu)秀代表,Hbase就因具備的高可靠性、高性能、面向列、可伸縮的特點(diǎn),已然成為企業(yè)在面臨大量數(shù)據(jù)處理時(shí)的基礎(chǔ)實(shí)效應(yīng)用設(shè)計(jì)模式。本文即針對(duì)這一內(nèi)容展開如下研究論述。
1Hbase體系架構(gòu)
Hbase技術(shù)來源于 Fay Chang 所撰寫的Google論文“Bigtable”關(guān)于一個(gè)結(jié)構(gòu)化數(shù)據(jù)的“分布式存儲(chǔ)系統(tǒng)”。是和Hadoop分布式文件系統(tǒng)對(duì)應(yīng)的一個(gè)分布式數(shù)據(jù)庫的概念。具體地,Hbase是一個(gè)分布式、面向列開源數(shù)據(jù)庫。而且也不同于一般的關(guān)系數(shù)據(jù)庫,Hbase是一個(gè)適合于非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)庫。進(jìn)一步地,Hbase是基于列的而非基于行的模式,這就與傳統(tǒng)型數(shù)據(jù)庫呈現(xiàn)出顯著差別。Hbase是Apache的Hadoop項(xiàng)目的頂級(jí)項(xiàng)目。綜上可知,Hbase就是建立在HDFS上的分布式列存儲(chǔ)系統(tǒng)。
2Hbase存儲(chǔ)原理
Hbase所有的行數(shù)據(jù)都是按照rowkey的字典展開排序的,所以查詢Hbase表的任何一行數(shù)據(jù)都要從rowkey的第一行開始掃描,依次向下,直至找到相關(guān)的行為止,如此可知查詢的效率將會(huì)很低,但這只是從第一層查詢效率來考慮的,也就是研究中表明的Hbase的一級(jí)索引(就是以rowkey字典排序的方式查詢數(shù)據(jù))。
如圖1所示,Hbase表中的數(shù)據(jù),都是存放在region里面的,原本一張表中只有一個(gè)region,隨著行數(shù)的不斷增多,region包含的數(shù)據(jù)資源也會(huì)不斷增多,當(dāng)達(dá)到一個(gè)閾值時(shí)(默認(rèn)為256 M),這個(gè)region即會(huì)分成2個(gè)同樣大小的region,重復(fù)這一過程,當(dāng)插入的數(shù)據(jù)越多,這個(gè)表的region就越多。region是由regionserver管理的,通常情況下,一個(gè)regionserver可以管理多個(gè)region。
針對(duì)Hbase查詢的特點(diǎn),分析可知Hbase都是通過Rowkey的方式全盤掃描表的,因此效率較慢,并且,Hbase表并不支持非主鍵查詢,和連接查詢、join操作的。
[JP3]如果能夠采用傳統(tǒng)型數(shù)據(jù)庫的索引方式來對(duì)Hbase建立索引,本次研究則擬將獲得更高效率。顯然,索引表僅需包含一個(gè)列值,因此索引表的大小要比原表小很多,所以索引表的一個(gè)region要比原表包含更多的記錄。研究可以通過mapreduce構(gòu)建一個(gè)二級(jí)索引,其主體思想可表述為:通過分布式計(jì)算框架[JP4]mapreduce構(gòu)建一個(gè)二級(jí)索引的方法。對(duì)此,將重點(diǎn)給出闡釋如下:[JP]
1)Map階段。將Hbase中的相關(guān)表遍歷rowkey值,根據(jù)rowkey讀出維度值,再通過維度值讀出value值,并將對(duì)應(yīng)的rowkey-value輸出。
2)Reduce階段。取出rowkey和value,將兩值取反,即將value值作為行鍵,行健作為value值存入Hbase。
4研發(fā)設(shè)計(jì)流程
綜合前文研究所述,這里將得出在Hbase中的操作實(shí)現(xiàn)流程可如圖2所示。
throws IOException, InterruptedException
{
Set
for (byte[] k : keys)
{
[JP3]ImmutableBytesWritable indexTableName = indexes.get(k);[JP]
[JP4]byte[] val = value.getValue(Bytes.toBytes(columnFamily),k);[JP]
[JP3]Put put = new Put(val); // 索引表的rowkey為原始表的值[JP]
put.add(Bytes.toBytes("f1"), Bytes.toBytes("id"), key.get()); // 索引表的內(nèi)容為原始表的rowkey
context.write(indexTableName, put);}
}
}
protected void setup(Context context) throws IOException,InterruptedException
{
Configuration conf = context.getConfiguration();
String tableName = conf.get("tableName");
columnFamily = conf.get("columnFamily");
String[] qualifiers = conf.getStrings("qualifiers"); // indexes的key為列名,value為索引表名
for (String q : qualifiers)
{
indexes.put(Bytes.toBytes(q),newImmutableBytesWritable(Bytes.toBytes(tableName+ "-" + q)));
}
}[HJ]
6實(shí)驗(yàn)數(shù)據(jù)比較
至此,研究通過Hadoop的mapreduce機(jī)制將java代碼編譯組裝成jar包寫入到HDFS里,得到新的索引表,而對(duì)新的索引表就可以進(jìn)行基于原表的非主鍵查詢,并且對(duì)新的索引表的查詢將會(huì)節(jié)約大量的資源。測(cè)試中,即以班級(jí)系點(diǎn)名冊(cè)作為數(shù)據(jù)源,對(duì)于建立了二級(jí)索引后的數(shù)據(jù)源的查詢和并未建立二級(jí)索引的數(shù)據(jù)源、即原表的實(shí)驗(yàn)數(shù)據(jù)展開了性能對(duì)比,可得運(yùn)行實(shí)驗(yàn)結(jié)果如圖3、圖4所示。
[PS朱明3.EPS;S*3;X*3,BP#]
[HJ*3][ST6HZ][WT6HZ][JZ]圖3原表與索引表查詢對(duì)比結(jié)果1
Fig. 3[ZK(]Query comparison results1 between the original table and index table[ZK)][HJ]
[PS朱明4.EPS;S*2;X*2,BP#]
[ST6HZ][WT6HZ][JZ]圖4原表與索引表查詢對(duì)比結(jié)果2
Fig. 4[ZK(]Query comparison results2 between the original table and index table[ZK)]
[HT5”SS][ST5”BZ][WT5”BZ]
7結(jié)束語
基于Hbase的大數(shù)據(jù)查詢中二級(jí)索引的創(chuàng)建研究,也就是針對(duì)Hbase表的查詢優(yōu)化則使學(xué)界對(duì)非傳統(tǒng)型數(shù)據(jù)庫查詢?nèi)〉昧嗣黠@突破,通過這種二級(jí)索引表,就可以大大降低查詢的效率,也可以把nosql的劣勢(shì),即只能通過主鍵rowkey的查詢方式,轉(zhuǎn)化為非主鍵的查詢方式等,這是對(duì)nosql半結(jié)構(gòu)化數(shù)據(jù)查詢應(yīng)用的一次研發(fā)嘗試。也為后續(xù)關(guān)于更大數(shù)據(jù)量的非傳統(tǒng)型數(shù)據(jù)庫優(yōu)化提供了重要有益的基礎(chǔ)借鑒。
[LL]參考文獻(xiàn):
[WTBZ][ST6BZ][HT6SS][1] [ZK(#〗
張新榮. 基于Hbase的小文件存儲(chǔ)系統(tǒng)的研究及實(shí)現(xiàn)[D]. 沈陽:東北大學(xué),2012.
[2] 江柳. HDFS下小文件存儲(chǔ)優(yōu)化相關(guān)技術(shù)研究[D]. 北京:北京郵電大學(xué),2010.
[3] 李穎. 基于分布式文件系統(tǒng)的農(nóng)業(yè)數(shù)據(jù)云存儲(chǔ)研究[D]. 泰安:山東農(nóng)業(yè)大學(xué),2013.
[4] WHITE T. Hadoop: The definitive guide [M]. America: O'Reilly Media, 2009.
[5] 于翔. NoSQL:大數(shù)據(jù)浪潮中崛起[N]. 網(wǎng)絡(luò)世界,2012-04-23(40).
[6] 徐小威. 非關(guān)系型數(shù)據(jù)庫數(shù)據(jù)恢復(fù)技術(shù)研究[D]. 杭州:杭州電子科技大學(xué),2014.
[7] 王映東,匡藝,費(fèi)江濤. Bigtable系統(tǒng)的負(fù)載平衡技術(shù)研究[J]. 計(jì)算機(jī)安全,2009(2):41-43.
[8] 徐達(dá)宇. 云計(jì)算環(huán)境下資源需求預(yù)測(cè)與優(yōu)化配置方法研究[D]. 合肥:合肥工業(yè)大學(xué),2014.
[9] 毛典輝. 基于MapReduce的CanopyKmeans改進(jìn)算法[J]. 計(jì)算機(jī)工程與應(yīng)用,2012,48(27):22-26,68.
[10]SITTO K, PRESSER M. Field guide to Hadoop:An introduction to Hadoop, its Ecosystem, and aligned technologies[M]. America:O'Reilly Media,2015.endprint