本發(fā)明屬于大數(shù)據(jù)領(lǐng)域,尤其涉及一種基于Solr實現(xiàn)HBase多條件查詢的方法及系統(tǒng)。
背景技術(shù):
HBase是一個分布式的、面向列的開源數(shù)據(jù)庫,根據(jù)數(shù)據(jù)表行鍵字典排序存儲數(shù)據(jù),使用單一數(shù)據(jù)表行鍵進行查詢時,查詢效率十分高效。但是這種單一的查詢方式不能滿足更多的查詢需求,如果需要實現(xiàn)類似于關(guān)系型數(shù)據(jù)庫那樣隨意組合的多條件查詢功能,可以采用以下兩種方式:
1.第一種方式:
使用HBase提供的過濾器filter原生應(yīng)用程序編程接口(Application Programming Interface,API)。這種方式使用起來方便簡單,但是局限性很大,當(dāng)表的數(shù)據(jù)量比較大時,直接全表掃描記錄,查詢速度會非常慢。
2.第二種方式:
優(yōu)化數(shù)據(jù)表行鍵RowKey,將查詢條件拼接在RowKey。這種方式在一定程度上可以滿足多條件查詢的需求,但是如果業(yè)務(wù)需求改變的時候,擴展性和靈活性太差。
綜上所述,現(xiàn)有實現(xiàn)多條件查詢功能的方式,存在以下不足,詳述如下:
1.查詢HBase表時需要全表掃描。
2.查詢的擴展性和靈活性太差。
技術(shù)實現(xiàn)要素:
本發(fā)明實施例的目的在于提供一種基于Solr實現(xiàn)HBase多條件查詢的方法,旨在解決現(xiàn)有實現(xiàn)多條件查詢功能的方式,查詢HBase表時需要全表掃描,難以滿足更多查詢需求的問題。
本發(fā)明實施例是這樣實現(xiàn)的,一種基于Solr實現(xiàn)HBase多條件查詢的方法,包括:
Solr服務(wù)器獲取客戶端提交的多條件查詢請求;
利用預(yù)先建立支持多條件查詢請求的索引,向所述客戶端返回所述多條件查詢請求的數(shù)據(jù)表行鍵RowKey集合;
其中,所述RowKey集合的元素為數(shù)據(jù)庫表行鍵,所述數(shù)據(jù)表行鍵為開源數(shù)據(jù)庫HBase中數(shù)據(jù)表的行鍵。
本發(fā)明實施例的另一目的在于提供一種基于Solr實現(xiàn)HBase多條件查詢的系統(tǒng),包括:
多條件查詢請求獲取模塊,用于獲取客戶端提交的多條件查詢請求;
RowKey返回模塊,用于利用預(yù)先建立支持多條件查詢請求的索引,向所述客戶端返回所述多條件查詢請求的數(shù)據(jù)表行鍵RowKey集合;
其中,所述RowKey集合的元素為數(shù)據(jù)庫表行鍵,所述數(shù)據(jù)表行鍵為開源數(shù)據(jù)庫HBase中數(shù)據(jù)表的行鍵。
在本發(fā)明實施例中,利用預(yù)先建立支持多條件查詢請求的索引,向所述客戶端返回所述多條件查詢請求的數(shù)據(jù)表行鍵RowKey集合。使得客戶端可以通過RowKey集合,查詢到符合條件查詢請求的結(jié)果集。解決了現(xiàn)有實現(xiàn)多條件查詢功能的方式,查詢HBase表時需要全表掃描,難以滿足更多查詢需求的問題。有益效果在于以下兩方面,一方面,查詢HBase表時,無需全表掃描,減少了查詢時間,提高了查詢效率,另一方面,具備足夠的靈活性,能滿足多條件查詢的需求,提高了查詢的智能程度。
附圖說明
圖1是本發(fā)明實施例提供的基于Solr實現(xiàn)HBase多條件查詢的方法的實現(xiàn)流程圖;
圖2是本發(fā)明實施例提供的建立支持多條件查詢請求的索引的實現(xiàn)流程圖;
圖3是本發(fā)明實施例提供的查詢時序圖;
圖4是本發(fā)明實施例提供的插入數(shù)據(jù)建立索引時序圖;
圖5是本發(fā)明實施例提供的刪除數(shù)據(jù)刪除索引時序圖;
圖6是本發(fā)明實施例提供的基于Solr實現(xiàn)HBase多條件查詢的系統(tǒng)的結(jié)構(gòu)框圖。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
應(yīng)當(dāng)理解,當(dāng)在本說明書和所附權(quán)利要求書中使用時,術(shù)語“包括”和“包含”指示所描述特征、整體、步驟、操作、元素和/或組件的存在,但并不排除一個或多個其它特征、整體、步驟、操作、元素、組件和/或其集合的存在或添加。
還應(yīng)當(dāng)理解,在此本發(fā)明說明書中所使用的術(shù)語僅僅是出于描述特定實施例的目的而并不意在限制本發(fā)明。如在本發(fā)明說明書和所附權(quán)利要求書中所使用的那樣,除非上下文清楚地指明其它情況,否則單數(shù)形式的“一”、“一個”及“該”意在包括復(fù)數(shù)形式。
還應(yīng)當(dāng)進一步理解,在本發(fā)明說明書和所附權(quán)利要求書中使用的術(shù)語“和/或”是指相關(guān)聯(lián)列出的項中的一個或多個的任何組合以及所有可能組合,并且包括這些組合。
如在本說明書和所附權(quán)利要求書中所使用的那樣,術(shù)語“倘若”可以依據(jù)上下文被解釋為“當(dāng)...時”或“一旦”或“響應(yīng)于確定”或“響應(yīng)于檢測到”。類似地,短語“倘若確定”或“倘若讀取到[所描述條件或事件]”可以依據(jù)上下文被解釋為意指“一旦確定”或“響應(yīng)于確定”或“一旦檢測到[所描述條件或事件]”或“響應(yīng)于檢測到[所描述條件或事件]”。
實施例一
圖1是本發(fā)明實施例提供的基于Solr實現(xiàn)HBase多條件查詢的方法的實現(xiàn)流程圖,詳述如下:
在步驟S101中,Solr服務(wù)器獲取客戶端提交的多條件查詢請求;
在步驟S102中,利用預(yù)先建立支持多條件查詢請求的索引,向所述客戶端返回所述多條件查詢請求的數(shù)據(jù)表行鍵RowKey集合;
其中,所述RowKey集合的元素為數(shù)據(jù)庫表行鍵,所述數(shù)據(jù)表行鍵為開源數(shù)據(jù)庫HBase中數(shù)據(jù)表的行鍵。
其中,數(shù)據(jù)行包括數(shù)據(jù)表行鍵。
通過將支持多條件查詢請求的索引關(guān)聯(lián)數(shù)據(jù)行,完成支持多條件查詢請求的索引與數(shù)據(jù)行中數(shù)據(jù)表行鍵的關(guān)聯(lián)。
在步驟S102之前,所述方法包括:
建立與開源數(shù)據(jù)庫HBase中的數(shù)據(jù)表行鍵相對應(yīng),且支持多條件查詢請求的索引。
在本發(fā)明實施例中,有益效果在于以下兩方面,一方面,查詢HBase表時,無需全表掃描,減少了查詢時間,提高了查詢效率,另一方面,具備足夠的靈活性,能滿足多條件查詢的需求,提高了查詢的智能程度。
實施例二
本發(fā)明實施例描述了建立支持多條件查詢請求的索引的實現(xiàn)流程,詳述如下:
將外部請求的操作碼、數(shù)據(jù)表名稱、當(dāng)前時間戳和數(shù)據(jù)表行鍵,拼接成緩存表的行鍵,為所述數(shù)據(jù)行建立支持多條件查詢請求的索引。
其中,緩存表的行鍵包括以下特征:
操作碼+數(shù)據(jù)表名+時間戳+數(shù)據(jù)表行鍵(RowKey),采用的結(jié)構(gòu)舉例如下:
其中,操作碼、數(shù)據(jù)表名、時間戳和數(shù)據(jù)表行鍵在數(shù)據(jù)行中的位置關(guān)系,需要在建立索引過程、刪除索引過程和查詢過程三者之間約定次序。
實施例三
圖2是本發(fā)明實施例提供的建立支持多條件查詢請求的索引的實現(xiàn)流程圖,詳述如下:
在步驟S201中,接收拼接請求,將拼接請求中的操作碼、數(shù)據(jù)表名稱、當(dāng)前時間戳和數(shù)據(jù)表行鍵,拼接成緩存表的行鍵;
在步驟S202中,在緩存表入庫線程啟動之前,利用緩存表的preput()鉤子先啟動數(shù)據(jù)表的入庫線程,當(dāng)數(shù)據(jù)表入庫線程完成之后,緩存表的preput()鉤子結(jié)束返回,緩存表入庫線程繼續(xù)往下運行,同時數(shù)據(jù)表的postput()鉤子先啟動Solr入庫線程、后啟動確認(rèn)線程,利用所述確認(rèn)線程,確認(rèn)數(shù)據(jù)表或Solr中都不存在所述數(shù)據(jù)行的記錄時,將所述緩存表的行鍵插入到HBase的數(shù)據(jù)表中;
當(dāng)增加數(shù)據(jù)行或更新數(shù)據(jù)行時,配置操作碼為ADD;
當(dāng)刪除數(shù)據(jù)行時,配置操作碼為DEL;
當(dāng)操作碼為ADD時,啟動數(shù)據(jù)表入庫線程,利用數(shù)據(jù)表入庫線程將所述緩存表的行鍵插入到數(shù)據(jù)表中,其中,時間戳與所述緩存表中的保持一致;
當(dāng)操作碼為DEL時,啟動數(shù)據(jù)刪除線程,利用數(shù)據(jù)刪除線程將數(shù)據(jù)行從數(shù)據(jù)表中刪除。
preput()鉤子和postput()鉤子是常用的鉤子函數(shù),在此不做贅述。
在步驟S203中,為所述數(shù)據(jù)行建立Solr中支持多條件查詢請求的索引。
利用Solr入庫線程,為所述數(shù)據(jù)行建立支持多條件查詢請求的索引;
利用Solr刪除線程,刪除所述數(shù)據(jù)行對應(yīng)的支持多條件查詢請求的索引。
在本發(fā)明實施例中,通過緩存表和確認(rèn)線程,解決了HBase與Solr數(shù)據(jù)一致性問題,能避免以下兩種情況的發(fā)生:
(1)HBase中數(shù)據(jù)寫入成功,Solr中沒有寫入成功,導(dǎo)致HBase中出現(xiàn)一些根本無法查詢到的漂浮數(shù)據(jù);
(2)HBase中數(shù)據(jù)沒有寫入成功,但是Solr中寫入成功了,導(dǎo)致根據(jù)索引查詢時出現(xiàn)空集。
實施例四
本發(fā)明實施例描述了步驟S201的實現(xiàn)流程,詳述如下:
在HBase中建立緩存表,接收拼接請求,將拼接請求中的操作碼、數(shù)據(jù)表名稱、當(dāng)前時間戳和數(shù)據(jù)表行鍵,拼接成緩存表的行鍵,將所述緩存表的行鍵插入到所述緩存表中。
實施例五
本發(fā)明實施例描述了提供的建立確認(rèn)線程的實現(xiàn)流程,詳述如下:
建立確認(rèn)線程,所述確認(rèn)線程具體為:
倘若所述數(shù)據(jù)行的操作碼為ADD,則從數(shù)據(jù)表和Solr中查找之前的數(shù)據(jù)行記錄,遍歷之前的數(shù)據(jù)行記錄,確定是否存在所述數(shù)據(jù)行的記錄,若所述數(shù)據(jù)表和Solr中同時存在所述數(shù)據(jù)行的記錄,從緩存表中刪除所述數(shù)據(jù)行,否則,啟動數(shù)據(jù)表入庫線程,對所述數(shù)據(jù)行進行入庫處理;
其中,否則,啟動數(shù)據(jù)表入庫線程,對所述緩存表的行鍵進行入庫處理,包含以下3種情況:
1.數(shù)據(jù)表不存在所述數(shù)據(jù)行記錄,Solr中存在所述數(shù)據(jù)行記錄;
2.數(shù)據(jù)表存在所述數(shù)據(jù)行,Solr中不存在所述數(shù)據(jù);
3.數(shù)據(jù)表和Solr中都不存在所述數(shù)據(jù)行。
倘若所述數(shù)據(jù)行的操作碼為DEL,則從數(shù)據(jù)表和Solr中查找之前的數(shù)據(jù)行記錄,遍歷之前的數(shù)據(jù)行記錄,確定是否存在所述數(shù)據(jù)行的記錄,若所述數(shù)據(jù)表和Solr中都不存在所述數(shù)據(jù)行的記錄,從緩存表中刪除該行所述數(shù)據(jù)行,否則,啟動數(shù)據(jù)刪除線程,對所述數(shù)據(jù)行進行刪除處理。
其中,否則,啟動數(shù)據(jù)刪除線程,對所述緩存表的行鍵進行刪除處理,包含以下3種情況:
1.數(shù)據(jù)表不存在所述數(shù)據(jù)行記錄,Solr中存在所述數(shù)據(jù)行記錄;
2.數(shù)據(jù)表存在所述數(shù)據(jù)行,Solr中不存在所述數(shù)據(jù);
3.數(shù)據(jù)表和Solr中同時存在所述數(shù)據(jù)行。
實施例六
圖3是本發(fā)明實施例提供的查詢時序圖,詳述如下:使用HBase的Observer類型的協(xié)處理器(Coprocessor)結(jié)合Solr實現(xiàn)二級索引的功能。業(yè)務(wù)層多條件查詢時,先查詢Solr索引,返回HBase表的行鍵集合,然后通過行鍵直接命中HBase表的行,返回結(jié)果集,避免查詢HBase表時的全表掃描或者部分掃描。
實施例七
圖4是本發(fā)明實施例提供的插入數(shù)據(jù)建立索引時序圖,詳述如下:
圖4包括:外部請求、緩存表入庫線程、確認(rèn)線程、緩存表、數(shù)據(jù)表入庫線程、數(shù)據(jù)表、Solr入庫線程以及Solr。
1.外部請求新增數(shù)據(jù),啟動緩存表入庫線程;
2.緩存表的prePut()鉤子啟動數(shù)據(jù)表入庫線程,數(shù)據(jù)表入庫線程將數(shù)據(jù)入庫,數(shù)據(jù)表向數(shù)據(jù)表入庫線程發(fā)出入庫返回的結(jié)果,prePut()鉤子返回;
3.緩存表入庫,緩存表入庫返回;
4.數(shù)據(jù)表的postPut()鉤子啟動Solr入庫,入庫返回;
5.數(shù)據(jù)表的postPut()鉤子啟動確認(rèn)線程,確認(rèn)線程的實施過程如下:
查詢時間戳比此記錄的時間戳小的記錄,返回數(shù)據(jù)行集;
循環(huán)部分:foreach(數(shù)據(jù)行),獲取行鎖,檢查數(shù)據(jù)表是否存在此記錄,檢查Solr是否存在此記錄;
替換部分:if(數(shù)據(jù)表和Solr都存在此記錄),刪除記錄行,else啟動數(shù)據(jù)表入庫線程;
釋放行鎖。
其中,緩存表和數(shù)據(jù)表增加Observer類型的協(xié)處理器(Coprocessor),并為緩存表的prePut()鉤子事件增添啟動數(shù)據(jù)表入庫線程和數(shù)據(jù)刪除線程的業(yè)務(wù)邏輯處理功能;
為數(shù)據(jù)表的postPut鉤子事件,負責(zé)啟動Solr入庫線程和確認(rèn)線程。
當(dāng)操作碼為ADD時,啟動數(shù)據(jù)表入庫線程;
當(dāng)操作碼為DEL時,啟動數(shù)據(jù)刪除線程。
實施例八
圖5是本發(fā)明實施例提供的刪除數(shù)據(jù)刪除索引時序圖,詳述如下:
圖5包括:外部請求、緩存表入庫線程、確認(rèn)線程、緩存表、數(shù)據(jù)刪除線程、數(shù)據(jù)表、Solr刪除線程以及Solr。
1.外部請求刪除數(shù)據(jù),啟動緩存表入庫線程;
2.prePut()鉤子啟動,數(shù)據(jù)入庫,數(shù)據(jù)刪除線程刪除數(shù)據(jù)行,刪除返回,prePut()鉤子返回;
3.緩存表入庫,緩存表入庫返回;
4.數(shù)據(jù)表的preDelete()鉤子啟動Solr刪除線程,Solr刪除線程刪除Solr記錄,刪除返回,preDelete()鉤子返回,刪除數(shù)據(jù)行,刪除返回;
5.數(shù)據(jù)表的postDelete()鉤子啟動確認(rèn)線程,確認(rèn)線程的實施過程如下:
查詢時間戳比此記錄的時間戳小的記錄,返回數(shù)據(jù)行集;
循環(huán)部分:foreach(數(shù)據(jù)行),獲取行鎖,檢查數(shù)據(jù)表是否存在此記錄,檢查Solr是否存在此記錄;
替換部分:if(數(shù)據(jù)表和Solr都不存在此記錄),刪除緩存表記錄行,else啟動數(shù)據(jù)刪除線程;
釋放行鎖。
實施例九
圖6是本發(fā)明實施例提供的基于Solr實現(xiàn)HBase多條件查詢的系統(tǒng)的結(jié)構(gòu)框圖。為了便于說明,僅示出了與本實施例相關(guān)的部分。
參照圖6,該基于Solr實現(xiàn)HBase多條件查詢的系統(tǒng),包括:
多條件查詢請求獲取模塊61,用于獲取客戶端提交的多條件查詢請求;
RowKey返回模塊62,用于利用預(yù)先建立支持多條件查詢請求的索引,向所述客戶端返回所述多條件查詢請求的數(shù)據(jù)表行鍵RowKey集合;
其中,所述RowKey集合的元素為數(shù)據(jù)庫表行鍵,所述數(shù)據(jù)表行鍵為開源數(shù)據(jù)庫HBase中數(shù)據(jù)表的行鍵。
作為本實施例的一種實現(xiàn)方式,所述系統(tǒng)還包括:
索引建立模塊,用于將外部請求的操作碼、數(shù)據(jù)表名稱、當(dāng)前時間戳和數(shù)據(jù)表行鍵,拼接成緩存表的行鍵,為所述數(shù)據(jù)行建立支持多條件查詢請求的索引。
作為本實施例的一種實現(xiàn)方式,在所述系統(tǒng)中,所述索引建立模塊包括:
數(shù)據(jù)行拼接模塊,用于接收拼接請求,將拼接請求中的操作碼、數(shù)據(jù)表名稱、當(dāng)前時間戳和數(shù)據(jù)表行鍵,拼接成緩存表的行鍵;
數(shù)據(jù)行插入模塊,用于在緩存表入庫線程啟動之前,利用緩存表的preput()鉤子先啟動數(shù)據(jù)表的入庫線程,當(dāng)數(shù)據(jù)表入庫線程完成之后,緩存表的preput()鉤子結(jié)束返回,緩存表入庫線程繼續(xù)往下運行,同時數(shù)據(jù)表的postput()鉤子先啟動Solr入庫線程、后啟動確認(rèn)線程,利用所述確認(rèn)線程,確認(rèn)數(shù)據(jù)表或Solr中都不存在所述數(shù)據(jù)行的記錄時,將所述緩存表的行鍵插入到HBase的數(shù)據(jù)表中;
索引建立模塊,用于為所述數(shù)據(jù)行建立Solr中支持多條件查詢請求的索引。
作為本實施例的一種實現(xiàn)方式,所述系統(tǒng)還包括:
緩存表入庫模塊,用于在HBase中建立緩存表,接收拼接請求,將拼接請求中的操作碼、數(shù)據(jù)表名稱、當(dāng)前時間戳和數(shù)據(jù)表行鍵,拼接成緩存表的行鍵,將所述緩存表的行鍵插入到所述緩存表中。
作為本實施例的一種實現(xiàn)方式,所述系統(tǒng)還包括:
數(shù)據(jù)行確認(rèn)模塊,用于建立確認(rèn)線程,所述確認(rèn)線程具體為:
倘若所述數(shù)據(jù)行的操作碼為ADD,則從數(shù)據(jù)表和Solr中查找之前的數(shù)據(jù)行記錄,遍歷之前的數(shù)據(jù)行記錄,確定是否存在所述數(shù)據(jù)行的記錄,若所述數(shù)據(jù)表和Solr中同時存在所述數(shù)據(jù)行的記錄,從緩存表中刪除所述數(shù)據(jù)行,否則,啟動數(shù)據(jù)表入庫線程,對所述數(shù)據(jù)行進行入庫處理;
倘若所述數(shù)據(jù)行的操作碼為DEL,則從數(shù)據(jù)表和Solr中查找之前的數(shù)據(jù)行記錄,遍歷之前的數(shù)據(jù)行記錄,確定是否存在所述數(shù)據(jù)行的記錄,若所述數(shù)據(jù)表和Solr中都不存在所述數(shù)據(jù)行的記錄,從緩存表中刪除該行所述數(shù)據(jù)行,否則,啟動數(shù)據(jù)刪除線程,對所述數(shù)據(jù)行進行刪除處理。
本發(fā)明實施例方法中的步驟可以根據(jù)實際需要進行順序調(diào)整、合并和刪減。
本發(fā)明實施例系統(tǒng)和系統(tǒng)中的單元可以根據(jù)實際需要進行合并、劃分和刪減。
本發(fā)明實施例提供的系統(tǒng)可以應(yīng)用在前述對應(yīng)的方法實施例中,詳情參見上述實施例的描述,在此不再贅述。
通過以上的實施方式的描述,所屬領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借助軟件加必需的通用硬件的方式來實現(xiàn)。所述的程序可以存儲于可讀取存儲介質(zhì)中,所述的存儲介質(zhì),如隨機存儲器、閃存、只讀存儲器、可編程只讀存儲器、電可擦寫可編程存儲器、寄存器等。該存儲介質(zhì)位于存儲器,處理器讀取存儲器中的信息,結(jié)合其硬件執(zhí)行本發(fā)明各個實施例所述的方法。
以上所述,僅為本發(fā)明的具體實施方式,但本發(fā)明的保護范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應(yīng)以權(quán)利要求的保護范圍為準(zhǔn)。