唐 立,李亞平,曲金帥
(1.安徽經(jīng)濟(jì)管理學(xué)院 信息工程系,安徽 合肥 230031;2.安徽經(jīng)濟(jì)管理學(xué)院 教務(wù)處,安徽 合肥 230031;3.合肥工業(yè)大學(xué) 管理學(xué)院,安徽 合肥 230009;4. 云南民族大學(xué) 云南省高校信息與通信安全災(zāi)備重點(diǎn)實(shí)驗(yàn)室,云南 昆明 650500)
隨著教育領(lǐng)域?qū)Υ髷?shù)據(jù)訴求的增強(qiáng),教學(xué)過程與結(jié)果數(shù)據(jù)的持續(xù)采集,動(dòng)態(tài)匯集成了新數(shù)據(jù)形式的教學(xué)大數(shù)據(jù).教學(xué)大數(shù)據(jù)更能精準(zhǔn)刻畫全維度的“學(xué)生畫像”,服務(wù)于師生教學(xué)和學(xué)校管理[1].而傳統(tǒng)的關(guān)系型數(shù)據(jù)庫系統(tǒng)用來儲(chǔ)存爆炸式增長(zhǎng)的教學(xué)大數(shù)據(jù)將力不從心,非關(guān)系型數(shù)據(jù)庫系統(tǒng)具有強(qiáng)大的擴(kuò)張性和高并發(fā)性,可以彌補(bǔ)關(guān)系型數(shù)據(jù)庫的不足[2].
非關(guān)系數(shù)據(jù)庫中的apache HBase是開源分布式的列式存儲(chǔ)系統(tǒng),因?yàn)樗懈邤U(kuò)展性和并發(fā)性而被廣泛使用,成為當(dāng)前的熱門存儲(chǔ)技術(shù)之一[3].目前針對(duì)HBase存儲(chǔ)和查詢的相關(guān)研究比較多,如李正武[4]利用Hadoop集群的HBase對(duì)區(qū)域化橋梁健康監(jiān)測(cè)數(shù)據(jù)進(jìn)行分布式存儲(chǔ);李攀宇[5]利用HBase分布式存儲(chǔ)交通數(shù)據(jù),運(yùn)用HBase的行鍵設(shè)計(jì)結(jié)合二級(jí)索引,解決時(shí)空維度分布不均引起的熱點(diǎn)問題;董萌萍[6]設(shè)計(jì)與實(shí)現(xiàn)了一種基于HBase的農(nóng)作物病蟲害數(shù)據(jù)存儲(chǔ)系統(tǒng),彌補(bǔ)傳統(tǒng)關(guān)系數(shù)據(jù)庫的不足.以上研究針對(duì)不同的應(yīng)用場(chǎng)景,設(shè)計(jì)出不同模式的HBase存儲(chǔ)以解決數(shù)據(jù)在存儲(chǔ)與查詢過程中面臨的效率問題.但是數(shù)據(jù)存儲(chǔ)時(shí)的負(fù)載均衡和寫熱點(diǎn)問題,索引時(shí)針對(duì)屬性過濾的效率問題都沒有得到很好的解決.
本文根據(jù)教學(xué)大數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的特點(diǎn)和常用查詢概率出發(fā),設(shè)計(jì)了基于組合行鍵的HBase系統(tǒng),進(jìn)行Region預(yù)分區(qū)和構(gòu)建cost評(píng)分函數(shù),解決寫熱點(diǎn)和負(fù)載均衡的問題.然后利用組合行鍵和Spark分布式的屬性過濾,到達(dá)快速查詢的目的.
教學(xué)大數(shù)據(jù)是指教學(xué)活動(dòng)產(chǎn)生的,根據(jù)教學(xué)需求采集到的,用來促進(jìn)教學(xué)模式創(chuàng)新以及教學(xué)質(zhì)量提升的數(shù)據(jù)集合[1].教學(xué)大數(shù)據(jù)來源比較廣泛,數(shù)據(jù)大量而分散,結(jié)構(gòu)復(fù)雜而異構(gòu).為了實(shí)現(xiàn)此類大數(shù)據(jù)的檢測(cè)統(tǒng)計(jì)、管理、預(yù)測(cè)和分析等智能應(yīng)用,就要建立一套完整的教學(xué)大數(shù)據(jù)存儲(chǔ)與索引系統(tǒng),實(shí)現(xiàn)海量教學(xué)數(shù)據(jù)的存儲(chǔ)和查詢,為智能化教學(xué)應(yīng)用提供高效的數(shù)據(jù)支撐.
本文設(shè)計(jì)基于Spark/HBase的教學(xué)大數(shù)據(jù)系統(tǒng)框架如圖1所示.框架主要分為2大塊:1)通過數(shù)據(jù)元數(shù)據(jù)或教學(xué)數(shù)據(jù)的采集,構(gòu)建HBase表.主要經(jīng)過行鍵設(shè)計(jì),行鍵表達(dá)式和算法實(shí)現(xiàn),負(fù)載均衡問題解決,然后入庫.2)根據(jù)用戶查詢請(qǐng)求,進(jìn)行語義分析,邏輯優(yōu)化,基于行鍵過濾出模糊結(jié)果集,然后基于SparkRDD分布式處理進(jìn)行屬性過濾,得到精確查詢結(jié)果.
系統(tǒng)要解決的問題:1)基于HBase的存儲(chǔ)設(shè)計(jì),如何既能滿足索引需求,又能解決均衡負(fù)載和寫熱點(diǎn)問題,達(dá)到高效存儲(chǔ)目的.2)快速索引,對(duì)于用戶提出的多特征值的復(fù)雜查詢問題,如何利用行鍵和SparkRDD快速進(jìn)行收索,滿足用戶查詢的需求.
根據(jù)HBase表的邏輯結(jié)構(gòu)特點(diǎn),將教學(xué)大數(shù)據(jù)的模型設(shè)置為由行鍵RowKey、列族ColumnFamily和時(shí)間戳TimeStamp組成,如圖2所示.根據(jù)查詢需求把行鍵設(shè)計(jì)為組合行鍵,用于對(duì)教學(xué)數(shù)據(jù)的唯一索引.列族映射存放著教學(xué)數(shù)據(jù)的其他屬性,同時(shí)也可以按需求動(dòng)態(tài)擴(kuò)展屬性列.時(shí)間戳主要是標(biāo)記數(shù)據(jù)的記錄時(shí)間,便于區(qū)分?jǐn)?shù)據(jù)的不同版本.
在HBase中構(gòu)造存儲(chǔ)數(shù)據(jù)表,行鍵的設(shè)計(jì)是最為關(guān)鍵的.行鍵就是要反映數(shù)據(jù)重要特征字段的,并且具有唯一性.為了提高數(shù)據(jù)查詢性能,利用教學(xué)數(shù)據(jù)中查詢頻率最高的若干個(gè)字段組合成行鍵,與普通列值數(shù)據(jù)冗余存放在多張HBase數(shù)據(jù)表中.
通過教學(xué)大數(shù)據(jù)的日常查詢記錄和管理日志來看,關(guān)于CourseID、StudentID、TeacherID的特征值查詢符合大多數(shù)用戶的查詢習(xí)慣,基于CourseID、StudentID、TeacherID的特征值的查詢頻率較多.同時(shí)由于CourseID在教學(xué)大數(shù)據(jù)中的占有比例相對(duì)于StudentID、TeacherID要小,如果把CourseID作為單獨(dú)的行鍵索引會(huì)增大查詢開銷.因此本文設(shè)計(jì)2張表,分別以
CourseID+ StudentID:
Row-Key:CourseID{
Column Family: StudentID{
Column:( Attribute)
}
}
CourseID+ TeacherID:
Row-Key:CourseID{
Column Family: TeacherID {
Column:( Attribute)
}
}
RowKey表達(dá)式是一般都是特征值的編碼與解碼規(guī)則.RowKey通過對(duì)字段來源的抽象和約定,按一定的規(guī)則定義好RowKey,然后執(zhí)行數(shù)據(jù)轉(zhuǎn)換時(shí)解析RowKey表達(dá)式,并從指定位置提取多個(gè)特征值[7].本文組合RowKey表達(dá)式是從HBase中的數(shù)據(jù)行鍵將字段名、字段名稱值或固定字符按一定的形式轉(zhuǎn)換運(yùn)算后生成的.組合RowKey的生成算法如下.
定義1轉(zhuǎn)義字符表達(dá)式為[ ],解碼時(shí)對(duì)括號(hào)里的內(nèi)容進(jìn)行轉(zhuǎn)義計(jì)算.
定義2字段名表達(dá)式C(index),獲取索引為index的字段名稱.
定義3字段值表達(dá)式V(name|index),按字段名稱或索引號(hào)來獲取字段值.
定義4字符串?dāng)嗳”磉_(dá)式Sub(string,start,num),從字符串string的start位置斷取num數(shù)量的字符.
定義5字符串的格式化表達(dá)式T(format),將字符串轉(zhuǎn)換為format對(duì)應(yīng)的格式.
定義6文件名表達(dá)式為F,表示獲取的數(shù)據(jù)文件名稱.
步驟1 讀取行鍵表達(dá)式字符串如“CDE”,并將字符串分解成字符集合EXP.
步驟2 初始化變量:遍歷行鍵字符集合EXP,循環(huán)變量n=0;臨時(shí)緩存字符串TMP;轉(zhuǎn)義控制符TC初始為false;字符串控制SC初始為false;返回結(jié)果字符串SR初始為空;狀態(tài)變量S初始為空.
步驟3.1 初始轉(zhuǎn)義控制符TC=false;表示處于非轉(zhuǎn)義的狀態(tài).
對(duì)于畫面上2/3區(qū)域,我們使用了去朦朧+46、飽和度-16的漸變?yōu)V鏡進(jìn)行處理。去霧工具在提高反差的同時(shí)也會(huì)增強(qiáng)畫面飽和度,所以我們使用了負(fù)向的飽和度設(shè)置平衡這個(gè)問題。遠(yuǎn)景的山脈受到的霧氣影響更加明顯,所以我們?cè)偈褂萌レF設(shè)置為+18的畫筆工具對(duì)這個(gè)部分進(jìn)行一些額外的手動(dòng)處理?,F(xiàn)在,畫面整體看上去有些偏藍(lán)。一般情況下我會(huì)重新調(diào)整白平衡設(shè)置來解決這個(gè)問題,對(duì)于這張照片來說,我覺得使用色溫7400、色調(diào)+4的參數(shù),效果恰好給綠色帶來了更豐富的變化。
步驟3.2 對(duì)字符串EXP[n]進(jìn)行判斷:‘[’表示轉(zhuǎn)義開始,并設(shè)置TC=true,否則將EXP[n]添加到SR,跳轉(zhuǎn)步驟3.6;‘]’表示轉(zhuǎn)義結(jié)束,TC= false,把TMP添加到SR,接著跳轉(zhuǎn)到步驟3.6,否則繼續(xù)進(jìn)行一下步.
步驟3.3 對(duì)字符串控制SC的判斷:當(dāng)SC= true處于字符狀態(tài),若EXP[n]為空表示字符狀態(tài)結(jié)束,與此同時(shí)設(shè)置SC= false,若EXP[n]不為空,則將EXP[n]添加到TMP中,再跳轉(zhuǎn)步驟3.6;當(dāng)SC= false,則進(jìn)一步判斷,運(yùn)行步驟3.5.
步驟3.4 判斷 EXP[n]是否為空,如果是空則表示開啟字符狀態(tài),SC設(shè)置為 true,跳轉(zhuǎn)步驟3.6;如果EXP[n]是非空,字符是文件名,則取文件名放入TMP,字符是C、T、V、Sub中的任意一個(gè),則S設(shè)置為相應(yīng)的字符,再跳轉(zhuǎn)步驟3.6.如果都不是則繼續(xù)下一步.
步驟3.5 如果EXP[n]為‘)’,是指一個(gè)帶參數(shù)的符號(hào)結(jié)束,根據(jù)S中的符號(hào)類型,C取列名,V取列值放入TMP,T按String.Tostring(format)的方法將TMP進(jìn)行格式化,Sub斷取TMP的字符串.
步驟3.6n+=1,如果n小于或等于集合中的最大行數(shù),則回到步驟3.1,否則進(jìn)行下一步.
步驟4 返回SR.
按照以上算法步驟舉例,現(xiàn)有教學(xué)大數(shù)據(jù)中一系列命名為CourseID_A_01012.DAT的課程數(shù)據(jù)文件,使它以組合RowKey的算法存入HBase數(shù)據(jù)庫中,則RowKey表達(dá)式為Sub(F,10,1)Sub(F,14,3)"S"V(StudentID).T("000").式中的F是指CourseID_A_01012.DAT文件名字符串、Sub(F,10,1)斷取文件名稱為F中的第10個(gè)字符、Sub(F,14,3)斷取文件名稱F中的第14,15,163個(gè)字符、"S"取固定字符S、V(StudentID).T("000")取StudentID列的值并轉(zhuǎn)換格式為"000",最后將這些字符順序的組合起來.教學(xué)大數(shù)據(jù)的存儲(chǔ)轉(zhuǎn)換過程如圖3所示.
整個(gè)教學(xué)大數(shù)據(jù)入庫流程如圖4所示.1)根據(jù)教學(xué)元數(shù)據(jù)文件特點(diǎn)以及查詢習(xí)慣設(shè)計(jì)組合行鍵;2)根據(jù)設(shè)計(jì)好的RowKey,歸類相應(yīng)的教學(xué)數(shù)據(jù)列族;3)提取教學(xué)大數(shù)據(jù)屬性數(shù)據(jù)的名稱和值,作為HBase列族的列限定符和列值;4)按組合行鍵的記錄,根據(jù)規(guī)則匹配入庫到指定的Region預(yù)分區(qū).
本文的RowKey設(shè)計(jì)是一種組合RowKey,因?yàn)檫@種組合RowKey的前綴本是取元數(shù)據(jù)文件名的第10個(gè)字符,如2.2節(jié)所述,該字符表示的是教學(xué)中Course的學(xué)科類別,本身不是有序的,所以這樣組合RowKey設(shè)計(jì)本身就解決了寫熱點(diǎn)問題[9].
根據(jù)教學(xué)大數(shù)據(jù)的特點(diǎn),以Course的類別來預(yù)設(shè)分區(qū)以緩解負(fù)載均衡問題.首先是按一級(jí)學(xué)科進(jìn)行分類成若干個(gè)Region Server;然后對(duì)每個(gè)Region Server再分出若干個(gè)二級(jí)或三級(jí)學(xué)科Course集的Region,由于本文設(shè)計(jì)的組合RowKey是與Course有密切關(guān)系,很容易根據(jù)RowKey將Course存放在對(duì)應(yīng)的Region中;最后把選取負(fù)載因子作為請(qǐng)求數(shù)目預(yù)測(cè)值,構(gòu)建cost評(píng)分函數(shù),以此來檢測(cè)并遷移負(fù)載,達(dá)到負(fù)載均衡的目的.其算法過程如下:
收集每分鐘每一個(gè)Region的寫入請(qǐng)求數(shù)目,得到長(zhǎng)度為n的序列R=(r1,r2…,rn),使用二階差分指數(shù)平滑法對(duì)未來寫請(qǐng)求數(shù)進(jìn)行預(yù)測(cè)[10].
(1)
(2)
(3)
最終預(yù)測(cè)結(jié)果如下:
(4)
數(shù)據(jù)熱度值θi是按秒為單位,就是對(duì)預(yù)測(cè)值除以60,如公式(5).
(5)
對(duì)HBase集群中的每個(gè)Region Server的負(fù)載總和計(jì)算如公式(6),其中m為當(dāng)前Region Server下的Region總數(shù).
(6)
平均負(fù)載的計(jì)算如公式(7),其中k是Region Server的數(shù)目.
(7)
我們?cè)O(shè)定最大負(fù)載loadmax=1.05×loadavg,最小負(fù)載為loadmin=0.95×loadavg.當(dāng)1個(gè)Region Serverj的負(fù)載滿足loadmin cost = write_cost + msize_cost +sf_cost + locality_cost. (8) 公式(8)中:write_cost為寫請(qǐng)求,msize_cost為memstore容量評(píng)分,sf_cost為StoreFile評(píng)分,locality_cost本地性評(píng)分. 個(gè)Region Server超載的情況下,需要根據(jù)公式(8)cost測(cè)評(píng)函數(shù)[11-12]遍歷計(jì)算出負(fù)載不足的Region Server中最小的Region,并執(zhí)行遷移操作,以此來實(shí)現(xiàn)負(fù)載均衡. 對(duì)于教學(xué)大數(shù)據(jù)在智慧教學(xué)和教學(xué)研究中的應(yīng)用,在進(jìn)行數(shù)據(jù)查詢時(shí),查詢語句是多樣化的,根據(jù)各種角色查詢習(xí)慣分析,常被用到的查詢條件包含CourseID、StudentID、TeacherID和其他屬性.因此對(duì)查詢語義進(jìn)行解析,提取CourseID、StudentID、TeacherID的常用信息,利用組合行鍵實(shí)現(xiàn)模糊結(jié)果集的提取.再將模糊結(jié)果集以彈性分布式數(shù)據(jù)集(resilientdistributed dataset,RDD) RDD的形式存儲(chǔ)在Spark的內(nèi)存環(huán)境中,并行完成屬性過濾,得到精確結(jié)果集,最終將結(jié)果返回給用戶. 基于Spark的教學(xué)大數(shù)據(jù)框架如圖5所示,其過程為:1)用戶根據(jù)需求提交查詢條件;2)對(duì)查詢語義進(jìn)行解析,提取與組合行鍵相關(guān)的特征條件,同時(shí)對(duì)查詢語義進(jìn)行邏輯優(yōu)化;3)運(yùn)用組合行鍵的算法從HBase表中篩選出符合特征條件的模糊結(jié)果集;4)將模糊結(jié)果集以SparkRDD形式分布存儲(chǔ)在內(nèi)存環(huán)境中[13],根據(jù)邏輯優(yōu)化后的查詢條件,對(duì)其他數(shù)據(jù)屬性進(jìn)行分布式過濾查詢;5)每個(gè)RDD并行過濾查詢,得到相應(yīng)的結(jié)果RDDr;6)排序合并所有的RDDr,把查詢結(jié)果返回給用戶. 本文是依據(jù)用戶查詢習(xí)慣,提出基于組合行鍵的查詢,根據(jù)查詢條件CourseID+ StudentID和CourseID+TeacherID兩種不同的組合行鍵,可以快速度得到模糊結(jié)果集,具體算法如下: 輸入查詢條件θ 輸出組合行健集合查詢的模糊結(jié)果集FR 利用SparkRDD對(duì)模糊結(jié)果集進(jìn)行分布式屬性filter,最終精確結(jié)果集合. 本文的實(shí)驗(yàn)數(shù)據(jù)采集于安徽經(jīng)濟(jì)管理學(xué)院教務(wù)處2008年以來所有的學(xué)生數(shù)據(jù),其中除了包含關(guān)系型元數(shù)據(jù),還有非關(guān)系型非結(jié)構(gòu)化數(shù)據(jù)如:視頻、圖像、聲音等,數(shù)據(jù)量約為110萬條.為了比對(duì)大數(shù)據(jù)量處理能力,在此數(shù)據(jù)基礎(chǔ)上,通過代碼生成技術(shù)生成約 2 000 萬條. 本實(shí)驗(yàn)所用的Spark與HBase部署在以1個(gè)Master節(jié)點(diǎn)和3個(gè)Slave節(jié)點(diǎn)的集群框架上.所有節(jié)點(diǎn)機(jī)器配有CUP i3 2.75GHZ 、內(nèi)存4G配置,使用linux操作系統(tǒng).服務(wù)平臺(tái)配置為ThinkServer RD650,處理器類型E5-2609v4,內(nèi)存 16 GB,硬盤1T.所使用的HBase版本為1.3.1,Spark為2.1.0,Hadoop為2.7.3.其中HBase的實(shí)驗(yàn)平臺(tái)中的Master和Region Servers分布如圖5所示. 原生系統(tǒng)是未設(shè)置預(yù)分區(qū),本文采用的是組合rowkey設(shè)計(jì),對(duì)表使用預(yù)分區(qū)后,采用負(fù)載均衡優(yōu)化后的系統(tǒng).進(jìn)行插入操作,進(jìn)行批量的數(shù)據(jù)寫入操作,如圖6所示. 通過圖6可以看出優(yōu)化后的HBase系統(tǒng)相對(duì)于優(yōu)化前提高了寫入性能.沒有優(yōu)化的原生態(tài)系統(tǒng),沒有預(yù)分區(qū),會(huì)不斷自我分裂造成運(yùn)算時(shí)間的消耗,同時(shí)連續(xù)性增長(zhǎng)的rowkey,會(huì)造成寫熱點(diǎn)問題不斷頻發(fā),從而耗費(fèi)大量的寫入響應(yīng)時(shí)間. 把實(shí)驗(yàn)數(shù)據(jù)按不同數(shù)量分類,在相同檢索條件下,以文獻(xiàn)[4]基于Hadoop下的檢索和本文提出的基于Spark下的檢索進(jìn)行對(duì)比實(shí)驗(yàn),如圖7所示. 可以從圖7看出,基于Spark的檢索比文獻(xiàn)[4]基于Hadoop的檢索時(shí)間要小,而且隨著數(shù)量級(jí)別越大,它們的檢索時(shí)間差距越大.這是因?yàn)镾park是基于內(nèi)存的并行計(jì)算框架,它具有彈性分布式數(shù)據(jù)集RDD和分布式運(yùn)行架構(gòu),可以精確讀取存儲(chǔ)的數(shù)據(jù),幾乎沒有磁盤訪問的時(shí)間開銷,所以基于Spark的分布式屬性過濾可以大大提高教學(xué)大數(shù)據(jù)的查詢速度. 為了滿足教學(xué)大數(shù)據(jù)的存儲(chǔ)和索引的需求,實(shí)現(xiàn)對(duì)海量教學(xué)數(shù)據(jù)進(jìn)行準(zhǔn)確高效的處理和管理.本文設(shè)計(jì)了基于Spark/HBase的教學(xué)大數(shù)據(jù)存儲(chǔ)和索引模型,它基于HBase設(shè)計(jì)組合行鍵,并根據(jù)Course的類別進(jìn)行預(yù)分區(qū)后,通過負(fù)載因子預(yù)測(cè)請(qǐng)求數(shù),構(gòu)建cost評(píng)分函數(shù),來檢測(cè)并遷移負(fù)載,達(dá)到解決寫熱點(diǎn)和負(fù)載均衡的問題.然后利用組合行鍵對(duì)查詢數(shù)據(jù)進(jìn)行模糊集篩選,通過Spark分布式的屬性過濾,實(shí)現(xiàn)高效查詢目的.實(shí)驗(yàn)證明該模型設(shè)計(jì)的有效性,通過與原生系統(tǒng)和文獻(xiàn)[4]進(jìn)行對(duì)比,本文設(shè)計(jì)的模型在存儲(chǔ)寫入和查詢響應(yīng)時(shí)間上具有明顯優(yōu)勢(shì). 在研究的實(shí)驗(yàn)過程中也發(fā)現(xiàn)了問題,研究適合大部分常規(guī)查詢用戶范疇,但是如果遇到非典型的非行鍵的列查詢,則需要對(duì)全表進(jìn)行掃描了,這樣的查詢效率并不高.后續(xù)將對(duì)此繼續(xù)展開研究.3 基于Spark教學(xué)大數(shù)據(jù)索引
3.1 基于Spark查詢框架
3.2 組合行鍵的算法
4 實(shí)驗(yàn)與分析
4.1 實(shí)驗(yàn)數(shù)據(jù)與運(yùn)行環(huán)境
4.2 寫入對(duì)比實(shí)驗(yàn)結(jié)果與分析
4.3 檢索對(duì)比實(shí)驗(yàn)和分析
5 結(jié)語
云南民族大學(xué)學(xué)報(bào)(自然科學(xué)版)2020年5期