魏笑笑,王小正,王圣滔,謝田田
(南京曉莊學(xué)院 信息工程學(xué)院,江蘇 南京 211171)
基于Spark的校園信息分析系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
魏笑笑,王小正*,王圣滔,謝田田
(南京曉莊學(xué)院 信息工程學(xué)院,江蘇 南京 211171)
為了更好的挖掘“校園一卡通”系統(tǒng)的數(shù)據(jù)信息,設(shè)計(jì)了一個(gè)基于Spark的校園信息分析系統(tǒng)。該系統(tǒng)的前端開發(fā)使用了 Django框架,數(shù)據(jù)處理則使用了 Spark分布式框架,分析的結(jié)果以圖表的方式直觀地反饋給用戶,從而實(shí)現(xiàn)了數(shù)據(jù)的預(yù)處理、數(shù)據(jù)分析、數(shù)據(jù)呈現(xiàn)等功能。
數(shù)據(jù)挖掘;Spark;Django;數(shù)據(jù)可視化
“校園一卡通”系統(tǒng)作為數(shù)字化校園建設(shè)的重要組成部分,已經(jīng)在各大高校普及。目前,雖然“校園一卡通”系統(tǒng)已經(jīng)在高校被廣泛使用,但是這些存儲(chǔ)的數(shù)據(jù)并沒有引起廣大管理人員的重視,大部分使用者只是關(guān)注了系統(tǒng)所實(shí)現(xiàn)的功能,而對(duì)管理所產(chǎn)生的附帶數(shù)據(jù)沒有足夠的重視,也沒有分析這些數(shù)據(jù)信息中所隱含的信息。廣大高校內(nèi)部所用的學(xué)生管理系統(tǒng)大部分是沒有學(xué)生校園活動(dòng)數(shù)據(jù)分析功能,而且迄今為止國(guó)內(nèi)對(duì)學(xué)生校園活動(dòng)分析方面沒有比較成熟的方案。我們利用數(shù)據(jù)挖掘技術(shù)對(duì)“校園一卡通”系統(tǒng)使用過程中產(chǎn)生的校園大數(shù)據(jù)進(jìn)行數(shù)據(jù)挖掘處理,利用如聚類分析等算法分析得出數(shù)據(jù)深層信息,從而為學(xué)校管理提供了更便捷完善的數(shù)字化服務(wù)。
現(xiàn)在智能手機(jī)已經(jīng)成為人們的生活中必不可少的工具,隨時(shí)隨地使用瀏覽器也成為了可能。因此,我們使用web開發(fā)技術(shù),借助matpiltlib和plotly工具實(shí)現(xiàn)數(shù)據(jù)的可視化,最核心的數(shù)據(jù)分析模塊使用了Scala語言進(jìn)行開發(fā),并且是基于Spark分布式集群技術(shù)。該系統(tǒng)實(shí)現(xiàn)了以下功能:
(1)用戶管理功能。系統(tǒng)提供了用戶登陸、注冊(cè)與注銷的功能,以實(shí)現(xiàn)對(duì)用戶數(shù)據(jù)即學(xué)生隱私的保護(hù)。未登陸用戶只能查看網(wǎng)站首頁(yè),無法查看具體信息。對(duì)登陸用戶,系統(tǒng)則可以展示數(shù)據(jù)分析結(jié)果,并提供其他操作功能。
(2)文件上傳功能。用戶提供需要分析的數(shù)據(jù)文件,以Excel或csv等格式上傳,文件中必須包含系統(tǒng)要求的字段。
(3)數(shù)據(jù)預(yù)處理功能。該功能包括數(shù)據(jù)清洗、集成、變換、選擇、規(guī)約等操作步驟。系統(tǒng)對(duì)用戶提供的包含所要求字段的文件中的冗余數(shù)據(jù)進(jìn)行過濾處理,從而形成新的數(shù)據(jù)集合。
(4)數(shù)據(jù)分析功能。將處理過的數(shù)據(jù)導(dǎo)入到Spark集群中,然后進(jìn)行相關(guān)性分析和聚類分析。
(5)數(shù)據(jù)呈現(xiàn)功能。將分析出來的結(jié)果經(jīng)過圖表的方式呈現(xiàn)出來,從而給用戶直觀感受。
系統(tǒng)分為三個(gè)模塊:數(shù)據(jù)處理模塊(核心)、數(shù)據(jù)可視化模塊和web呈現(xiàn)模塊。Web呈現(xiàn)模塊是和用戶直接交互的,用戶可以通過web頁(yè)面進(jìn)行一系列的操作。
2.1 數(shù)據(jù)處理
數(shù)據(jù)處理模塊主要實(shí)現(xiàn)對(duì)數(shù)據(jù)的預(yù)處理、數(shù)據(jù)分析和分析結(jié)果整合等功能,這一部分采用 spark集群進(jìn)行數(shù)據(jù)處理。因?yàn)閟park是基于內(nèi)存處理的,其最大的優(yōu)勢(shì)是處理大容量數(shù)據(jù)速度快。將接收的數(shù)據(jù)存儲(chǔ)到分布式文件系統(tǒng)(HDFS)上,通過spark-submit提交應(yīng)用程序,spark會(huì)創(chuàng)建和構(gòu)造一個(gè) Driver進(jìn)程,初始化 SparkContext,spark中的master和worker節(jié)點(diǎn)會(huì)分別進(jìn)行資源和任務(wù)調(diào)度并執(zhí)行定義好的算子和函數(shù),直到所有操作執(zhí)行完為止。最后將處理好的數(shù)據(jù)存儲(chǔ)于HDFS上,整個(gè)流程如圖1所示。
2.2 數(shù)據(jù)可視化
可視化模塊主要完成對(duì)于前期挖掘后得出的結(jié)論型數(shù)據(jù)給予標(biāo)準(zhǔn)化、直觀化、具體化和美觀化的呈現(xiàn),同時(shí)對(duì)于部分仍然數(shù)據(jù)量龐大的中間數(shù)據(jù)作出視覺化的二次分析。其主要基本處理流程如圖 2所示。
用戶對(duì)于數(shù)據(jù)分析結(jié)果的發(fā)出請(qǐng)求后,根據(jù)請(qǐng)求在核心分析框架分析得到的初步結(jié)果型數(shù)據(jù)庫(kù)或文件系統(tǒng)中找到對(duì)應(yīng)的數(shù)據(jù)或數(shù)據(jù)文件,并且自動(dòng)調(diào)用符合各模塊協(xié)議的可視化處理程序。由于本系統(tǒng)使用python語言開發(fā)的matplotlib庫(kù)和plotly庫(kù)分別來進(jìn)行窗口端和web端的可視化處理,所以本系統(tǒng)使用同樣基于python語言的 Django框架作為web開發(fā)框架,并將可視化模塊程序按照前期協(xié)議封裝成繪制圖像模塊,使調(diào)用的過程實(shí)現(xiàn)了無縫集成。封裝的可視化處理程序得到數(shù)據(jù)后,對(duì)數(shù)據(jù)形式或數(shù)據(jù)文件形式作出判斷并轉(zhuǎn)化為可繪制數(shù)據(jù),請(qǐng)求處理程序甚至可以通過參數(shù)設(shè)定控制來呈現(xiàn)形式。用戶最終不僅可以得到靜態(tài)化的圖片文件,還能夠得到動(dòng)態(tài)實(shí)時(shí)可操作的多維數(shù)據(jù)繪制圖像,從而便于用戶進(jìn)行詳細(xì)觀察分析。
2.3 web呈現(xiàn)
Web呈現(xiàn)模塊負(fù)責(zé)與用戶的交互。用戶首先需要通過注冊(cè)和登錄才能使用系統(tǒng)的主要功能,否則僅僅只能瀏覽一些介紹信息。登錄后的用戶可以進(jìn)行文件上傳,并且能夠查看數(shù)據(jù)分析結(jié)果。
2.4 系統(tǒng)特點(diǎn)
(1)采用web為呈現(xiàn)環(huán)境,使得用戶能夠隨時(shí)查看結(jié)果。
(2)采用 spark集群架構(gòu)分析數(shù)據(jù),可以直接將工作結(jié)果存儲(chǔ)于內(nèi)存中,從而省去了磁盤的 I/O操作,使得系統(tǒng)運(yùn)行效率更高。
圖1 流程概要圖Fig.1 Process summary diagram
圖2 可視化基本處理流程圖Fig.2 Visual processing flow chart
(3)利用數(shù)據(jù)可視化工具matplotlib庫(kù)和plotly庫(kù),將大規(guī)模的數(shù)據(jù)以圖表的形式展現(xiàn)出來,方便用戶很直觀的查看分析結(jié)果。
(4)具有數(shù)據(jù)上傳的功能。用戶可以上傳符合要求的文件以便實(shí)現(xiàn)對(duì)數(shù)據(jù)的處理等操作。
(5)數(shù)據(jù)存儲(chǔ)與處理均在云平臺(tái)中進(jìn)行,便于系統(tǒng)管理員在后臺(tái)進(jìn)行數(shù)據(jù)管理。
2.5 系統(tǒng)總體架構(gòu)
系統(tǒng)架構(gòu)主要包括前端 web,用于用戶交互和效果呈現(xiàn),分布式數(shù)據(jù)分析平臺(tái),主要基于 spark分布式框架搭建,系統(tǒng)總體架構(gòu)如圖3所示。
2.6 分布式數(shù)據(jù)分析中關(guān)鍵技術(shù)實(shí)現(xiàn)
圖3 系統(tǒng)總體架構(gòu)圖Fig.3 System overall architecture diagram
數(shù)據(jù)分析中的其中一個(gè)需求是根據(jù)學(xué)生消費(fèi)記錄的時(shí)間相關(guān)性找出學(xué)生之間的親密度。這個(gè)需求需要統(tǒng)計(jì)每天一定時(shí)間間隔內(nèi)任意兩個(gè)學(xué)生消費(fèi)次數(shù),最后匯總出一年來任意兩個(gè)學(xué)生在一定時(shí)間間隔內(nèi)同時(shí)消費(fèi)的次數(shù)。因?yàn)楸拘枨笊婕暗挠?jì)算量是巨大的,所有利用開源HDFS存儲(chǔ)數(shù)據(jù),利用分布式計(jì)算框架spark進(jìn)行數(shù)據(jù)分析。Apache Spark是專為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的快速通用的計(jì)算引擎[1]。Spark是UC Berkeley AMP lab(加州大學(xué)伯克利分校的AMP實(shí)驗(yàn)室)所開源的類Hadoop MapReduce的通用并行框架,Spark擁有Hadoop MapReduce所具有的優(yōu)點(diǎn)。但不同于MapReduce的是Job中間輸出結(jié)果可以保存在內(nèi)存中,從而不再需要讀寫HDFS,因此Spark能更好地適用于數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)等需要迭代的MapReduce的算法[2,3]。
在使用 spark進(jìn)行數(shù)據(jù)分析主要是充分利用它的分布式計(jì)算特點(diǎn),但若沒有分布式編程的思想,即使使用了scala語言進(jìn)行編程,也會(huì)出現(xiàn)分布式環(huán)境下的單機(jī)程序[4],從而沒有真正體現(xiàn)并行運(yùn)算的優(yōu)勢(shì)。例如下面這段代碼也能達(dá)到學(xué)生數(shù)據(jù)分析的結(jié)果,但因?yàn)闆]有利用到spark的分布式計(jì)算優(yōu)勢(shì),最終出現(xiàn)內(nèi)存溢出或時(shí)間超長(zhǎng)的結(jié)果。具體代碼如下:
def find (aBuffer:ArrayBuffer[FF1]): Any={
if (aBuffer!=null && !aBuffer.isEmpty){
aBuffer.map{
x =>{
var flag = true
if (x.TIME - aBuffer(0).TIME<5&& 0 resultArray += FF2(aBuffer(0).ID1, x.ID1) else flag = false } } aBuffer-=aBuffer(0) find(aBuffer) } }這段代碼通過構(gòu)建一個(gè)數(shù)組,比較數(shù)組的第一個(gè)元素和數(shù)組中其他所有元素的消費(fèi)時(shí)間間隔是否小于設(shè)定的時(shí)間間隔,然后把第一個(gè)元素移除,接著再進(jìn)行比較,不斷循環(huán),這種設(shè)計(jì)思路就是典型的單機(jī)程序的設(shè)計(jì)思路。再如下面這段代碼 d ata4.map(x=>( (x._1._1,x._2._1), //生成用戶身份 id鍵值對(duì) { /* 若兩次消費(fèi)時(shí)間小于設(shè)定間隔,則相關(guān)性計(jì)數(shù)+1*/ var date1=x._1._2.split(";") var date2=x._2._2.split(";") var n=0 for(i<-date1){ for(j<-date2){ if((i.toInt-j.toInt).abs <= args(2).toInt)//args1-設(shè)定關(guān)聯(lián)消費(fèi)的時(shí)間間隔 n=n+1 } } n } )) 這段代碼雖然好像使用了 scala特定的數(shù)據(jù)對(duì)象RDD,但在進(jìn)行map操作時(shí),還是通過循環(huán)比較字符串,效率也是十分低下的。 通過多種計(jì)算方案的比較,最后選擇的方案是第一步對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,生成“key(消費(fèi)日期-消費(fèi)區(qū)域代碼),value(消費(fèi)時(shí)間,賬戶代碼)”鍵值對(duì),再進(jìn)行笛卡爾積操作生成新的鍵值對(duì),接著通過對(duì)鍵值對(duì)進(jìn)行時(shí)間比較并統(tǒng)計(jì)匯總,從而得到任意一年來兩個(gè)學(xué)生之間在一定時(shí)間內(nèi)同時(shí)消費(fèi)的次數(shù),最終通過聚類分析出這些學(xué)生之間的親密度。本系統(tǒng)中使用的數(shù)據(jù)集是所有在校生一年的消費(fèi)記錄共1800萬條,通過6臺(tái)服務(wù)器搭建的集群進(jìn)行計(jì)算。其中每臺(tái)服務(wù)器內(nèi)存32G,時(shí)間間隔選擇5分鐘和10分鐘兩種情況,每次計(jì)算耗時(shí)25分鐘左右。數(shù)據(jù)處理關(guān)鍵代碼如下: val dfConsume = sc.textFile("hdfs://master:9000/input/ttnsmflwing-200000.txt").map(_.split(",")) .map(p => Consume(p(0), p(1), p(2), p(3),p(4), p(5), p(6), p(7), p(8), p(9), p(10), p(12), p(13))).toDF() //只查詢方山南食堂(01),北食堂(03)和方山服務(wù)區(qū)(05)的消費(fèi)記錄(數(shù)據(jù)格式:賬戶代碼消費(fèi)區(qū)域代碼消費(fèi)時(shí)間) val df1=dfConsume.select ("FLW_ACCID", "FLW_AREID", "FLW_CONTIME") where ("FLW_AREID= '01' OR FLW_AREID='03' OR FLW_AREID= '05'") //生成鍵值對(duì),其中 key(消費(fèi)日期-消費(fèi)區(qū)域代碼),value(消費(fèi)時(shí)間,賬戶代碼) val myrdd = df1.rdd.map(p =>(p(2). toString.split(" ")(0)+"-"+p(1).toString ,((sdf.parse(p(2).toString).getTime/60000).t oInt,p(0)))) //根據(jù)消費(fèi)日期,消費(fèi)區(qū)域和消費(fèi)時(shí)間依次排序 val myrdd1=myrdd.sortBy(f=>(f._1,f._2._1)) val rdd2=myrdd1.join(myrdd1).filter(f=>f._2._1._2 !=f._2._2._2) .filter(f=>f._2._1._2.toString.toInt < f._2._2._2.toString.toInt) .filter(f=>(f._2._1._1-f._2._2._1<=5))var rdd3=rdd2.map(x=>(x._2._1._2+"-"+x._2._2._2,1)) var rdd4=rdd3.sortByKey() var rdd5=rdd4.reduceByKey(_+_) spark運(yùn)行過程中RDD數(shù)據(jù)集生成過程如圖4所示。 Spark集群中計(jì)算節(jié)點(diǎn)作業(yè)過程中的輸入輸出容量及各個(gè)階段的時(shí)間如圖5所示。 1. 通過對(duì)“校園一卡通”的消費(fèi)記錄進(jìn)行分析,可以作為貧困生認(rèn)定的輔助。通過分析每位同學(xué)每個(gè)月消費(fèi)的次數(shù)和消費(fèi)的金額。接著對(duì)結(jié)果進(jìn)行聚類,從而劃分出貧困、正常和富裕的界限,分析結(jié)果如圖6所示。 通過聚類算法分析可以得到:消費(fèi)水平每月低于500元且消費(fèi)次數(shù)大于90次的人數(shù)較少,消費(fèi)次數(shù)多,消費(fèi)金額少,可以將這部分學(xué)生定為貧困生。而次數(shù)大于20次,金額高于500元的人數(shù)較少,消費(fèi)金額較高,可以定為富裕學(xué)生。 2. 通過選取 10分鐘為計(jì)算時(shí)間間隔,得到任意兩個(gè)學(xué)生一年內(nèi)同時(shí)消費(fèi)的次數(shù),然后對(duì)每個(gè)學(xué)生與其他學(xué)生同時(shí)消費(fèi)次數(shù)進(jìn)行匯總,結(jié)果分布如圖7所示。 目前,我們只對(duì)單一來源的數(shù)據(jù)進(jìn)行了客觀分析,因此對(duì)不同數(shù)據(jù)之間的聯(lián)系與區(qū)別缺乏比較。校園卡消費(fèi)信息與其他數(shù)據(jù)之間的聯(lián)系仍舊需要被繼續(xù)挖掘,比如,消費(fèi)高低與學(xué)習(xí)水平的聯(lián)系,消費(fèi)水平與學(xué)校補(bǔ)助情況是否吻合,個(gè)人消費(fèi)水平與交際情況的聯(lián)系等等。由校園卡消費(fèi)信息所提供的數(shù)據(jù)與其他數(shù)據(jù)如學(xué)生學(xué)習(xí)水平,圖書館停留時(shí)間,宿舍門禁時(shí)間等聯(lián)系起來,應(yīng)該能夠得出更多更有用的結(jié)論,從而幫助學(xué)校在決策與政策實(shí)施方面提供一定的參考作用。 當(dāng)今時(shí)代,大規(guī)模數(shù)據(jù)的分析結(jié)果(如大規(guī)模調(diào)研結(jié)果)在決策方面起了舉足輕重的作用。本系統(tǒng)旨在通過對(duì)校園存儲(chǔ)的龐大數(shù)據(jù)進(jìn)行更深層次的發(fā)掘,從而對(duì)數(shù)據(jù)這種長(zhǎng)期被忽視的資源進(jìn)行再次利用。目前,高校的數(shù)據(jù)處理已經(jīng)是一種趨勢(shì),以本校一年校園卡消費(fèi)數(shù)據(jù)進(jìn)行分析,便可以獲得很多有效的信息。相信在不久的將來,當(dāng)數(shù)字化校園全面普及,各種信息得到記錄時(shí),本系統(tǒng)將會(huì)擁有更多的數(shù)據(jù),從而能夠得出更有效的結(jié)論。 圖4 RDD數(shù)據(jù)集轉(zhuǎn)換流程圖Fig.4 RDD data set transformation flow diagram 圖5 作業(yè)過程狀態(tài)圖Fig.5 The job process status graph 圖6 學(xué)生平均月消費(fèi)次數(shù)和消費(fèi)金額散點(diǎn)圖Fig.6 Students' average monthly consumption times and consumption figure scatter plot 圖7 學(xué)生關(guān)系權(quán)值圖Fig.7 Students relationship weight value chart [1] https://cwiki.apache.org/confluence/display/SPARK/Powerd+By+Spark. [2] http://spark.apache.org/mllib/ [3] http://spark-summit.org/ [4] Discretized Streams: Fault-Tolerant Streaming Coumputation at Scale. matei Zaharia, Tathagata Das, Haoyuan Li, Timothy hunter, Scott Shenker, Ion Stoica. SOSP 2013 November 2013. [5] (美) K antardzic M. 數(shù)據(jù)挖掘——概念、模型、方法和算法[M]. 閃四清, 等, 譯. 北京: 清華大學(xué)出版社,2003. [6] 安淑芝, 等. 數(shù)據(jù)倉(cāng)庫(kù)與數(shù)據(jù)挖掘[M]. 北京: 清華大學(xué)出版社, 2005年. [7] 張麗麗. 數(shù)據(jù)挖掘技術(shù)的應(yīng)用分析[J]. 山西經(jīng)濟(jì)管理干部學(xué)院學(xué)報(bào), 2003, 11(4): 75-76. [8] 毛建旭, 毛建頻, 姚曉玲, 等. 基于等價(jià)類的大型數(shù)據(jù)庫(kù)頻繁項(xiàng)集挖掘算法[J]. 新型工業(yè)化, 2011, 1(4): 35-44. [9] 霍紅衛(wèi), 林帥, 于強(qiáng), 等. 基于MapReduce的模體發(fā)現(xiàn)算法[J]. 新型工業(yè)化, 2012, 2(9): 18-30. [10] 陳建軍, 錢慎一, 盧中寧. 校園一卡通系統(tǒng)的數(shù)據(jù)分析與系統(tǒng)規(guī)劃[J]. 工業(yè)控制計(jì)算機(jī), 2002年15卷第9期. [11] Ronald J. Branchman, Tej Anand. The Process of Knowledge Discovery in Database: A Human- centered Approach. Advances in Knowledge Discovery and Data Mining. AAAI Press/The MITPress, 1996, pp-37-58. [12] 維克托, 邁爾-舍恩伯格, 肯尼思·庫(kù)克耶. 大數(shù)據(jù)時(shí)代:生活、工作與思維的大變革[M]. 盛楊燕, 周濤, 譯. 杭州:浙江人民出版社, 2013. Design and Implementation of Campus Information Analysis System Based on Spark WEI Xiao-xiao, WANG Xiao-zheng, WANG Sheng-tao, XIE Tian-tian In order to better explore the data information of "the packaged campus card" system, a campus information analysis system based on Spark is designed. Front-end development of the system using the Django framework, data processing using the Spark distributed framework, the results of the analysis are intuitively fed back to the user in a graphical way, so as to realize the data preprocessing, data analysis, data presentation, etc. : Data mining; Spark; Django; Data visualization TP274.2 A 10.3969/j.issn.1003-6970.2017.10.017 本文著錄格式:魏笑笑,王小正,王圣滔,等. 基于Spark的校園信息分析系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 軟件,2017,38(10):94-99 南京可信云計(jì)算與大數(shù)據(jù)應(yīng)用重點(diǎn)實(shí)驗(yàn)室、南京曉莊學(xué)院大學(xué)生科研創(chuàng)新項(xiàng)目。 魏笑笑(1993-),女,本科在讀,學(xué)士,研究方向:Web應(yīng)用開發(fā)、數(shù)據(jù)挖掘;王圣滔(1997-),男,本科在讀,學(xué)士,研究方向:數(shù)據(jù)挖掘、數(shù)據(jù)可視化;謝田田(1994-),女,本科在讀,學(xué)士,研究方向:數(shù)據(jù)挖掘;王小正(1974-),男,江蘇省南京市人,講師,碩士,研究方向:分布式應(yīng)用。3 部分?jǐn)?shù)據(jù)分析結(jié)果
4 系統(tǒng)展望
5 結(jié)語
(Information Engineering College, NanJing XiaoZhuang University, Nanjing, 211171)