陳永海
(北海職業(yè)學(xué)院,廣西北海,536000)
隨著中國(guó)傳統(tǒng)技術(shù)產(chǎn)業(yè)發(fā)展結(jié)構(gòu)的調(diào)整和新技術(shù)的應(yīng)用,文化進(jìn)行旅游服務(wù)產(chǎn)業(yè)突破了傳統(tǒng)的產(chǎn)業(yè)管理模式,逐漸演變?yōu)橐环N新的多向、多層次、多維度的產(chǎn)業(yè)。在數(shù)據(jù)多維分析的領(lǐng)域中,傳統(tǒng)的統(tǒng)計(jì)分析軟件,如:IBMSPSS,只針對(duì)樣本量較小、結(jié)構(gòu)簡(jiǎn)單的特定數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析,不適用于對(duì)大批量、結(jié)構(gòu)復(fù)雜的大數(shù)據(jù)進(jìn)行深層次分析。在大數(shù)據(jù)的分析處理中,Apache Hive作為數(shù)據(jù)倉(cāng)庫(kù)提供查詢計(jì)算接口;Apache Kylin在面對(duì)固化型多維分析場(chǎng)景時(shí),即分析的需求和要統(tǒng)計(jì)的指標(biāo)十分明確,其采用數(shù)據(jù)預(yù)計(jì)算技術(shù)來提高響應(yīng)速度;針對(duì)探索式多維分析場(chǎng)景時(shí),即分析需求尚不明確,分析員需要不斷嘗試分析過程,此時(shí)Spark SQL可以實(shí)時(shí)計(jì)算數(shù)據(jù),并快速響應(yīng)數(shù)據(jù)。雖然針對(duì)不同場(chǎng)景存在多種數(shù)據(jù)分析工具,但是當(dāng)前基于多場(chǎng)景文化旅游的大數(shù)據(jù)分析平臺(tái)也面臨著以下的問題:具有各自的適用場(chǎng)景,不能同時(shí)滿足多種不同查詢計(jì)算需求;同時(shí)涵蓋分布式數(shù)據(jù)分析全生命周期的應(yīng)用匱乏。
在大多數(shù)情況下,基于預(yù)計(jì)算的Apache Kylin的查詢效率要遠(yuǎn)高于Spark SQL查詢,但是Kylin遇到具體記錄的查詢和cuboid不存在的情況,它的查詢效率會(huì)遠(yuǎn)低于Spark SQL。在實(shí)際的業(yè)務(wù)場(chǎng)景中,存在以下問題:
(1)Spark SQL和Kylin都有各自適應(yīng)的場(chǎng)景和優(yōu)缺點(diǎn),單一的引擎不能同時(shí)滿足多種場(chǎng)景需求。
(2)多種查詢引擎并存,業(yè)務(wù)人員每次都需要判斷使用哪種查詢分析引擎,缺乏統(tǒng)一的路由策略進(jìn)行自動(dòng)判斷選擇。
(3)統(tǒng)一的查詢引擎需要混合多種引擎,但是它們擁有不同的執(zhí)行框架,解析過程也不完全相同。
針對(duì)以上的問題,本文設(shè)計(jì)了混合查詢引擎,實(shí)現(xiàn)自動(dòng)路由選擇最佳的查詢引擎,提高查詢的效率。
在多維分析中,用戶輸入信息會(huì)被轉(zhuǎn)化為SQL語(yǔ)句,因此用戶輸入信息中需要包含SQL語(yǔ)句抽象語(yǔ)法樹的基本單元要素,在邏輯語(yǔ)法樹中的Aggregate、Filter、GroupBy、Table與用戶輸入形成相應(yīng)的映射關(guān)系。同時(shí)在Kylin項(xiàng)目中也存在相應(yīng)的概念,Kylin中可以使用多張數(shù)據(jù)表(Table)并選定計(jì)算維度(Dimension)和統(tǒng)計(jì)度量(Metric)構(gòu)建不同的數(shù)據(jù)模型(Model),該模型只是邏輯模型,沒有進(jìn)行真正執(zhí)行。在模型的基礎(chǔ)之上,我們?cè)龠x取出部分維度和度量形成數(shù)據(jù)立方體(Cube),進(jìn)行真正的統(tǒng)計(jì)計(jì)算。Kylin元數(shù)據(jù)中的Metric、Dimension、Cube和Model與SQL語(yǔ)句抽象語(yǔ)法樹基本要素以及用戶輸入存在對(duì)應(yīng)關(guān)系,這為通過用戶輸入來統(tǒng)一判斷路由到Kylin、SparkSQL或HiveSQL提供了邏輯基礎(chǔ)。
Kylin中的數(shù)據(jù)立方體的元數(shù)據(jù)是由Metadata Manager模塊進(jìn)行管理的,存儲(chǔ)在HBase之中,本文通過該模塊獲取元數(shù)據(jù)信息與用戶輸入進(jìn)行匹配,匹配規(guī)則如下:
(1)用于計(jì)算的維度和度量全部包含于某個(gè)Kylin數(shù)據(jù)立方體的維度和度量之中,該查詢使用Kylin查詢。
(2)用于計(jì)算的維度和度量不全包含于任何一個(gè)Kylin數(shù)據(jù)立方體中,該查詢使用SparkSQL執(zhí)行具體的查詢計(jì)劃。
(3)如果進(jìn)行的是明細(xì)查詢,根據(jù)數(shù)據(jù)存儲(chǔ)位置不同可能會(huì)使用SparkSQL或HiveSQL去執(zhí)行查詢計(jì)劃。
(4)Kylin查詢失敗,重新選擇到SparkSQL進(jìn)行查詢。
多維查詢是用戶通過界面創(chuàng)建的,系統(tǒng)只能獲得用戶選擇的維度和度量等計(jì)算信息,所以系統(tǒng)需要提供自動(dòng)生成SQL的功能。由于本系統(tǒng)會(huì)路由選擇多個(gè)查詢引擎去執(zhí)行SQL語(yǔ)句,不同引擎的對(duì)SQL語(yǔ)句語(yǔ)法、詞法解析驗(yàn)證的細(xì)節(jié)不盡相同,因此我們?cè)O(shè)計(jì)實(shí)現(xiàn)一個(gè)統(tǒng)一的SQL生成策略生成不同的SQL以適配不同的執(zhí)行引擎。在基于文旅數(shù)據(jù)多維分析系統(tǒng)中,我們選取了SELECT語(yǔ)句來進(jìn)行查詢計(jì)算,由于Spark SQL(Hive SQL)和Kylin SQL語(yǔ)法樹結(jié)構(gòu)相同,因此按照常用的查詢需求和SQL語(yǔ)句語(yǔ)法樹結(jié)構(gòu)我們將SELECT語(yǔ)句劃分成八個(gè)子句模塊。每個(gè)子句模塊可以根據(jù)用戶輸入和查詢100引擎類型生成相應(yīng)的SQL語(yǔ)句片段,最后統(tǒng)一生成適配執(zhí)行引擎計(jì)算的SQL語(yǔ)句。
本文基于Kylin、Spark、Hive等開源大數(shù)據(jù)組件,研究并實(shí)現(xiàn)一種開源的基于多場(chǎng)景文化旅游的大數(shù)據(jù)多維分析系統(tǒng),按照功能將系統(tǒng)劃分為五個(gè)子模塊,包括數(shù)據(jù)預(yù)處理子模塊、Kylin建模子模塊、圖表構(gòu)建子模塊、圖表管理子模塊、駕駛艙管理子模塊。系統(tǒng)模塊圖如圖1所示。
圖1 大數(shù)據(jù)環(huán)境下的文旅多維數(shù)據(jù)分析系統(tǒng)模塊圖
由于數(shù)據(jù)來源比較廣泛,對(duì)于原始數(shù)據(jù)來說,還不能完全達(dá)到分析的要求,存在數(shù)據(jù)缺失,重復(fù),錯(cuò)誤等問題,在本模塊中提供豐富的數(shù)據(jù)清洗算子、數(shù)據(jù)集成算子以及統(tǒng)計(jì)分析算子完成數(shù)據(jù)處理的工作。
(1)數(shù)據(jù)清洗主要涉及到的操作包括去除重復(fù)值,忽略字段,填充空值,條件篩選,數(shù)據(jù)分段,記錄排序,類型轉(zhuǎn)換,新增序號(hào)列,字符替換,數(shù)值運(yùn)算等;
(2)數(shù)據(jù)集成合并多源多表數(shù)據(jù),包含的主要操作有多表關(guān)聯(lián),數(shù)據(jù)追加;
(3)統(tǒng)計(jì)分析,即初步統(tǒng)計(jì)數(shù)據(jù)特征,宏觀發(fā)現(xiàn)數(shù)據(jù)問題,如最大最小值計(jì)算,以便發(fā)現(xiàn)數(shù)據(jù)取值范圍,除此之外,該部分的原子操作還包括均值、方差、頻率統(tǒng)計(jì)、正態(tài)檢驗(yàn)、相關(guān)系數(shù)矩陣等。
本系統(tǒng)集成了Kylin建模模塊,可以通過添加配置完成Kylin集群建模頁(yè)面的集成。在本模塊中可以新建多個(gè)項(xiàng)目,每個(gè)項(xiàng)目可以建立多個(gè)Model,每個(gè)Model都是對(duì)事實(shí)表和多張維度表構(gòu)建起來的多維統(tǒng)計(jì)邏輯模型。在Model之上根據(jù)經(jīng)常組合使用的維度和度量構(gòu)建出數(shù)據(jù)立方體(Cube),進(jìn)行執(zhí)行計(jì)算。Cube的計(jì)算邏輯過程如下:
(1)根據(jù)Cube定義的事實(shí)表以及維度表,利用Hive創(chuàng)建一張寬表;
(2)抽取事實(shí)表上維度的distinct值,將事實(shí)表上的維度以字典樹方式壓縮編碼成目錄,將維度表以字典樹的方式編碼;
(3)利用125MapReduce從第一步得到的寬表文件作為輸入,創(chuàng)建N-Dimension cuboid,然后每次根據(jù)前一步的結(jié)果串行生成N-1cuboid,N-2cuboid…0-cuboid;
(4)根據(jù)生成的Cuboid數(shù)據(jù)量計(jì)算HTable的Region分割策略,創(chuàng)建HTable,將HFile導(dǎo)入進(jìn)來。
根據(jù)本模塊集成的Kylin配置頁(yè)面進(jìn)行數(shù)據(jù)建模,首先在創(chuàng)建和生成數(shù)據(jù)Cube之前,需要從Hive中導(dǎo)入表結(jié)構(gòu),其次選擇事實(shí)表、維度表以及其中的維度和度量創(chuàng)建數(shù)據(jù)模型,最后在模型基礎(chǔ)之上選擇執(zhí)行計(jì)算的維度和度量并設(shè)置優(yōu)化等,等待Cube計(jì)算結(jié)果,完成Cube創(chuàng)建。在優(yōu)化設(shè)置中可以設(shè)置強(qiáng)制維度(Mandatory dimension)和衍生維度(Derived dimension)來加速Cube的構(gòu)建流程。
本模塊主要完成多維分析圖表的構(gòu)建,用戶通過拖拽維度和度量進(jìn)行多維分析,是整個(gè)基于多場(chǎng)景文化旅游大數(shù)據(jù)多維分析系統(tǒng)的核心部分。構(gòu)建圖表構(gòu)建子模塊包含計(jì)算引擎路由、統(tǒng)一SQL生成、計(jì)算引擎執(zhí)行器以及圖表生成五個(gè)部分:
(1)計(jì)算引擎路由是根據(jù)用戶選擇的數(shù)據(jù)表、數(shù)據(jù)維度和數(shù)據(jù)度量來選擇最為合適的底層計(jì)算引擎。
(2)統(tǒng)一SQL生成是為了適配不同的執(zhí)行引擎設(shè)計(jì),并實(shí)現(xiàn)一個(gè)統(tǒng)一的SQL生成策略,使得根據(jù)計(jì)算引擎路由模塊的結(jié)果生成不同的SQL以便執(zhí)行。
(3)計(jì)算引擎執(zhí)行器主要是提供統(tǒng)一的計(jì)算引擎查詢?nèi)肟?。在本文基于多?chǎng)景文化旅游的分析中,涉及到的執(zhí)行引擎有Spark、Kylin以及Hive,在本模塊中向上下模塊屏蔽了執(zhí)行引擎的差別,提供一個(gè)統(tǒng)一的SQL執(zhí)行與任務(wù)提交的接口,同時(shí)不同的計(jì)算引擎的執(zhí)行結(jié)果會(huì)用相同的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)(List)返回,以便下游模塊使用。
(4)圖表生成,主要提供將數(shù)據(jù)轉(zhuǎn)化成圖表的功能。根據(jù)多維分析的維度和度量,轉(zhuǎn)化成適合前端展示的一維類圖表、二維類圖表或者多維類圖表。
構(gòu)建圖表管理子模塊主要實(shí)現(xiàn)對(duì)用戶構(gòu)建出來的圖表進(jìn)行維護(hù)管理,主要包含了圖表修改以 及圖表刪除,圖表修改包括了圖表配置更新以及圖表切換。圖表配置更新包括圖表樣式修改,圖表聯(lián)動(dòng)設(shè)置,圖表實(shí)時(shí)設(shè)置等;由于本系統(tǒng)支持的圖表類型比較多,因此舍棄效率為N:N的一對(duì)一轉(zhuǎn)換方案,而是根據(jù)舊圖表內(nèi)容及其類型提取其中的數(shù) 據(jù)統(tǒng)一格式的中間數(shù)據(jù),然后按照新圖表類型生成新圖表數(shù)據(jù),借助統(tǒng)一格式的中間數(shù)據(jù)實(shí)現(xiàn)N:1:N復(fù)雜度圖表轉(zhuǎn)換。
構(gòu)建駕駛艙管理子模塊由多張圖表構(gòu)成,通過自定義的拖拽方式可以自由組合圖表,包括指標(biāo)卡,多維表格,地圖,標(biāo)準(zhǔn)圖表等多種樣式,不同圖表組合成的駕駛艙,有著近乎無數(shù)種排列組合,具有整體主題意義的駕駛艙可以令用戶從各個(gè)角度觀察數(shù)據(jù)的表現(xiàn)。主要包括了駕駛艙的新建、修改、刪除、以及實(shí)時(shí)駕駛艙和多圖聯(lián)動(dòng)等功能。實(shí)時(shí)駕駛艙主要是實(shí)現(xiàn)當(dāng)數(shù)據(jù)更新變化時(shí),自動(dòng)計(jì)算新的圖表數(shù)據(jù)并更新駕駛艙。本文中主要使用WebSocket完成前后端實(shí)時(shí)內(nèi)容推送,根據(jù)WebSocket鏈接本模塊維護(hù)了一個(gè)實(shí)時(shí)駕駛艙列表,通過數(shù)據(jù)源監(jiān)控模塊監(jiān)控?cái)?shù)據(jù)源的改變,當(dāng)數(shù)據(jù)發(fā)生變化時(shí),由駕駛艙對(duì)應(yīng)的更新頻率配置觸發(fā)實(shí)時(shí)圖表的重新計(jì)算,其中涉及到的計(jì)算引擎執(zhí)行器模塊和圖表生成模塊已在上文圖表構(gòu)建子模塊中設(shè)計(jì)實(shí)現(xiàn),計(jì)算完成后更新圖表,并通知駕駛艙頁(yè)面有數(shù)據(jù)更新成功,重新調(diào)用駕駛艙查詢接口,按照最新圖表重組駕駛艙呈現(xiàn)給用戶。
多圖聯(lián)動(dòng)主要是實(shí)現(xiàn)當(dāng)點(diǎn)擊一個(gè)圖表中某個(gè)數(shù)值時(shí),其它聯(lián)動(dòng)的圖表在該維度特定值的限定下重新計(jì)算圖表。由于本系統(tǒng)按照模塊化設(shè)計(jì)的準(zhǔn)則,多圖聯(lián)動(dòng)主要復(fù)用圖表構(gòu)建子模塊功能,按照新的限定條件重啟構(gòu)建流程,構(gòu)建出來的新的圖表作為該駕駛艙的唯一副本,因此并不對(duì)其它駕駛艙和圖表展示產(chǎn)生任何影響。
本文提出了一種可以自動(dòng)適配Kylin、Spark、Hive多種查詢引擎的方案,支持通過用戶在界面上選擇的分析維度與度量,自動(dòng)路由到最優(yōu)執(zhí)行引擎去查詢。同時(shí)實(shí)現(xiàn)了基于多場(chǎng)景文化旅游的大數(shù)據(jù)多維分析系統(tǒng),提供全生命周期的一站式數(shù)據(jù)服務(wù),數(shù)據(jù)從數(shù)據(jù)接入經(jīng)歷數(shù)據(jù)清洗、數(shù)據(jù)建模、數(shù)據(jù)分析到可視化呈現(xiàn),閉環(huán)涵蓋數(shù)據(jù)業(yè)務(wù)全流程。對(duì)大數(shù)據(jù)分析的普及與應(yīng)用具有非常重要的現(xiàn)實(shí)意義。