周偉 劉?!£惡?/p>
摘要:二級(jí)索引方案是分布式存儲(chǔ)研究的重要分支之一,基于通用目標(biāo)設(shè)計(jì)二級(jí)索引方案可避免單一業(yè)務(wù)編程繁瑣問題,使實(shí)施人員更多地關(guān)注業(yè)務(wù)本身而非編程細(xì)節(jié)。以HBase數(shù)據(jù)庫為研究對(duì)象,引入分布式索引機(jī)制,通過重寫觀察者Observer協(xié)處理器方法,操作完數(shù)據(jù)后立即觸發(fā)創(chuàng)建或更新索引的請(qǐng)求,進(jìn)一步在SolrCloud中完成對(duì)索引的管理。反向進(jìn)行多條件組合查詢時(shí),先在SolrCloud中查詢包含行鍵和索引列的文檔,再以行鍵為條件查詢并獲取HBase記錄。部署通用方案,實(shí)驗(yàn)證明該方案很好地滿足了創(chuàng)建和維護(hù)HBase二級(jí)索引的要求,且保證了索引與記錄的一致性,對(duì)進(jìn)一步研究分布式存儲(chǔ)二級(jí)索引方案有一定的指導(dǎo)意義。
關(guān)鍵詞:分布式存儲(chǔ);分布式索引;二級(jí)索引;協(xié)處理器;通用方案
DOIDOI:10.11907/rjdk.171483
中圖分類號(hào):TP391
文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào)文章編號(hào):16727800(2018)003018704
英文摘要Abstract:Secondary indexing scheme is an important branch of HBase database research. A scheme based on the general purpose will avoid programming against every single business detail, which helps the developers focus more on the business rather than the programming details. By overriding the methods of observer coprocessor, requests for creating indexes will be triggered after the records are stored in database, and then the indexes will be created and stored in SolrCloud which is a distributed indexer. Furthermore, documents of SolrCloud which contain both row keys and indexed columns can be filtered by a multiconditional query, and the target records will be fetched by the target row keys in the documents. Through deploying this scheme, it turns out that it completely meets the requirements of creating and maintaining secondary indexes of HBase and ensures the consistency between indexes and records. Whats more, the scheme referred in this paper has instructional significance for further study of HBase secondary indexing.
英文關(guān)鍵詞Key Words:HBase; SolrCloud; secondary indexing; coprocessor; general schema
0引言
索引是一種特殊文件,存儲(chǔ)著數(shù)據(jù)表中所有記錄的引用指針,從邏輯上對(duì)記錄進(jìn)行排序。索引通常建立在數(shù)據(jù)表的某些列上,在數(shù)據(jù)量不大時(shí),有無合適的索引對(duì)記錄查找速度影響不大,隨著數(shù)據(jù)量的增加,查找性能會(huì)急劇下降,此時(shí)索引能加速查找過程。索引對(duì)數(shù)據(jù)庫的查詢速度至關(guān)重要,重構(gòu)索引是數(shù)據(jù)庫性能調(diào)優(yōu)的起點(diǎn)。傳統(tǒng)關(guān)系型數(shù)據(jù)庫支持二級(jí)索引(也稱多級(jí)索引),擴(kuò)展了一級(jí)索引只針對(duì)單列構(gòu)建索引的特性,主要用于多條件組合查詢的場景。
在大數(shù)據(jù)應(yīng)用中,作為一個(gè)分布式、可伸縮的列存儲(chǔ)數(shù)據(jù)庫,HBase表現(xiàn)出強(qiáng)大的生命力。HBase歸屬Hadoop生態(tài)系統(tǒng),利用Hadoop分布式文件系統(tǒng)存儲(chǔ)切片數(shù)據(jù),通過Hadoop MapReduce計(jì)算框架處理海量數(shù)據(jù),適用于聯(lián)機(jī)分析處理和數(shù)據(jù)挖掘的場景。HBase主要定義了一個(gè)四維數(shù)據(jù)模型,分別為行鍵(rowkey)、列族(column family)、列修飾符(column qualifier)和版本(version)。HBase基于行鍵有序存儲(chǔ),在查詢時(shí)使用行鍵十分高效,同時(shí)列修飾符可以被動(dòng)態(tài)創(chuàng)建,適合應(yīng)對(duì)屬性不固定的半結(jié)構(gòu)化數(shù)據(jù)。然而HBase本身無法輕易建立二級(jí)多列索引(以下簡稱二級(jí)索引),隨著應(yīng)用業(yè)務(wù)復(fù)雜度的增加,單一行鍵滿足不了類似關(guān)系型數(shù)據(jù)庫多條件組合查詢、分頁等功能的要求。
為了突破單一行鍵在復(fù)雜查詢上的限制,避免全表掃描,業(yè)界已有一些研究成果。朱夏等[1]基于多維數(shù)據(jù)檢索機(jī)制MIndex,實(shí)現(xiàn)了從復(fù)雜查詢請(qǐng)求到一維查詢鍵值的轉(zhuǎn)換,并保證了復(fù)雜查詢的高效性。丁飛等[2]基于HBase協(xié)處理器,通過倒排索引實(shí)現(xiàn)了第二索引擴(kuò)展功能。徐熙超等[3]提出HBase4M架構(gòu),利用協(xié)處理器建立和維護(hù)輔助索引,將字段查詢轉(zhuǎn)化為索引表的行鍵查詢。葛微等[4]提出的分層式非主鍵索引方案中,在組合查詢時(shí)也會(huì)轉(zhuǎn)換成索引表主鍵的查詢。上述研究需要巧妙地設(shè)計(jì)索引表的行鍵,通過將多個(gè)查詢條件鍵值對(duì)映射到行鍵的方式縮小索引表的行鍵區(qū)間,最后確定目標(biāo)行鍵。該方式依賴于表結(jié)構(gòu)已知且查詢條件固定的情況,具有一定的局限性。陳東輝等[5]依靠第三方搜索引擎Solr提供的API接口,參考具體業(yè)務(wù)中的查詢用例對(duì)相關(guān)字段建立輔助索引以適應(yīng)檢索時(shí)效。該方式借助Solr提供的索引功能為HBase記錄創(chuàng)建、存儲(chǔ)索引,其中HBase負(fù)責(zé)存儲(chǔ)數(shù)據(jù),Solr負(fù)責(zé)索引數(shù)據(jù)和檢索。許杰等[6]亦使用Solr建立二級(jí)索引的方法,提高了檢索效率。該方式充分利用各角色的優(yōu)點(diǎn),更適于企業(yè)級(jí)的架構(gòu)設(shè)計(jì)。考慮到適應(yīng)海量數(shù)據(jù)存儲(chǔ)和索引的要求,將原有架構(gòu)擴(kuò)展為分布式架構(gòu)極為迫切[7]。付劍生[8]總結(jié)了SolrCloud作為Solr分布式實(shí)現(xiàn)的特色功能:數(shù)據(jù)檢索時(shí)自動(dòng)負(fù)載均衡、自動(dòng)化容錯(cuò)處理、索引分片、倒排索引的虛擬化存儲(chǔ)等。本文結(jié)合SolrCloud研究分布式存儲(chǔ)HBase二級(jí)索引的通用實(shí)現(xiàn),基于通用目標(biāo)設(shè)計(jì)構(gòu)建索引的具體過程,該過程不依賴于任何特定的業(yè)務(wù)。二級(jí)索引方案整體架構(gòu)如圖1。
1相關(guān)技術(shù)
1.1分布式存儲(chǔ)模型
HBase基于Hadoop分布式文件系統(tǒng)(HDFS)構(gòu)建,對(duì)數(shù)據(jù)進(jìn)行索引后,將結(jié)果文件存放在HDFS上,以提高查找或更新大數(shù)據(jù)表中目標(biāo)記錄的速度,同時(shí)確保數(shù)據(jù)的容錯(cuò)性。HBase支持線性伸縮和模塊化擴(kuò)展,突破了關(guān)系型數(shù)據(jù)庫有限擴(kuò)展能力的限制,通過新增節(jié)點(diǎn),集群的存儲(chǔ)能力和處理能力明顯增強(qiáng)。同時(shí)基于HDFS的架構(gòu),HBase在故障處理和容錯(cuò)方面具有優(yōu)良的性能。
1.2分布式索引模型
SolrCloud為服務(wù)器之間分發(fā)索引文件和請(qǐng)求轉(zhuǎn)發(fā)創(chuàng)建了一個(gè)高可用、高容錯(cuò)的分布式環(huán)境。一份索引文件經(jīng)切片后被保存在某臺(tái)機(jī)器上,同時(shí)索引文件的多份拷貝會(huì)被分別存儲(chǔ)在其它機(jī)器上,客戶端通過Solr API請(qǐng)求文件,若分布式系統(tǒng)感知該機(jī)器出現(xiàn)宕機(jī)、故障,就會(huì)直接返回其它機(jī)器上的文件拷貝。SolrCloud還支持集群集中管理、自動(dòng)負(fù)載均衡和故障切換等特性。
1.3分布式應(yīng)用協(xié)調(diào)服務(wù)
ZooKeeper作為分布式應(yīng)用協(xié)調(diào)工具,能為分布式應(yīng)用提供高性能和可靠的協(xié)調(diào)服務(wù),簡化分布式協(xié)調(diào)服務(wù)的實(shí)現(xiàn)。HBase將元數(shù)據(jù)存儲(chǔ)在ZooKeeper中,使得客戶端不能直接訪問或修改HBase元數(shù)據(jù),并保證集群只存在唯一HMaster。SolrCloud將配置文件存放在ZooKeeper中,以集中化管理配置信息,使得各節(jié)點(diǎn)共享信息,協(xié)調(diào)工作,并通過配置ZooKeeper訪問控制列表以控制外部API調(diào)用。HBase(HDFS)、SolrCloud和ZooKeeper關(guān)系如圖2所示。
2HBase二級(jí)索引
傳統(tǒng)關(guān)系型數(shù)據(jù)庫(以MySQL為例)架構(gòu)主要分為SQL解析引擎和存儲(chǔ)引擎兩部分,前者包括解析器和查詢優(yōu)化器,負(fù)責(zé)解析,后者負(fù)責(zé)執(zhí)行(查詢或存儲(chǔ)),解析完SQL后,解析引擎會(huì)調(diào)用存儲(chǔ)引擎的相關(guān)接口供進(jìn)一步處理。根據(jù)MySQL的架構(gòu)設(shè)計(jì),本文構(gòu)思了HBase二級(jí)索引方案(見圖3)。HBase作為存儲(chǔ)引擎,負(fù)責(zé)存儲(chǔ)數(shù)據(jù),待執(zhí)行完存儲(chǔ)命令,索引器向索引引擎發(fā)起創(chuàng)建索引的請(qǐng)求,生成記錄的索引數(shù)據(jù)。
HBase自0.92版本后引入了協(xié)處理器Coprocessor機(jī)制以支持二級(jí)索引,Coprocessor存在兩種實(shí)現(xiàn),分別是Observer Coprocessor和Endpoint Coprocessor,前者在特定事件出現(xiàn)前后被觸發(fā),功能與關(guān)系型數(shù)據(jù)庫中的觸發(fā)器類似,后者則可類比關(guān)系型數(shù)據(jù)庫的存儲(chǔ)過程,具體邏輯在RegionServer服務(wù)器端執(zhí)行,客戶端僅通過類庫方法調(diào)用服務(wù)端接口。Coprocessor執(zhí)行過程如圖4,其中Observer與Endpoint相互之間可通過ZooKeeper共享數(shù)據(jù)。
根據(jù)HBase數(shù)據(jù)入庫的基本流程[5],本文在構(gòu)建二級(jí)索引過程時(shí)基于Observer實(shí)現(xiàn),待記錄被寫入(Put)到HRegion后,會(huì)立即觸發(fā)將記錄同步到SolrCloud的操作,進(jìn)而生成索引。客戶端讀?。℅et)記錄時(shí),首先根據(jù)索引字段請(qǐng)求SolrCloud查詢索引,得到目標(biāo)行鍵,繼而根據(jù)目標(biāo)行鍵獲取HBase記錄。二級(jí)索引方案中,各組件通過ZooKeeper協(xié)同工作,并通過暴露API接口供外部調(diào)用,整體流程如圖5。
2.1索引方案設(shè)計(jì)
Observer允許實(shí)施人員在記錄被寫入到HBase前后作一些處理,本文提供的索引工具類通過繼承BaseRegionObserver抽象類,重寫postPut方法,請(qǐng)求SolrCloud生成索引。默認(rèn)情況下,HBase每提交一條數(shù)據(jù)都會(huì)觸發(fā)一次postPut操作,考慮到系統(tǒng)的性能,工具類引入了一個(gè)本地可持久化的隊(duì)列機(jī)制,用來代理創(chuàng)建或刪除索引的操作,在postPut或postDelete重載方法中將包含索引字段的記錄放入隊(duì)列,隊(duì)列以定時(shí)器輪詢的方式向SolrCloud提交數(shù)據(jù),同時(shí)監(jiān)控異常以供故障恢復(fù)。索引工具類創(chuàng)建索引的活動(dòng)見圖6。
通用性是軟件設(shè)計(jì)的重要準(zhǔn)則之一,通用性使得工具更易于擴(kuò)展,避免重復(fù)編碼,提高開發(fā)效率。檢索業(yè)務(wù)升級(jí)、需求變更伴隨著對(duì)索引字段靈活性的要求,這也意味著在設(shè)計(jì)時(shí)需考慮索引工具類對(duì)不同業(yè)務(wù)二級(jí)索引的通用性要求。
為提高索引方案的通用性,本文規(guī)范了Solr配置和HBase創(chuàng)建數(shù)據(jù)表過程,首先在Solr的配置文件中定義統(tǒng)一的動(dòng)態(tài)字段,格式以下劃線加字母的方式進(jìn)行聲明,對(duì)照關(guān)系如表1。利用工具構(gòu)建HBase索引,Solr中每一條Document對(duì)應(yīng)著HBase的一條記錄,除了需要索引的字段外,還包括4個(gè)缺省字段:ID(表名+行鍵)、表名、行鍵、更新時(shí)間。接著在HBase中建立需索引的字段,其列修飾符按字段名加預(yù)定義的標(biāo)識(shí)符進(jìn)行定義。比如統(tǒng)計(jì)用戶對(duì)各網(wǎng)站的訪問量排名,在設(shè)計(jì)數(shù)據(jù)表時(shí),訪問量列標(biāo)識(shí)符需按照“訪問量_i”的格式設(shè)計(jì),其中“i”表示訪問量是整型數(shù)。該方式統(tǒng)一了創(chuàng)建和維護(hù)索引的流程,在設(shè)計(jì)列修飾符時(shí)相應(yīng)字段按約定命名。實(shí)現(xiàn)過程參見代碼如下:
//獲取rowKey
for (Cell cell:cells){
//獲取cFamily,cQualifier,cValue
if (cQualifier.endsWith("_s"))
jsonSet.putObject(cFamily+F_SEPARATOR+cQualifier,(new JsonObject()).putString("set",cValue));
else if (cQualifier.endsWith("_t"))
jsonSet.putObject(cFamily+F_SEPARATOR+cQualifier,(new JsonObject()).putString("set",cValue));
//處理其它類型的cQualifier
}
jsonSet.putString(F_ID,tableName+F_SEPARATOR+rowKey);
jsonSet.putObject(F_TABLENAME,(new JsonObject()).putString("set",tableName));
jsonSet.putObject(F_ROWKEY,(new JsonObject()).putString("set",rowKey));
jsonSet.putObject(F_UPDATETIME,(new JsonObject()).putString("set",SolrTools.solrDateFormat.format(new java.util.Date())));
_bqUpdate.enqueue(jsonSet.encode().getBytes(SolrTools.UTF_8));
2.2部署索引方案
本文采用1臺(tái)服務(wù)器,基于3臺(tái)虛擬機(jī)搭建大數(shù)據(jù)分布式應(yīng)用實(shí)驗(yàn)環(huán)境。各機(jī)器的具體配置如表2。安裝、配置分布式集群時(shí),需配置各機(jī)器SSH免密碼登錄、關(guān)閉防火墻、調(diào)整SELinux參數(shù)、同步機(jī)器時(shí)間,另外使用官方推薦的整合方式確保各軟件版本之間的兼容性。依次分別啟動(dòng)ZooKeeper、Hadoop、HBase和Solr Cloud,啟動(dòng)無異常后,可通過WebUI訪問HBase和SolrCloud。
停止HBase服務(wù),將索引工具類打包后上傳給所有的Region Servers,并放在HBase根目錄下的lib子目錄中,接著配置HBasesite.xml文件,主要設(shè)置Solr Cloud地址,設(shè)置coprocessor實(shí)現(xiàn)類為索引工具類。再次啟動(dòng)HBase服務(wù),通過客戶端請(qǐng)求HBase,并插入預(yù)定義格式的記錄,刷新SolrCloud集群狀態(tài)后,發(fā)現(xiàn)SolrCloud產(chǎn)生新的索引記錄,ID參數(shù)形如“表名#行鍵”,其它屬性均與HBase記錄一致。如先執(zhí)行建表和插入實(shí)驗(yàn)數(shù)據(jù)的命令:
put 'test_table','row_1','report:name_s','張三'
put 'test_table','row_1','report:age_i','24'
put 'test_table','row_1','report:gender_b','true'
put 'test_table','row_1','report:grade_f','89.5'
put 'test_table','row_2','report:name_s','李四'
put 'test_table','row_2','report:age_i','23'
put 'test_table','row_2','report:gender_b','true'
put 'test_table','row_2','report:grade_f','90.0'
隨后在客戶端按指定URL(形如[domain]:[port]/solr/admin/collections?action=RELOAD&name;=[coreName])重新加載集群狀態(tài),查詢索引即得到如下記錄:
"docs":[{
"report#name_s":"張三",
"id":"test_table#row_1",
"t_s":"test_table",
"r_s":"row_1",
"u_dt":"2016-07-10T22:47:13Z",
"report#age_i":24,
"report#gender_b":true,
"report#grade_f":89.5,
"_version_":1539479473261379600
},{
"report#name_s":"李四",
"id":"test_table#row_2",
"t_s":"test_table",
"r_s":"row_2",
"u_dt":"2016-07-10T22:47:26Z",
"report#age_i":23,
"report#gender_b":true,
"report#grade_f":90,
"_version_":1539479487465390000
}]
以同樣的方式測試更新表中某行記錄、刪除某行記錄的某一列以及刪除某行記錄的情況,發(fā)現(xiàn)SolrCloud存儲(chǔ)的索引都會(huì)產(chǎn)生相應(yīng)變化。多條件查詢HBase記錄時(shí),先在客戶端通過API查詢Solr索引,待返回目標(biāo)行鍵,便可根據(jù)目標(biāo)行鍵查詢HBase目標(biāo)記錄。
3結(jié)語
本文針對(duì)HBase在二級(jí)索引問題上的缺陷,結(jié)合SolrCloud分布式索引特性,利用HBase提供的Observer Coprocessor API,設(shè)計(jì)了創(chuàng)建和維護(hù)HBase二級(jí)索引的通用實(shí)現(xiàn),簡化了開發(fā)流程,避免了針對(duì)單一業(yè)務(wù)編程的繁瑣問題。通過部署索引方案,發(fā)現(xiàn)該方案能很好地滿足創(chuàng)建和維護(hù)HBase二級(jí)索引的要求,并保證索引與記錄的一致性。對(duì)于通用實(shí)現(xiàn)的高并發(fā)性能測試將是下一步研究的工作。
參考文獻(xiàn)參考文獻(xiàn):
[1]朱夏,羅軍舟,宋愛波,等.云計(jì)算環(huán)境下支持復(fù)雜查詢的多維數(shù)據(jù)索引機(jī)制[J].計(jì)算機(jī)研究與發(fā)展,2013,50(8):15921603.
[2]丁飛,陳長松,張濤,等.基于協(xié)處理器的區(qū)域級(jí)第二索引研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2014,34(S1):181185.
[3]徐熙超,楊錚,馬廷淮.基于HBase的氣象結(jié)構(gòu)化數(shù)據(jù)查詢優(yōu)化[J/OL].計(jì)算機(jī)工程與應(yīng)用,http://www.cnki.net/kcms/detail/11.2127.TP.20160510.1117.038.html.
[4]葛微,羅圣美,周文輝,等.一種基于分層式索引的高效查詢技術(shù)與系統(tǒng)[J].計(jì)算機(jī)學(xué)報(bào),2016,39(1):140153.
[5]陳東輝,曾樂,梁中軍,等.基于的氣象地面分鐘數(shù)據(jù)分布式存儲(chǔ)系統(tǒng)[J].計(jì)算機(jī)應(yīng)用,2014,34(9):26172621.
[6]許杰,冷冰,李明桂,等.大數(shù)據(jù)處理技術(shù)在安全審計(jì)系統(tǒng)中的應(yīng)用[J].通信技術(shù),2016,49(3):346351.
[7]吳廣君,王樹鵬,陳明,等.海量結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)檢索系統(tǒng)[J].計(jì)算機(jī)研究與發(fā)展,2012,49(Sl):15.
[8]付劍生,徐林龍,林文斌.分布式全網(wǎng)職位搜索引擎的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2015,25(5):69.
責(zé)任編輯(責(zé)任編輯:何麗)