本發(fā)明涉及大數(shù)據(jù)、數(shù)據(jù)庫(kù)
技術(shù)領(lǐng)域:
:,提出一種針對(duì)solrcloud的大數(shù)據(jù)sql查詢方法及系統(tǒng)。
背景技術(shù):
::隨著網(wǎng)絡(luò)的發(fā)展和普及,應(yīng)用生產(chǎn)和需要處理的數(shù)據(jù)量越來(lái)越大。數(shù)據(jù)的爆炸式增長(zhǎng),使得現(xiàn)在數(shù)據(jù)庫(kù)系統(tǒng)的工作負(fù)載日益增大,不斷增長(zhǎng)的數(shù)據(jù)量要求越來(lái)越多的應(yīng)用程序能夠擴(kuò)展到更大的集群里去計(jì)算,因此大數(shù)據(jù)分布式計(jì)算是處理海量數(shù)據(jù)的必由之路。solr作為高性能的搜索服務(wù)器,能夠提供快速、強(qiáng)大的全文檢索功能。solrcloud是基于zookeeper和solr的分布式解決方案,為solr添加分布式功能,用于建立高可用、高伸縮、自動(dòng)容錯(cuò)、分布式索引、分布式查詢的solr服務(wù)器集群。solr提供了針對(duì)大規(guī)模文檔數(shù)據(jù)進(jìn)行檢索的查詢語(yǔ)言,查詢功能非常豐富。包括匹配單一字符、匹配0或多個(gè)字符、基于編輯距離的模糊查詢、鄰近查詢(查找相隔一定距離的單詞)、范圍查詢,等等。同時(shí),solr查詢語(yǔ)法還支持多個(gè)查詢條件的組合,如and、or、not等。solr查詢語(yǔ)法也提供了查詢的字段篩選、分頁(yè)等特性。然而,一方面,數(shù)據(jù)庫(kù)領(lǐng)域的開(kāi)發(fā)者還習(xí)慣于使用sql語(yǔ)言來(lái)操縱數(shù)據(jù)庫(kù)。另一方面,由于大數(shù)據(jù)系統(tǒng)的多樣性,一些信息系統(tǒng)的構(gòu)建越來(lái)越希望與底層具體的存儲(chǔ)管理系統(tǒng)(如:mysql集群、mongodb、solrcloud等)解耦。因此需要一種針對(duì)solrcloud的sql查詢引擎。目前,已存在一些基于hive和sparksql的solrcloud查詢引擎,如:hive-solr(https://github.com/qindongliang/hive-solr)就是一種基于hive針對(duì)solr提供hiveql查詢的插件,spark-solr(https://github.com/lucidworks/spark-solr)則是一種基于sparksql的solr查詢插件,它不僅可以將solr的數(shù)據(jù)源映射成spark框架中的rdd(彈性分布式數(shù)據(jù)集),也可以將其注冊(cè)成為一張sparksql的表格,并通過(guò)sql語(yǔ)句進(jìn)行數(shù)據(jù)寫(xiě)入和查詢。以上這些方案存在著突出的弊端:(1)它們太依賴于大數(shù)據(jù)計(jì)算框架,如:hive和sparksql,這會(huì)產(chǎn)生對(duì)復(fù)雜環(huán)境的依賴性,如:最終會(huì)依賴于zookeeper、hadoop等構(gòu)成的龐大的軟件環(huán)境;(2)hive依賴于hadoop的mapreduce計(jì)算框架,sparksql依賴于spark計(jì)算框架,在hive和sparksql中,sql的執(zhí)行往往會(huì)變轉(zhuǎn)換成一連串符合通用規(guī)范(如:map-shuffle-reduce)的計(jì)算任務(wù)完成,執(zhí)行過(guò)程中無(wú)論是框架的啟動(dòng)調(diào)度還是算法的適配轉(zhuǎn)換,都會(huì)帶來(lái)嚴(yán)重的延時(shí)。因此,無(wú)論是基于hive還是sparksql的方案,更適合于批量sql任務(wù)的執(zhí)行,而非在線交互式sql查詢。此外,在solrcloud的高版本中,也在服務(wù)器端自帶了一個(gè)負(fù)責(zé)提供sql接口服務(wù)的模塊。但是,對(duì)于一些基于solrcloud4.0、5.0版本的信息系統(tǒng),選擇該版本就意味著需要針對(duì)生產(chǎn)環(huán)境進(jìn)行改造,包括產(chǎn)品版本升級(jí)、程序改造以及數(shù)據(jù)遷移,這都帶來(lái)潛在的風(fēng)險(xiǎn)和較大的工作量?;谝陨媳尘?,本發(fā)明提出一種針對(duì)solrcloud的大數(shù)據(jù)交互式sql查詢系統(tǒng)。技術(shù)實(shí)現(xiàn)要素:本發(fā)明的目的在于提供一種針對(duì)solrcloud的大數(shù)據(jù)sql查詢方法及系統(tǒng),該系統(tǒng)針對(duì)solrcloud在客戶端實(shí)現(xiàn)了交互式sql查詢的能力,同時(shí)改善了現(xiàn)有數(shù)據(jù)庫(kù)系統(tǒng)無(wú)法滿足全文搜索的現(xiàn)狀。針對(duì)上述目的,本發(fā)明所采用的技術(shù)方案為:一種針對(duì)solrcloud的大數(shù)據(jù)交互式sql查詢系統(tǒng),主要由模塊1和模塊2組成(與圖1對(duì)應(yīng)):模塊1(sql分析與執(zhí)行引擎):該模塊實(shí)現(xiàn)sql語(yǔ)句的解析,制定sql執(zhí)行計(jì)劃,并調(diào)用模塊2完成sql命令的執(zhí)行,向用戶程序返回sql查詢結(jié)果。用戶可以多次提交sql語(yǔ)句并得到查詢結(jié)果,該過(guò)程即為交互式查詢。模塊2(solr適配器):該模塊負(fù)責(zé)執(zhí)行具體的sql執(zhí)行任務(wù),主要工作包括solr查詢翻譯、not操作優(yōu)化、solr查詢與優(yōu)化、表模式映射、配置解析與solrcloud連接。模塊2包括5個(gè)子模塊:模塊2.1(solr查詢翻譯模塊):將sql的關(guān)系查詢條件翻譯成solr的查詢條件;模塊2.2(not操作優(yōu)化模塊):將查詢條件中的not條件轉(zhuǎn)換為solr中對(duì)應(yīng)的查詢條件,如:將not(a=1andb=2)轉(zhuǎn)換成a?。?orb?。?;模塊2.3(solr查詢與優(yōu)化模塊):執(zhí)行solr查詢,返回查詢結(jié)果。為了避免大數(shù)據(jù)量帶來(lái)的客戶端等待問(wèn)題,該模塊設(shè)計(jì)了逐頁(yè)緩沖機(jī)制;模塊2.4(表模式映射模塊):該模塊負(fù)責(zé)將solr中的文檔集合(collection)映射成sql表格,將solr中的文檔(document)和字段(field),映射成sql表格的行和列;模塊2.5(配置解析與solrcloud連接模塊):該模塊負(fù)責(zé)解析傳入的配置參數(shù),包括solr的服務(wù)器位置、solr的文檔集合名稱、sql表格的列名,以及對(duì)應(yīng)的solr字段名。同時(shí)通過(guò)調(diào)用solrcloud的客戶端api,建立與服務(wù)器的連接。進(jìn)一步地,模塊1基于開(kāi)源項(xiàng)目apachecalcite(http://calcite.apache.org)完成sql語(yǔ)句解析和執(zhí)行計(jì)劃,apachecalcite是一個(gè)分布式sql查詢引擎的框架,不依賴于任何大數(shù)據(jù)計(jì)算框架,因此具有較好的可移植性。進(jìn)一步地,模塊1的啟動(dòng)依賴于某個(gè)配置文件,該配置文件必須遵循apachecalcite中schema定義的json格式。進(jìn)一步地,模塊2.1會(huì)接收到模塊1傳遞過(guò)來(lái)的對(duì)應(yīng)于sql查詢條件的rexnode對(duì)象,然后針對(duì)rexnode對(duì)象的具體結(jié)構(gòu)逐層進(jìn)行翻譯,如:針對(duì)“a=1andb=2”,會(huì)先將a=1和b=2這兩個(gè)二元操作分別翻譯成a:1和b:2,然后再執(zhí)行and操作的翻譯。該模塊支持sql的各類(lèi)查詢條件,包括與、或、非、大于、小于、非空、為空、等于、like、不等于、大于等于、小于等于。翻譯過(guò)程如具體實(shí)施例2所示。進(jìn)一步地,模塊2.1會(huì)智能的將sql查詢條件分解成solr可接受的部分,以及不可接受的部分。如:針對(duì)namelike‘b%’andlength(name)>20這樣的表達(dá)式,會(huì)分解成namelike‘b%’和length(name)>20兩部分。模塊1會(huì)針對(duì)模塊2的查詢結(jié)果做二次過(guò)濾,因此length(name)>20會(huì)被再次作為條件針對(duì)查詢結(jié)果過(guò)濾一遍。進(jìn)一步地,模塊2.2的not操作優(yōu)化過(guò)程如具體實(shí)施例3所示。進(jìn)一步地,模塊2.3設(shè)計(jì)了一個(gè)逐頁(yè)緩沖的機(jī)制,通過(guò)首次solr查詢得到記錄總數(shù)目m,并根據(jù)m和分頁(yè)大小n,計(jì)算出頁(yè)數(shù)p,從而將總查詢分解成p個(gè)連續(xù)的子查詢,每個(gè)查詢具有相同的查詢條件,但具有不同的偏移位置。只有當(dāng)用戶程序請(qǐng)求獲取到第x頁(yè)的時(shí)候,才會(huì)真正向solr提交第x頁(yè)的查詢請(qǐng)求。該逐頁(yè)緩沖機(jī)制避免了用戶程序的長(zhǎng)時(shí)間等待和網(wǎng)絡(luò)資源消耗。進(jìn)一步地,模塊2.4僅在第一次針對(duì)某表進(jìn)行操作的時(shí)候才會(huì)執(zhí)行該表的模式映射。進(jìn)一步地,模塊2.5會(huì)接收到模塊1接收到的配置信息,僅在第一次針對(duì)該表進(jìn)行操作的時(shí)候才會(huì)解析。進(jìn)一步地,模塊2.5中solrcloud連接的建立與維護(hù),除了支持solrcloud集群,也支持單節(jié)點(diǎn)的solr服務(wù)器。本發(fā)明的有益效果在于:本發(fā)明提供了一種針對(duì)solrcloud的大數(shù)據(jù)交互式sql查詢系統(tǒng),與傳統(tǒng)的采用api或者solr查詢語(yǔ)法進(jìn)行查詢的方法相比,該系統(tǒng)支持采用標(biāo)準(zhǔn)的sql語(yǔ)言對(duì)solrcloud進(jìn)行交互式查詢,增強(qiáng)了程序開(kāi)發(fā)的通用性。同時(shí),本系統(tǒng)將solr的模糊查詢、鄰近查詢的能力移植到sql語(yǔ)句中,允許采用like操作符以及函數(shù)實(shí)現(xiàn)針對(duì)字段的非精確檢索。本發(fā)明系統(tǒng)的優(yōu)點(diǎn)具體為:(1)提供了一種非api的方式實(shí)現(xiàn)對(duì)solrcloud系統(tǒng)的操作。目前基于solrcloud的應(yīng)用,主要通過(guò)c++/java等api的方式實(shí)現(xiàn)對(duì)solrcloud的讀、寫(xiě)操作,這種方式對(duì)開(kāi)發(fā)人員要求較高,且很容易受到api客戶端版本的影響。采用本發(fā)明方法,則可以采用標(biāo)準(zhǔn)的sql語(yǔ)言實(shí)現(xiàn)對(duì)solrcloud文檔數(shù)據(jù)的操作,開(kāi)發(fā)人員甚至不需要編寫(xiě)程序,通過(guò)常用的sql語(yǔ)言,即可完成需求。(2)沒(méi)有采用諸如hadoop、spark的大數(shù)據(jù)計(jì)算框架,因此該系統(tǒng)具有良好的可移植性,同時(shí)由于不需要大數(shù)據(jù)計(jì)算框架的加載準(zhǔn)備時(shí)間,該系統(tǒng)具有較好的性能。(3)對(duì)solrcloud的版本沒(méi)有要求,而且是一種客戶端的程序方案,因此部署極其方便。solrcloud在6.0版本之后也提供了內(nèi)置的sql引擎,一些基于solrcloud4.0、5.0版本的信息系統(tǒng),采用本發(fā)明就可以節(jié)省掉版本升級(jí)、程序改造以及數(shù)據(jù)遷移帶來(lái)的工作量。附圖說(shuō)明圖1為本發(fā)明系統(tǒng)的內(nèi)部結(jié)構(gòu)示意圖;圖2為本發(fā)明中sql查詢的執(zhí)行流程圖。圖3為本發(fā)明中solr條件描述類(lèi)的uml模型圖。具體實(shí)施方式為使本發(fā)明的上述特征和優(yōu)點(diǎn)能更明顯易懂,下文特舉實(shí)施例,并配合附圖作詳細(xì)說(shuō)明如下。1、sql查詢的執(zhí)行流程說(shuō)明在本發(fā)明系統(tǒng)中,一條sql查詢的執(zhí)行流程如圖2所示。其中:步驟1:用戶程序向本系統(tǒng)提交一條sql查詢語(yǔ)句s;步驟2:本系統(tǒng)中的calcite查詢引擎解析查詢語(yǔ)句,并將其中的where條件解析成rexnode對(duì)象rn,跳轉(zhuǎn)至步驟3。如果不存在where條件,則創(chuàng)建一個(gè)搜索所有記錄的solr查詢(記為sf2),并跳轉(zhuǎn)至步驟6;步驟3:calcite查詢引擎將對(duì)象rn傳遞至solr適配器(模塊2);步驟4:solr適配器查詢翻譯模塊將rn翻譯成solr查詢sf1;步驟5:not操作優(yōu)化模塊將solr查詢sf1中的not條件進(jìn)行轉(zhuǎn)換,得到sf2;步驟6:solr查詢與優(yōu)化模塊將sf2分解成針對(duì)solrcloud集群的逐頁(yè)查詢,連接solrcloud服務(wù)器,獲得查詢結(jié)果r1;步驟7:calcite查詢引擎針對(duì)r1采用原始過(guò)濾條件rn(即原始過(guò)濾條件的rexnode對(duì)象)進(jìn)行二次過(guò)濾,得到r2,該步驟可以處理沒(méi)有經(jīng)過(guò)solr適配器過(guò)濾的結(jié)果;步驟8:calcite查詢引擎向用戶程序返回sql查詢結(jié)果r2。2、solr查詢翻譯方法說(shuō)明步驟1:接收到rexnode對(duì)象,創(chuàng)建三元組t(kind,left,right),其中:kind為該rexnode對(duì)應(yīng)的查詢條件的類(lèi)型(與、或、非、大于、小于,等),left為左操作數(shù),right為右操作數(shù);步驟2:針對(duì)三元組t進(jìn)行匹配,共區(qū)分20種情況,如下:本發(fā)明定義了一系列的類(lèi)來(lái)描述每一種solr查詢條件,并根據(jù)上表中的不同情況生成對(duì)應(yīng)的類(lèi)對(duì)象。如:根據(jù)第19種情況,會(huì)構(gòu)建出notsolrfilter對(duì)象。類(lèi)似的類(lèi)包括andsolrfilter、notsolrfilter、orsolrfilter、gtsolrfilter、notnullsolrfilter、isnullsolrfilter、equalssolrfilter、likesolrfilter、notequalssolrfilter、gesolrfilter、lesolrfilter、ltsolrfilter等,另外,不可轉(zhuǎn)換的條件被定義為unrecognizedsolrfilter。這些類(lèi)實(shí)現(xiàn)了一個(gè)相同的接口solrfilter,uml類(lèi)圖如圖3所示。solrfilter接口定義了一個(gè)方法:tosolrquerystring(),該方法返回當(dāng)前solr查詢條件對(duì)應(yīng)的查詢串,如equalssolrfilter類(lèi)的定義如下:3、not操作優(yōu)化設(shè)計(jì)說(shuō)明not操作優(yōu)化的原理在于:替換形如not(filter)的操作,避免轉(zhuǎn)換后的表達(dá)式中出現(xiàn)not操作符。優(yōu)化規(guī)則如下:(1)如果遇到not(x>y)的條件,則替換成x≤y;(2)如果遇到not(x≥y)的條件,則替換成x<y;(3)如果遇到not(x<y)的條件,則替換成x≥y;(4)如果遇到not(x≤y)的條件,則替換成x>y;(5)如果遇到not(x==y(tǒng))的條件,則替換成x?。統(tǒng);(6)如果遇到not(x?。統(tǒng))的條件,則替換成x==y(tǒng);(7)如果遇到not(xisnull)的條件,則替換成xisnotnull;(8)如果遇到not(xisnotnull)的條件,則替換成xisnull;(9)如果遇到not(not(xxx))的條件,則替換成xxx,且繼續(xù)對(duì)其中的xxx條件進(jìn)行not操作優(yōu)化;(10)如果遇到and(xxx)的條件,繼續(xù)對(duì)其中的xxx條件進(jìn)行not操作優(yōu)化;(11)如果遇到or(xxx)的條件,繼續(xù)對(duì)其中的xxx條件進(jìn)行not操作優(yōu)化;(12)如果遇到not(and(xxx,yyy))的條件,則替換成(notx)or(noty),并且繼續(xù)對(duì)其中的xxx,yyy條件進(jìn)行not操作優(yōu)化;(13)如果遇到not(or(xxx,yyy))的條件,則替換成(notx)and(noty),并且繼續(xù)對(duì)其中的xxx,yyy條件進(jìn)行not操作優(yōu)化;(14)其他情況,則不進(jìn)行not操作優(yōu)化;以上規(guī)則如下表所示:4、程序類(lèi)設(shè)計(jì)說(shuō)明本發(fā)明系統(tǒng)采用scala語(yǔ)言開(kāi)發(fā),主要包括如下類(lèi):●solrtable:apachecalcite提供的abstracttable的子類(lèi),同時(shí)實(shí)現(xiàn)了apachecalcite提供的scannabletable和filterabletable接口,solrtable代表對(duì)應(yīng)于solr文檔集合的sql表,主要實(shí)現(xiàn)了scan()等方法,用以獲取符合條件的記錄;●solrtablefactory:apachecalcite提供的tablefactory的子類(lèi),用以根據(jù)指定參數(shù),創(chuàng)建solrtable對(duì)象;●solrqueryresultsiterator:針對(duì)solr查詢結(jié)果中的記錄的一個(gè)迭代器;●solrqueryresults:實(shí)現(xiàn)了對(duì)solr查詢結(jié)果的封裝,它包含了一個(gè)solrqueryresultsiterator對(duì)象;●sqlfilter2solrfiltertranslator:核心類(lèi),實(shí)現(xiàn)sql查詢到solr查詢的翻譯;●solrfilter:代表轉(zhuǎn)換后的solr查詢條件,本發(fā)明同時(shí)定義了solrfilter的各個(gè)子類(lèi),包括andsolrfilter、notsolrfilter、orsolrfilter、gtsolrfilter、notnullsolrfilter、isnullsolrfilter、equalssolrfilter、likesolrfilter、notequalssolrfilter、gesolrfilter、lesolrfilter、ltsolrfilter等,另外,不可轉(zhuǎn)換的條件被定義為unrecognizedsolrfilter?!駍olrtableconf:一個(gè)工具類(lèi),主要提供文本型、整形等參數(shù)解析等方法;5、本發(fā)明系統(tǒng)的使用示例如下針對(duì)本發(fā)明系統(tǒng)的使用給出示例代碼:以上程序是一個(gè)正常的jdbc客戶端程序,與其他程序的區(qū)別在于jdbcurl的格式如"jdbc:calcite:model=src/java/test/model.json",其中指定采用apachecalcite引擎的驅(qū)動(dòng),并采用model.json作為配置文件,model.json內(nèi)容如下:其中定義了一個(gè)名為solr的sql數(shù)據(jù)庫(kù),在該庫(kù)下面定義了一個(gè)名為docs的sql數(shù)據(jù)表,該表由org.apache.calcite.adapter.solr.solrtablefactory采用如下屬性進(jìn)行創(chuàng)建:●solrserverurl:solr服務(wù)器地址,如:http://bluejoe1:8983/solr/collection1●solrzkhosts:solrcloud使用zookeeper地址,如:bluejoe1:9983●solrcollection:solr文檔集合的名稱,如:collection1●columns:由逗號(hào)分隔的列信息,如:idinteger,namechar,ageinteger●columnmapping:由逗號(hào)分隔的列映射信息,如:name->name_s,age->age_i表示name列在solr文檔中存為name_s字段,age列在solr文檔中存為age_s字段,●pagesize:分頁(yè)時(shí)用到的每一頁(yè)的記錄數(shù)目,如:50當(dāng)用戶指定了solrzkhosts參數(shù),系統(tǒng)將連接對(duì)應(yīng)的solrcloud集群;當(dāng)用戶指定了solrserverurl參數(shù),系統(tǒng)將連接對(duì)應(yīng)的單個(gè)節(jié)點(diǎn)。這兩個(gè)參數(shù)只能同時(shí)選擇一個(gè)。以上實(shí)施僅用以說(shuō)明本發(fā)明的技術(shù)方案而非對(duì)其進(jìn)行限制,本領(lǐng)域的普通技術(shù)人員可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明的精神和范圍,本發(fā)明的保護(hù)范圍應(yīng)以權(quán)利要求書(shū)所述為準(zhǔn)。當(dāng)前第1頁(yè)12當(dāng)前第1頁(yè)12