本發(fā)明涉及數(shù)據(jù)查詢技術(shù),尤其涉及一種分布式系統(tǒng)中海量數(shù)據(jù)的查詢方法及裝置。
背景技術(shù):
大數(shù)據(jù)現(xiàn)在已經(jīng)進(jìn)入全球經(jīng)濟(jì)的各個(gè)部門。就像其他的生產(chǎn)必備要素(例如,硬資產(chǎn)和人力資本)一樣,許多現(xiàn)代經(jīng)濟(jì)活動(dòng)離開了它也根本不能發(fā)生。大數(shù)據(jù)的使用正成為領(lǐng)先企業(yè)在業(yè)績(jī)方面超越其同行的一種重要方式。企業(yè)可以利用數(shù)據(jù)來設(shè)計(jì)與客戶需求更匹配的產(chǎn)品。甚至可以利用數(shù)據(jù)對(duì)使用中的產(chǎn)品進(jìn)行改進(jìn)。一個(gè)此類例子是,一款能了解使用者習(xí)慣和偏好、裝有針對(duì)這一特定使用者的需求而定制的應(yīng)用和數(shù)據(jù)的手機(jī)要比一部新的非定制設(shè)備更有價(jià)值。
為了更有效利用這些數(shù)據(jù),提升企業(yè)的競(jìng)爭(zhēng)力,必須有相應(yīng)的手段來快速、準(zhǔn)確、高效地對(duì)海量的數(shù)據(jù)進(jìn)行分析,挖掘數(shù)據(jù)中存在的潛在價(jià)值,并將其轉(zhuǎn)化成決策的依舊,而作為大數(shù)據(jù)分析的產(chǎn)品hadoop應(yīng)運(yùn)而生。hadoop作為一個(gè)分布式產(chǎn)品,通過大量廉價(jià)的硬件設(shè)備組成的集群上運(yùn)行應(yīng)用程序,全面地將計(jì)算推向數(shù)據(jù)。hive作為一個(gè)基于hadoop的數(shù)據(jù)倉(cāng)庫(kù)平臺(tái),它可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射成一張數(shù)據(jù)表,通過它,我們可以方便地進(jìn)行etl的工作。hive定義了一個(gè)類似于sql的查詢語(yǔ)言:hql,能夠?qū)⒂脩艟帉懙膓l轉(zhuǎn)化為相應(yīng)的mapreduce程序基于hadoop執(zhí)行,而不需要另外開發(fā)專門mapreduce應(yīng)用,對(duì)于數(shù)據(jù)分析人員來說,基于關(guān)系型數(shù)據(jù)庫(kù)的sql的編寫已經(jīng)作為一個(gè)基本要求,hive的出現(xiàn)將hadoop上的開發(fā)降低了很多門檻。hive的提出是作為數(shù)據(jù)離線數(shù)據(jù)分析產(chǎn)品,相對(duì)的針對(duì)大量數(shù)據(jù)的在線分析產(chǎn)品impala也隨 后出現(xiàn)。impala作為在線分析產(chǎn)品,他要求能夠快速的返回用戶的查詢需求,他最大特點(diǎn)也是最大賣點(diǎn)就是它的快速,他和hive一樣都是基于hdfs文件系統(tǒng),都支持類sql語(yǔ)句。
現(xiàn)有技術(shù)存在的問題如下所述:
由于現(xiàn)有hive和impala在處理海量數(shù)據(jù)分析的時(shí)候存在各種的缺陷。就hive而言,它是通過將sql語(yǔ)句自動(dòng)轉(zhuǎn)化成mapreduce任務(wù),然后通過mapreduce計(jì)算框架進(jìn)行數(shù)據(jù)分析處理,為此hive的性能完全受限于mapreduce本身的性能,而mapreduce框架設(shè)計(jì)的初衷就是為了面對(duì)海量離線數(shù)據(jù)存儲(chǔ),通過分布式運(yùn)算來提高處理性能,因而mapreduce底層更多考慮的是如何提升處理的數(shù)據(jù)量以及增加處理的節(jié)點(diǎn)數(shù),而出于對(duì)性能方面的考慮會(huì)稍后于前面2者。mapreduce處理分成map和reduce2個(gè)階段,在處理一個(gè)查詢操作時(shí),mapreduce會(huì)先對(duì)輸入數(shù)據(jù)文件進(jìn)行切分(split),將整個(gè)查詢分成一連串的map任務(wù)(task),每個(gè)maptask根據(jù)業(yè)務(wù)需求獲取有效數(shù)據(jù),即數(shù)據(jù)篩選,這些task分布在不同的節(jié)點(diǎn)上運(yùn)行,并將這些中間數(shù)據(jù)結(jié)果以key-value的方式進(jìn)行存儲(chǔ)到執(zhí)行該maptask的節(jié)點(diǎn)的本地磁盤上,然后在根據(jù)key將各節(jié)點(diǎn)上的中間數(shù)據(jù)進(jìn)行洗牌(shuffle),再聚集到各個(gè)計(jì)算節(jié)點(diǎn)上進(jìn)行最終的reduce處理,輸出數(shù)據(jù)文件。在這個(gè)過程中,中間數(shù)據(jù)結(jié)果保存在磁盤上,然后又從數(shù)據(jù)磁盤中讀取,通過網(wǎng)絡(luò)在整個(gè)集群中進(jìn)行數(shù)據(jù)傳輸,都會(huì)大大影響整個(gè)查詢的性能,而mapreduce框架追求的是更大規(guī)模的集群以及更大量的數(shù)據(jù)集,這也加劇這部分性能的損耗。當(dāng)處理的數(shù)據(jù)集相對(duì)海量數(shù)據(jù)較小時(shí),再調(diào)用如此臃腫的框架進(jìn)行計(jì)算,對(duì)查詢的性能來說影響非常大,可能查詢只需要幾秒鐘,而框架調(diào)度上卻需要消耗幾倍甚至幾十倍的時(shí)間,對(duì)數(shù)據(jù)分析來說這點(diǎn)讓人難以忍受,雖然hive針對(duì)這種情況提出的簡(jiǎn)單查詢(fetch)的方法,但這種方法的一方面適用性有限,另一方面需要人工的過度干預(yù),效果并不是很理想。
就impala而言,impala是cloudera在受到google的dremel啟發(fā)下開發(fā)的實(shí)時(shí)交互sql大數(shù)據(jù)查詢工具,impala沒有再使用緩慢的hive+mapreduce 批處理,而是通過使用與商用并行關(guān)系數(shù)據(jù)庫(kù)(mpp)中類似的分布式查詢引擎,可以直接從hdfs或hbase中用select、join和統(tǒng)計(jì)函數(shù)查詢數(shù)據(jù),從而大大降低了延遲。在處理一個(gè)查詢時(shí),impala先通過語(yǔ)法解析器(jflex)解析sql語(yǔ)句,翻譯成一棵完整的執(zhí)行計(jì)劃樹,調(diào)度器把執(zhí)行計(jì)劃分發(fā)給具有相應(yīng)數(shù)據(jù)的其它impalad進(jìn)行執(zhí)行,并將查詢結(jié)果通過流的方式進(jìn)行匯總,最終返回給發(fā)起查詢的客戶端上。和hive相比,在這個(gè)過程中,不會(huì)產(chǎn)生中間數(shù)據(jù),也不會(huì)將中間結(jié)果進(jìn)行shuffle操作,各節(jié)點(diǎn)的調(diào)度上也不會(huì)出現(xiàn)復(fù)雜的情況,因此和hive相比大大提升了查詢性能。但由于impala查詢的結(jié)果并不寫入磁盤,而是保存在內(nèi)存中,通過流進(jìn)行傳輸,為此受限于服務(wù)器硬件內(nèi)存限制,只能處理有限的數(shù)據(jù)量集合,當(dāng)數(shù)據(jù)量超過物理內(nèi)存大小時(shí),雖然新版的impala會(huì)使用到外存,但這個(gè)處理性能就會(huì)降低非常多。根據(jù)在一個(gè)小的測(cè)試環(huán)境中驗(yàn)證,在小數(shù)據(jù)量級(jí)別的查詢中impala性能比hive提升3~10倍,而隨著數(shù)據(jù)量的增加,這個(gè)性能比逐漸降低,超過一定值后hive性能反而更高。
無論采用上述hive和impala中哪一種查詢方案,都會(huì)存在各自的問題,然而,相關(guān)技術(shù)中對(duì)此并未存在有效的解決方案。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明實(shí)施例希望提供一種分布式系統(tǒng)中海量數(shù)據(jù)的查詢方法及裝置,至少解決了現(xiàn)有技術(shù)存在的問題。
本發(fā)明實(shí)施例的技術(shù)方案是這樣實(shí)現(xiàn)的:
本發(fā)明實(shí)施例的一種分布式系統(tǒng)中海量數(shù)據(jù)的查詢方法,所述方法包括:
對(duì)收到的查詢請(qǐng)求進(jìn)行解析,以得到用于表征業(yè)務(wù)分析需求的語(yǔ)句所生成的執(zhí)行任務(wù);
根據(jù)所述執(zhí)行任務(wù)中的數(shù)據(jù)文件大小和集群可用內(nèi)存選擇hive查詢引擎或impala查詢引擎對(duì)所述執(zhí)行任務(wù)進(jìn)行分布式查詢,以生成所述執(zhí)行任務(wù)中用于表征業(yè)務(wù)分析需求的語(yǔ)句對(duì)應(yīng)的新的執(zhí)行路徑。
上述方案中,所述方法還包括:
將查詢請(qǐng)求需要的數(shù)據(jù)進(jìn)行分布式存儲(chǔ)。
上述方案中,所述方法還包括:
獲取所述執(zhí)行任務(wù)中的每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小、集群可用內(nèi)存大小。
上述方案中,所述對(duì)收到的查詢請(qǐng)求進(jìn)行解析,以得到用于表征業(yè)務(wù)分析需求的語(yǔ)句所生成的執(zhí)行任務(wù),包括:
將用于表征業(yè)務(wù)分析需求的語(yǔ)句通過所述hive查詢引擎對(duì)應(yīng)的hive算法進(jìn)行解析,分析生成的所述執(zhí)行任務(wù),獲取所述執(zhí)行任務(wù)中的操作數(shù)據(jù)表名字、操作的字段名和語(yǔ)句中的查詢條件。
上述方案中,根據(jù)所述執(zhí)行任務(wù)中的數(shù)據(jù)文件大小和集群可用內(nèi)存選擇hive查詢引擎或impala查詢引擎對(duì)所述執(zhí)行任務(wù)進(jìn)行分布式查詢,以生成所述執(zhí)行任務(wù)中用于表征業(yè)務(wù)分析需求的語(yǔ)句對(duì)應(yīng)的新的執(zhí)行路徑,包括:
當(dāng)數(shù)據(jù)文件大小超過集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),使用所述hive查詢引擎對(duì)應(yīng)的hive算法,結(jié)合所述操作數(shù)據(jù)表名字、操作的字段名和語(yǔ)句中的查詢條件,并按照hive算法執(zhí)行數(shù)據(jù)查詢和結(jié)果輸出,生成所述新的執(zhí)行路徑;
當(dāng)數(shù)據(jù)文件大小未超過集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),使用impala查詢引擎對(duì)應(yīng)的impala算法,結(jié)合所述操作數(shù)據(jù)表名字、操作的字段名和語(yǔ)句中的查詢條件,并按照impala算法執(zhí)行數(shù)據(jù)查詢和結(jié)果輸出,生成所述新的執(zhí)行路徑。
上述方案中,所述方法還包括:
將每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小與集群可用內(nèi)存大小進(jìn)行比較之前,結(jié)合每個(gè)操作數(shù)據(jù)表中的統(tǒng)計(jì)信息,獲取到每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小,如果通過所述hive算法進(jìn)行解析得到的解析結(jié)果中包含分區(qū)表,則在獲取操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小時(shí),只需獲取對(duì)應(yīng)的分區(qū)文件大小。
上述方案中,所述方法還包括:
判斷是單表查詢還是多表查詢;
當(dāng)執(zhí)行所述單表查詢時(shí),執(zhí)行所述將每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小與集群可用內(nèi)存大小進(jìn)行比較;
當(dāng)執(zhí)行所述多表查詢時(shí),將所有操作數(shù)據(jù)表大小總和與集群可用內(nèi)存大小進(jìn)行比較。
上述方案中,所述將所有操作數(shù)據(jù)表大小總和與集群可用內(nèi)存大小進(jìn)行比較,包括:
當(dāng)所述所有操作數(shù)據(jù)表大小總和小于所述集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),如果有where過濾條件的表,則將所述有where過濾條件的表進(jìn)行數(shù)據(jù)過濾;如果沒有where過濾條件的表,則使用所述hive算法進(jìn)行數(shù)據(jù)查詢和結(jié)果輸出;
當(dāng)所述所有操作數(shù)據(jù)表大小總和大于等于所述集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),使用所述impala算法進(jìn)行數(shù)據(jù)查詢和結(jié)果輸出。
本發(fā)明實(shí)施例的一種分布式系統(tǒng)中海量數(shù)據(jù)的查詢裝置,所述裝置包括:解析單元和處理單元;其中,
所述解析單元,用于對(duì)收到的查詢請(qǐng)求進(jìn)行解析,以得到用于表征業(yè)務(wù)分析需求的語(yǔ)句所生成的執(zhí)行任務(wù);
所述處理單元,用于根據(jù)所述執(zhí)行任務(wù)中的數(shù)據(jù)文件大小和集群可用內(nèi)存選擇hive查詢引擎或impala查詢引擎對(duì)所述執(zhí)行任務(wù)進(jìn)行分布式查詢,以生成所述執(zhí)行任務(wù)中用于表征業(yè)務(wù)分析需求的語(yǔ)句對(duì)應(yīng)的新的執(zhí)行路徑。
上述方案中,所述裝置還包括:
所述存儲(chǔ)單元,用于將查詢請(qǐng)求需要的數(shù)據(jù)進(jìn)行分布式存儲(chǔ)。
上述方案中,所述裝置還包括:
獲取單元,用于獲取所述執(zhí)行任務(wù)中的每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小、集群可用內(nèi)存大小。
上述方案中,所述解析單元,還包括:
分析接口,用于將用于表征業(yè)務(wù)分析需求的語(yǔ)句通過所述hive查詢引擎對(duì)應(yīng)的hive算法進(jìn)行解析;
分析執(zhí)行任務(wù)子單元,用于分析生成的所述執(zhí)行任務(wù);
獲取表名子單元,用于獲取所述執(zhí)行任務(wù)中的操作數(shù)據(jù)表名字和操作的字段名;
獲取查詢條件子單元,用于獲取語(yǔ)句中的查詢條件。
上述方案中,所述處理單元,進(jìn)一步用于:
當(dāng)數(shù)據(jù)文件大小超過集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),使用所述hive查詢引擎對(duì)應(yīng)的hive算法,結(jié)合所述操作數(shù)據(jù)表名字、操作的字段名和語(yǔ)句中的查詢條件,并按照hive算法執(zhí)行數(shù)據(jù)查詢和結(jié)果輸出,以生成所述新的執(zhí)行路徑;
當(dāng)數(shù)據(jù)文件大小未超過集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),使用impala查詢引擎對(duì)應(yīng)的impala算法,結(jié)合所述操作數(shù)據(jù)表名字、操作的字段名和語(yǔ)句中的查詢條件,并按照impala算法執(zhí)行數(shù)據(jù)查詢和結(jié)果輸出,以生成所述新的執(zhí)行路徑。
上述方案中,所述處理單元,進(jìn)一步用于將每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小與集群可用內(nèi)存大小進(jìn)行比較之前,結(jié)合每個(gè)操作數(shù)據(jù)表中的統(tǒng)計(jì)信息,獲取到每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小,如果通過所述hive算法進(jìn)行解析得到的解析結(jié)果中包含分區(qū)表,則在獲取操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小時(shí),只需獲取對(duì)應(yīng)的分區(qū)文件大小。
上述方案中,所述處理單元,進(jìn)一步用于:
判斷是單表查詢還是多表查詢;
當(dāng)執(zhí)行所述單表查詢時(shí),執(zhí)行所述將每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小與集群可用內(nèi)存大小進(jìn)行比較;
當(dāng)執(zhí)行所述多表查詢時(shí),將所有操作數(shù)據(jù)表大小總和與集群可用內(nèi)存大小進(jìn)行比較。
上述方案中,所述處理單元,進(jìn)一步用于:
當(dāng)所述所有操作數(shù)據(jù)表大小總和小于所述集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),如果有where過濾條件的表,則將所述有where過濾條件的表進(jìn)行數(shù)據(jù)過 濾;如果沒有where過濾條件的表,則使用所述hive算法進(jìn)行數(shù)據(jù)查詢和結(jié)果輸出;
當(dāng)所述所有操作數(shù)據(jù)表大小總和大于等于所述集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),使用所述impala算法進(jìn)行數(shù)據(jù)查詢和結(jié)果輸出。
本發(fā)明實(shí)施例的分布式系統(tǒng)中海量數(shù)據(jù)的查詢方法包括:對(duì)收到的查詢請(qǐng)求進(jìn)行解析,以得到用于表征業(yè)務(wù)分析需求的語(yǔ)句所生成的執(zhí)行任務(wù);根據(jù)所述執(zhí)行任務(wù)中的數(shù)據(jù)文件大小和集群可用內(nèi)存選擇hive查詢引擎或impala查詢引擎對(duì)所述執(zhí)行任務(wù)進(jìn)行分布式查詢,以生成所述執(zhí)行任務(wù)中用于表征業(yè)務(wù)分析需求的語(yǔ)句對(duì)應(yīng)的新的執(zhí)行路徑。采用本發(fā)明實(shí)施例,通過分布式存儲(chǔ)和分布式查詢,提高了查詢效率,避免了上述hive和impala中任何一個(gè)查詢方案的缺陷。
附圖說明
圖1為本發(fā)明實(shí)施例的方法流程圖;
圖2為本發(fā)明實(shí)施例的裝置組成結(jié)果示意圖;
圖3為本發(fā)明實(shí)施例中基于圖2所示的裝置執(zhí)行的運(yùn)行流程圖;
圖4為應(yīng)用本發(fā)明實(shí)施例的hive算法得到的語(yǔ)句實(shí)例的示意圖;
圖5為應(yīng)用本發(fā)明實(shí)施例的hive算法和/或impal算法得到的裝置執(zhí)行的運(yùn)行流程圖。
具體實(shí)施方式
下面結(jié)合附圖對(duì)技術(shù)方案的實(shí)施作進(jìn)一步的詳細(xì)描述。
本發(fā)明實(shí)施例的分布式系統(tǒng)中海量數(shù)據(jù)的查詢方法,如圖1所示,所述方法包括:
步驟101、對(duì)收到的查詢請(qǐng)求進(jìn)行解析,以得到用于表征業(yè)務(wù)分析需求的語(yǔ)句所生成的執(zhí)行任務(wù);
步驟102、根據(jù)所述執(zhí)行任務(wù)中的數(shù)據(jù)文件大小和集群可用內(nèi)存選擇hive 查詢引擎或impala查詢引擎對(duì)所述執(zhí)行任務(wù)進(jìn)行分布式查詢,以生成所述執(zhí)行任務(wù)中用于表征業(yè)務(wù)分析需求的語(yǔ)句對(duì)應(yīng)的新的執(zhí)行路徑。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述方法還包括:將查詢請(qǐng)求需要的數(shù)據(jù)進(jìn)行分布式存儲(chǔ)。具體的,對(duì)數(shù)據(jù)進(jìn)行分布式存儲(chǔ),以便在啟動(dòng)分布式查詢后,將所述數(shù)據(jù)提供給由至少兩套分布式查詢算法(如hive算法和impala算法)所構(gòu)造的分布式查詢引擎使用。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述方法還包括:
獲取所述執(zhí)行任務(wù)中的每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小、集群可用內(nèi)存大小。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述對(duì)收到的查詢請(qǐng)求進(jìn)行解析,以得到用于表征業(yè)務(wù)分析需求的語(yǔ)句所生成的執(zhí)行任務(wù),包括:
將用于表征業(yè)務(wù)分析需求的語(yǔ)句通過所述hive查詢引擎對(duì)應(yīng)的hive算法進(jìn)行解析,分析生成的所述執(zhí)行任務(wù),獲取所述執(zhí)行任務(wù)中的操作數(shù)據(jù)表名字、操作的字段名和語(yǔ)句中的查詢條件。
在本發(fā)明實(shí)施例一實(shí)施方式中,根據(jù)所述執(zhí)行任務(wù)中的數(shù)據(jù)文件大小和集群可用內(nèi)存選擇hive查詢引擎或impala查詢引擎對(duì)所述執(zhí)行任務(wù)進(jìn)行分布式查詢,以生成所述執(zhí)行任務(wù)中用于表征業(yè)務(wù)分析需求的語(yǔ)句對(duì)應(yīng)的新的執(zhí)行路徑,包括:
當(dāng)數(shù)據(jù)文件大小超過集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),使用所述hive查詢引擎對(duì)應(yīng)的hive算法,結(jié)合所述操作數(shù)據(jù)表名字、操作的字段名和語(yǔ)句中的查詢條件,并按照hive算法執(zhí)行數(shù)據(jù)查詢和結(jié)果輸出,以生成所述新的執(zhí)行路徑。
當(dāng)數(shù)據(jù)文件大小未超過集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),使用impala查詢引擎對(duì)應(yīng)的impala算法,結(jié)合所述操作數(shù)據(jù)表名字、操作的字段名和語(yǔ)句中的查詢條件,并按照impala算法執(zhí)行數(shù)據(jù)查詢和結(jié)果輸出,生成所述新的執(zhí)行路徑。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述方法還包括:
將每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小與集群可用內(nèi)存大小進(jìn)行比較之前,結(jié)合每個(gè)操作數(shù)據(jù)表中的統(tǒng)計(jì)信息,獲取到每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小,如果通過hive算法進(jìn)行解析得到的解析結(jié)果中包含分區(qū)表,則在獲取操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小時(shí),只需獲取對(duì)應(yīng)的分區(qū)文件大小,而不是獲取全表文件大小。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述方法還包括:
判斷是單表查詢還是多表查詢;
當(dāng)執(zhí)行所述單表查詢時(shí),執(zhí)行所述將每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小與集群可用內(nèi)存大小進(jìn)行比較;
當(dāng)執(zhí)行所述多表查詢時(shí),將所有操作數(shù)據(jù)表大小總和與集群可用內(nèi)存大小進(jìn)行比較。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述將所有操作數(shù)據(jù)表大小總和與集群可用內(nèi)存大小進(jìn)行比較,包括:
當(dāng)所述所有操作數(shù)據(jù)表大小總和小于所述集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),如果有where過濾條件的表,則將所述有where過濾條件的表進(jìn)行數(shù)據(jù)過濾;如果沒有where過濾條件的表,則使用hive算法進(jìn)行數(shù)據(jù)查詢和結(jié)果輸出;
當(dāng)所述所有操作數(shù)據(jù)表大小總和大于等于所述集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),使用impala算法進(jìn)行數(shù)據(jù)查詢和結(jié)果輸出。
本發(fā)明實(shí)施例的分布式系統(tǒng)中海量數(shù)據(jù)的查詢裝置,所述裝置包括:解析單元和處理單元;其中,
所述解析單元,用于對(duì)收到的查詢請(qǐng)求進(jìn)行解析,以得到用于表征業(yè)務(wù)分析需求的語(yǔ)句所生成的執(zhí)行任務(wù);
所述處理單元,用于根據(jù)所述執(zhí)行任務(wù)中的數(shù)據(jù)文件大小和集群可用內(nèi)存選擇hive查詢引擎或impala查詢引擎對(duì)所述執(zhí)行任務(wù)進(jìn)行分布式查詢,以生成所述執(zhí)行任務(wù)中用于表征業(yè)務(wù)分析需求的語(yǔ)句對(duì)應(yīng)的新的執(zhí)行路徑。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述裝置還包括:所述存儲(chǔ)單元,用于將查詢請(qǐng)求需要的數(shù)據(jù)進(jìn)行分布式存儲(chǔ)。具體的,對(duì)數(shù)據(jù)進(jìn)行分布式存儲(chǔ),以便在啟動(dòng)分布式查詢后,將所述數(shù)據(jù)提供給由至少兩套分布式查詢算法(如hive算法和impala算法)所構(gòu)造的分布式查詢引擎使用。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述裝置還包括:
獲取單元,用于獲取所述執(zhí)行任務(wù)中的每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小、集群可用內(nèi)存大小。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述解析單元,還包括:
分析接口,用于將用于表征業(yè)務(wù)分析需求的語(yǔ)句通過所述hive查詢引擎對(duì)應(yīng)的hive算法進(jìn)行解析;
分析執(zhí)行任務(wù)子單元,用于分析生成的所述執(zhí)行任務(wù);
獲取表名子單元,用于獲取所述執(zhí)行任務(wù)中的操作數(shù)據(jù)表名字和操作的字段名;
獲取查詢條件子單元,用于獲取語(yǔ)句中的查詢條件。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述處理單元,進(jìn)一步用于:
當(dāng)數(shù)據(jù)文件大小超過集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),使用所述hive查詢引擎對(duì)應(yīng)的hive算法,結(jié)合所述操作數(shù)據(jù)表名字、操作的字段名和語(yǔ)句中的查詢條件,并按照hive算法執(zhí)行數(shù)據(jù)查詢和結(jié)果輸出,以生成所述新的執(zhí)行路徑;
當(dāng)數(shù)據(jù)文件大小未超過集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),使用impala查詢引擎對(duì)應(yīng)的impala算法,結(jié)合所述操作數(shù)據(jù)表名字、操作的字段名和語(yǔ)句中的查詢條件,按照預(yù)設(shè)的判斷策略執(zhí)行數(shù)據(jù)查詢和結(jié)果輸出,以生成所述新的執(zhí)行路徑。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述處理單元,進(jìn)一步用于將每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小與集群可用內(nèi)存大小進(jìn)行比較之前,結(jié)合每個(gè)操作數(shù)據(jù)表中的統(tǒng)計(jì)信息,獲取到每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小,如果通過hive算法進(jìn)行解析得到的解析結(jié)果中包含分區(qū)表,則在獲取操作數(shù)據(jù)表對(duì)應(yīng) 的數(shù)據(jù)文件大小時(shí),只需獲取對(duì)應(yīng)的分區(qū)文件大小。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述處理單元,進(jìn)一步用于:
判斷是單表查詢還是多表查詢;
當(dāng)執(zhí)行所述單表查詢時(shí),執(zhí)行所述將每個(gè)操作數(shù)據(jù)表對(duì)應(yīng)的數(shù)據(jù)文件大小與集群可用內(nèi)存大小進(jìn)行比較;
當(dāng)執(zhí)行所述多表查詢時(shí),將所有操作數(shù)據(jù)表大小總和與集群可用內(nèi)存大小進(jìn)行比較。
在本發(fā)明實(shí)施例一實(shí)施方式中,所述處理單元,進(jìn)一步用于:
當(dāng)所述所有操作數(shù)據(jù)表大小總和小于所述集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),如果有where過濾條件的表,則將所述有where過濾條件的表進(jìn)行數(shù)據(jù)過濾;如果沒有where過濾條件的表,則使用hive算法進(jìn)行數(shù)據(jù)查詢和結(jié)果輸出(具體的,這個(gè)過程也可以由hive執(zhí)行引擎來處理);
當(dāng)所述所有操作數(shù)據(jù)表大小總和大于等于所述集群可用內(nèi)存大小的預(yù)設(shè)閾值時(shí),使用impala算法進(jìn)行數(shù)據(jù)查詢和結(jié)果輸出(具體的,這個(gè)過程也可以由impala執(zhí)行引擎來處理)。
以一個(gè)現(xiàn)實(shí)應(yīng)用場(chǎng)景為例對(duì)本發(fā)明實(shí)施例闡述如下:
對(duì)于海量數(shù)據(jù)分析和查詢的應(yīng)用場(chǎng)景,有各種分析和查詢方法,如hive和impala,但是都存在各種的缺點(diǎn),針對(duì)hive對(duì)相對(duì)海量數(shù)據(jù)較小數(shù)據(jù)量集合查詢慢和impala對(duì)海量數(shù)據(jù)和復(fù)雜查詢慢的缺點(diǎn),本發(fā)明實(shí)施例針對(duì)海量數(shù)據(jù),以提高查詢性能為目標(biāo),進(jìn)一步提高了海量數(shù)據(jù)分析的能力,提升了數(shù)據(jù)分析產(chǎn)能。對(duì)原有分布式系統(tǒng)中大數(shù)據(jù)分析的方案進(jìn)行了優(yōu)化,對(duì)于該應(yīng)用場(chǎng)景,本發(fā)明實(shí)施例提供了一種基于大數(shù)據(jù)在分布式系統(tǒng)中的快速查詢方案,針對(duì)海量數(shù)據(jù),整合hive、impala兩種分布式分析查詢?yōu)樵撗b置基礎(chǔ)分析工具,在工具之上利用hive執(zhí)行計(jì)劃中的關(guān)鍵屬性(如表名、大小、條件等)結(jié)合兩種技術(shù)的計(jì)算框架優(yōu)勢(shì),重新組織業(yè)務(wù)分析需求的語(yǔ)句執(zhí)行路徑。以達(dá)到執(zhí)行效率優(yōu)化的目的。
為了更好的說明本方案在數(shù)據(jù)分析中的作用,圖2作為分布式系統(tǒng)中海量 數(shù)據(jù)的查詢的分析優(yōu)化裝置圖,提供了該裝置的功能框架,對(duì)海量數(shù)據(jù)分析優(yōu)化裝置各層具體說明如下:
數(shù)據(jù)存儲(chǔ)11:海量數(shù)據(jù)存儲(chǔ)介質(zhì),基于hadoop的hdfs文件系統(tǒng),支持text、hfile、parquet、rcfile等數(shù)據(jù)文件格式,供hive和impala進(jìn)行數(shù)據(jù)查詢和數(shù)據(jù)落地使用。
基礎(chǔ)分析工具12:本發(fā)明實(shí)施例考慮的是hive和impala,主要用于查詢數(shù)據(jù)存儲(chǔ)中的數(shù)據(jù),并返回輸出結(jié)果。其中hive基于mapreduce框架,底層調(diào)用mapreduce來實(shí)現(xiàn)數(shù)據(jù)查詢和輸出。
數(shù)據(jù)優(yōu)化裝置13:數(shù)據(jù)優(yōu)化裝置為本專利發(fā)明實(shí)施例的核心部件,它由分析接口、分析執(zhí)行計(jì)劃、獲取表名、查詢條件、表大小、集群動(dòng)態(tài)內(nèi)存與生產(chǎn)執(zhí)行路徑、hive執(zhí)行引擎、impala執(zhí)行引擎組成,裝置運(yùn)作的原理如下描述:
首先,分析接口提供jdbc的連接方式,主要用于接收應(yīng)用發(fā)起的查詢請(qǐng)求。
其次,分析接口將發(fā)起的查詢語(yǔ)句交給hive解析器進(jìn)行解析,然后分析生成的執(zhí)行計(jì)劃,獲取的其中的操作數(shù)據(jù)表名字、操作的字段名和語(yǔ)句中的where查詢條件。其中獲取where查詢條件信息中需明確查詢條件對(duì)應(yīng)的表,后期進(jìn)行轉(zhuǎn)換子查詢使用,同時(shí)在解析時(shí)必須優(yōu)先明確是否有分區(qū)字段作為查詢條件,如果存在,那么分區(qū)字段將單獨(dú)列出,而不是作為where條件。
接著,結(jié)合數(shù)據(jù)表中的統(tǒng)計(jì)信息,獲取每個(gè)操作的表對(duì)應(yīng)的數(shù)據(jù)文件大小,如果上一步的解析結(jié)果中包含分區(qū)表,那么在獲取表對(duì)應(yīng)的數(shù)據(jù)文件大小時(shí)只需獲取的對(duì)應(yīng)的分區(qū)文件大小,而不是全表文件大小。同時(shí)也需要獲取當(dāng)天整個(gè)hadoop集群的可用內(nèi)存值,作為判斷是使用hive進(jìn)行查詢還是使用impala查詢。
再次,是具體的邏輯判斷,用于生成最終的執(zhí)行路徑,以當(dāng)查詢數(shù)據(jù)量小于集群可用內(nèi)存80%時(shí),impala性能比hive性能高為依據(jù),通過對(duì)比當(dāng)前操作的數(shù)據(jù)表大小和集群可用內(nèi)存大小,選擇當(dāng)前查詢操作通過hive還是impala執(zhí)行。當(dāng)操作的數(shù)據(jù)大小超過內(nèi)存值時(shí)且存在where條件,那么還會(huì)根據(jù)前面解析出來的操作字段名和對(duì)應(yīng)where條件進(jìn)行一次查詢語(yǔ)句的細(xì)化,先將where 條件的數(shù)據(jù)進(jìn)行過濾,取出有效數(shù)據(jù)生成臨時(shí)表,再以此臨時(shí)表代替原表進(jìn)行下一輪的判斷操作,不斷遞歸,最終生成一個(gè)包含一個(gè)或者多個(gè)查詢語(yǔ)句的執(zhí)行路徑計(jì)劃。當(dāng)然,這里面過濾后生成的臨時(shí)數(shù)據(jù)表大小并不是實(shí)際執(zhí)行,而是以hive和impala生成的執(zhí)行計(jì)劃信息為依據(jù),所以對(duì)表的統(tǒng)計(jì)信息收集在這個(gè)裝置中尤為重要。
最后,根據(jù)上面生成的執(zhí)行路徑計(jì)劃,通過調(diào)用hive和impala執(zhí)行引擎,按順序一步步交由hive和impala進(jìn)行執(zhí)行,最終返回輸出結(jié)果。
圖3作為基于圖2所示的數(shù)據(jù)優(yōu)化裝置所執(zhí)行的方法流程,對(duì)基于該裝置執(zhí)行的具體邏輯判斷流程描述如下,包括:
步驟201、通過jdbc連接優(yōu)化裝置,發(fā)起查詢請(qǐng)求。
步驟202、優(yōu)化裝置接收sql語(yǔ)句。
步驟203、解析sql語(yǔ)句。
步驟204、判斷是單表查詢還是多表關(guān)聯(lián)查詢,如果是單表查詢,則轉(zhuǎn)入執(zhí)行步驟205,如果是多表查詢,則轉(zhuǎn)入執(zhí)行步驟208。
步驟205、判斷查詢表數(shù)據(jù)量是否超過集群可用內(nèi)存的80%,如果是,則執(zhí)行步驟206,否則,執(zhí)行步驟207。
步驟206、使用hive進(jìn)行數(shù)據(jù)查詢和結(jié)果輸出。
步驟207、使用impala進(jìn)行數(shù)據(jù)查詢和結(jié)果輸出,轉(zhuǎn)入執(zhí)行步驟212。
步驟208、判斷是否所有查詢表大小總和小于集群可用內(nèi)存80%,如果是,則執(zhí)行步驟209,否則,轉(zhuǎn)入執(zhí)行步驟207。
步驟209、判斷是否有where過濾條件的表,如果是,則執(zhí)行步驟210,否則,執(zhí)行步驟211。
步驟210、有where條件的表進(jìn)行數(shù)據(jù)過濾作為新的查詢表。
步驟211、使用hive進(jìn)行數(shù)據(jù)查詢和結(jié)果輸出。
步驟212、返回查詢結(jié)果。
以上流程說明了數(shù)據(jù)優(yōu)化裝置的運(yùn)作流程,以下補(bǔ)充說明該裝置優(yōu)化執(zhí)行 路徑的原理與使用的基礎(chǔ)工具,優(yōu)化執(zhí)行路徑主要依托hive的執(zhí)行計(jì)劃功能完成,hive的執(zhí)行計(jì)劃如下圖4所示,從圖4的一個(gè)語(yǔ)句執(zhí)行計(jì)劃實(shí)例中的用框線進(jìn)行標(biāo)識(shí)的部分可以看出(順序依次往下),是通過hive執(zhí)行計(jì)劃獲取到關(guān)鍵信息,包括:
1,alias:a操作處理的表名;
2,numrows:269datasize:80782basicstats該表根據(jù)統(tǒng)計(jì)信息得到的表的記錄行數(shù)和表的文件大??;
3,(msisdnlike'138%')該表是否進(jìn)行條件過濾以及過濾具體信息;
4,numrows:134datasize:40240basicstats根據(jù)該過濾條件過濾后預(yù)計(jì)的表的記錄行數(shù)和大??;
5,expressions:imsi(type:string),imei(type:string)最終輸出的表的字段。
裝置依賴以上關(guān)鍵信息組織優(yōu)化語(yǔ)句執(zhí)行路徑;接下來,為了更好的理解本發(fā)明實(shí)施例,以下結(jié)合幾個(gè)測(cè)試場(chǎng)景對(duì)裝置的運(yùn)作流程做出詳細(xì)闡述:
集群環(huán)境為:集群4臺(tái)服務(wù)器,每臺(tái)服務(wù)器10g內(nèi)存,其中空閑內(nèi)存為8g,總可用內(nèi)存為32g。表a記錄數(shù)10w條,大小10g,表b記錄數(shù)20w條,大小為20g,表c記錄數(shù)40w條,大小為40g。
應(yīng)用場(chǎng)景1:基于上述集群環(huán)境,用戶發(fā)起一個(gè)單表的查詢,語(yǔ)句為selecta.*froma;根據(jù)上述圖3所示的流程,基于數(shù)據(jù)優(yōu)化裝置所執(zhí)行的方法流程,包括:
步驟301:客戶端發(fā)起sql查詢需求;
步驟302:優(yōu)化裝置通過jdbc方式接收客戶發(fā)起的查詢需求;
步驟303:優(yōu)化裝置解析sql語(yǔ)句;
步驟304:判斷該sql語(yǔ)句操作的表數(shù)量,當(dāng)前操作表數(shù)量為1;
步驟305:判斷該表的文件大小和當(dāng)前集群可用內(nèi)存空間大小,當(dāng)前查詢的a表文件大小為10g,小于集群可用內(nèi)存的80%,即25.6g;
步驟306:生成最終執(zhí)行計(jì)劃,通過impala對(duì)數(shù)據(jù)查詢并返回最終查詢結(jié)果。
應(yīng)用場(chǎng)景2:基于上述集群環(huán)境,用戶發(fā)起2個(gè)表的關(guān)聯(lián)查詢,語(yǔ)句為selectb.*,c.*frombleftjoinconb.col1=c.col1whereb.col2like‘%test%’andc.col2like‘%test%’;
根據(jù)圖5所示的流程,基于數(shù)據(jù)優(yōu)化裝置所執(zhí)行的方法流程,包括:
步驟401:客戶端發(fā)起sql查詢需求;
步驟402:優(yōu)化裝置通過jdbc方式接收客戶發(fā)起的查詢需求;
步驟403:優(yōu)化裝置解析sql語(yǔ)句;
步驟404:判斷該sql語(yǔ)句操作的表數(shù)量,當(dāng)前操作表數(shù)量為2;
步驟405:判斷操作表總的的文件大小和當(dāng)前集群可用內(nèi)存空間大小,當(dāng)前查詢的b表加上c表的大小總和為60g,大于集群可用內(nèi)存的80%,即25.6g;
步驟406:判斷語(yǔ)句中是否有where條件,當(dāng)前sql對(duì)表b和表c都進(jìn)行過濾;
步驟407:通過統(tǒng)計(jì)分析得知當(dāng)前c表比b表大,先將c表根據(jù)where條件進(jìn)行過濾生成執(zhí)行計(jì)劃,根據(jù)執(zhí)行計(jì)劃估算新生成的表c_1的文件大小,這里c_1大小為10g,將新生成的表c_1代替表c作為操作表;
步驟408:判斷操作表總的的文件大小和當(dāng)前集群可用內(nèi)存空間大小,當(dāng)前表b和表c_1的總大小為30g,大于集群可用內(nèi)存的80%,即25.6g;
步驟409:判斷語(yǔ)句中是否有where條件,由于c表已經(jīng)用c_1表代替了,所以當(dāng)前sql只剩表b還有進(jìn)行where過濾;
步驟410:將b表根據(jù)where條件進(jìn)行過濾生成執(zhí)行計(jì)劃,根據(jù)執(zhí)行計(jì)劃估算新生成的表b_1的文件大小,這里b_1大小為10g,將新生成的表b_1代替表b作為操作表;
步驟411:判斷操作表總的的文件大小和當(dāng)前集群可用內(nèi)存空間大小,當(dāng)前表b_1和表c_1的總大小為20g,小于集群可用內(nèi)存的80%,即25.6g;
步驟412:確定最終通過impala查詢輸出結(jié)果。生成的最終執(zhí)行計(jì)劃為先將c表進(jìn)行where條件過濾,由于c表為40g,大于集群可用內(nèi)存的80%,即25.6g,故先使用hive進(jìn)行數(shù)據(jù)過濾,生成臨時(shí)表c_1,再將b表進(jìn)行where 條件過濾,由于b表為20g,小于集群可用內(nèi)存的80%,即25.6g,故先使用impala進(jìn)行數(shù)據(jù)過濾,生成臨時(shí)表b_1,最后將表b_1和表c_1通過impala進(jìn)行join查詢生成最終數(shù)據(jù)結(jié)果。
上述應(yīng)用場(chǎng)景,采用本發(fā)明實(shí)施例,主要包括1)整合hive、impala兩種分布式分析查詢功能為分析工具。hive和impala均是基于hdfs文件系統(tǒng),均支持text、hfile、parquet、rcfile等數(shù)據(jù)文件格式,為二者的無縫結(jié)合提供的存儲(chǔ)層面的支撐。2)執(zhí)行流程是本裝置的核心部分,結(jié)合了處理的數(shù)據(jù)文件大小、數(shù)據(jù)表的統(tǒng)計(jì)信息、操作系統(tǒng)內(nèi)存、集群的節(jié)點(diǎn)數(shù)、兩次執(zhí)行計(jì)劃等信息。3)實(shí)現(xiàn)分布式存儲(chǔ)和分布式查詢,將中間數(shù)據(jù)保存到分布式文件系統(tǒng)上,提升數(shù)據(jù)的二次讀寫性能。采用本發(fā)明實(shí)施例,具有的優(yōu)點(diǎn)包括:本發(fā)明實(shí)施例利用大數(shù)據(jù)分布存儲(chǔ)和hive、impala這兩種大數(shù)據(jù)分析工具,將兩者有機(jī)結(jié)合,充分發(fā)揮二者的優(yōu)勢(shì),彌補(bǔ)了hive在處理小數(shù)據(jù)和impala在處理大量數(shù)據(jù)上的性能不足。通過hive將海量數(shù)據(jù)進(jìn)行提取,在分布式文件系統(tǒng)上生成新的數(shù)據(jù)文件,再使用impala對(duì)小量數(shù)據(jù)進(jìn)行業(yè)務(wù)查詢,充分發(fā)揮hive和impala在各自領(lǐng)域內(nèi)的優(yōu)勢(shì)。
本發(fā)明實(shí)施例所述集成的模塊如果以軟件功能模塊的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),也可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中。基于這樣的理解,本發(fā)明實(shí)施例的技術(shù)方案本質(zhì)上或者說對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī)、服務(wù)器、或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的全部或部分。而前述的存儲(chǔ)介質(zhì)包括:u盤、移動(dòng)硬盤、只讀存儲(chǔ)器(rom,read-onlymemory)、隨機(jī)存取存儲(chǔ)器(ram,randomaccessmemory)、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。這樣,本發(fā)明實(shí)施例不限制于任何特定的硬件和軟件結(jié)合。
相應(yīng)的,本發(fā)明實(shí)施例還提供一種計(jì)算機(jī)存儲(chǔ)介質(zhì),其中存儲(chǔ)有計(jì)算機(jī)程序,該計(jì)算機(jī)程序用于執(zhí)行本發(fā)明實(shí)施例的一種分布式系統(tǒng)中海量數(shù)據(jù)的查詢方法。
以上所述,僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。