基于Spark的校园信息分析系统的设计与实现
2017-11-16魏笑笑王小正王圣滔谢田田
魏笑笑,王小正,王圣滔,谢田田
(南京晓庄学院 信息工程学院,江苏 南京 211171)
基于Spark的校园信息分析系统的设计与实现
魏笑笑,王小正*,王圣滔,谢田田
(南京晓庄学院 信息工程学院,江苏 南京 211171)
为了更好的挖掘“校园一卡通”系统的数据信息,设计了一个基于Spark的校园信息分析系统。该系统的前端开发使用了 Django框架,数据处理则使用了 Spark分布式框架,分析的结果以图表的方式直观地反馈给用户,从而实现了数据的预处理、数据分析、数据呈现等功能。
数据挖掘;Spark;Django;数据可视化
0 引言
“校园一卡通”系统作为数字化校园建设的重要组成部分,已经在各大高校普及。目前,虽然“校园一卡通”系统已经在高校被广泛使用,但是这些存储的数据并没有引起广大管理人员的重视,大部分使用者只是关注了系统所实现的功能,而对管理所产生的附带数据没有足够的重视,也没有分析这些数据信息中所隐含的信息。广大高校内部所用的学生管理系统大部分是没有学生校园活动数据分析功能,而且迄今为止国内对学生校园活动分析方面没有比较成熟的方案。我们利用数据挖掘技术对“校园一卡通”系统使用过程中产生的校园大数据进行数据挖掘处理,利用如聚类分析等算法分析得出数据深层信息,从而为学校管理提供了更便捷完善的数字化服务。
1 需求分析
现在智能手机已经成为人们的生活中必不可少的工具,随时随地使用浏览器也成为了可能。因此,我们使用web开发技术,借助matpiltlib和plotly工具实现数据的可视化,最核心的数据分析模块使用了Scala语言进行开发,并且是基于Spark分布式集群技术。该系统实现了以下功能:
(1)用户管理功能。系统提供了用户登陆、注册与注销的功能,以实现对用户数据即学生隐私的保护。未登陆用户只能查看网站首页,无法查看具体信息。对登陆用户,系统则可以展示数据分析结果,并提供其他操作功能。
(2)文件上传功能。用户提供需要分析的数据文件,以Excel或csv等格式上传,文件中必须包含系统要求的字段。
(3)数据预处理功能。该功能包括数据清洗、集成、变换、选择、规约等操作步骤。系统对用户提供的包含所要求字段的文件中的冗余数据进行过滤处理,从而形成新的数据集合。
(4)数据分析功能。将处理过的数据导入到Spark集群中,然后进行相关性分析和聚类分析。
(5)数据呈现功能。将分析出来的结果经过图表的方式呈现出来,从而给用户直观感受。
2 系统设计
系统分为三个模块:数据处理模块(核心)、数据可视化模块和web呈现模块。Web呈现模块是和用户直接交互的,用户可以通过web页面进行一系列的操作。
2.1 数据处理
数据处理模块主要实现对数据的预处理、数据分析和分析结果整合等功能,这一部分采用 spark集群进行数据处理。因为spark是基于内存处理的,其最大的优势是处理大容量数据速度快。将接收的数据存储到分布式文件系统(HDFS)上,通过spark-submit提交应用程序,spark会创建和构造一个 Driver进程,初始化 SparkContext,spark中的master和worker节点会分别进行资源和任务调度并执行定义好的算子和函数,直到所有操作执行完为止。最后将处理好的数据存储于HDFS上,整个流程如图1所示。
2.2 数据可视化
可视化模块主要完成对于前期挖掘后得出的结论型数据给予标准化、直观化、具体化和美观化的呈现,同时对于部分仍然数据量庞大的中间数据作出视觉化的二次分析。其主要基本处理流程如图 2所示。
用户对于数据分析结果的发出请求后,根据请求在核心分析框架分析得到的初步结果型数据库或文件系统中找到对应的数据或数据文件,并且自动调用符合各模块协议的可视化处理程序。由于本系统使用python语言开发的matplotlib库和plotly库分别来进行窗口端和web端的可视化处理,所以本系统使用同样基于python语言的 Django框架作为web开发框架,并将可视化模块程序按照前期协议封装成绘制图像模块,使调用的过程实现了无缝集成。封装的可视化处理程序得到数据后,对数据形式或数据文件形式作出判断并转化为可绘制数据,请求处理程序甚至可以通过参数设定控制来呈现形式。用户最终不仅可以得到静态化的图片文件,还能够得到动态实时可操作的多维数据绘制图像,从而便于用户进行详细观察分析。
2.3 web呈现
Web呈现模块负责与用户的交互。用户首先需要通过注册和登录才能使用系统的主要功能,否则仅仅只能浏览一些介绍信息。登录后的用户可以进行文件上传,并且能够查看数据分析结果。
2.4 系统特点
(1)采用web为呈现环境,使得用户能够随时查看结果。
(2)采用 spark集群架构分析数据,可以直接将工作结果存储于内存中,从而省去了磁盘的 I/O操作,使得系统运行效率更高。
图1 流程概要图Fig.1 Process summary diagram
图2 可视化基本处理流程图Fig.2 Visual processing flow chart
(3)利用数据可视化工具matplotlib库和plotly库,将大规模的数据以图表的形式展现出来,方便用户很直观的查看分析结果。
(4)具有数据上传的功能。用户可以上传符合要求的文件以便实现对数据的处理等操作。
(5)数据存储与处理均在云平台中进行,便于系统管理员在后台进行数据管理。
2.5 系统总体架构
系统架构主要包括前端 web,用于用户交互和效果呈现,分布式数据分析平台,主要基于 spark分布式框架搭建,系统总体架构如图3所示。
2.6 分布式数据分析中关键技术实现
图3 系统总体架构图Fig.3 System overall architecture diagram
数据分析中的其中一个需求是根据学生消费记录的时间相关性找出学生之间的亲密度。这个需求需要统计每天一定时间间隔内任意两个学生消费次数,最后汇总出一年来任意两个学生在一定时间间隔内同时消费的次数。因为本需求涉及的计算量是巨大的,所有利用开源HDFS存储数据,利用分布式计算框架spark进行数据分析。Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎[1]。Spark是UC Berkeley AMP lab(加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark拥有Hadoop MapReduce所具有的优点。但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法[2,3]。
在使用 spark进行数据分析主要是充分利用它的分布式计算特点,但若没有分布式编程的思想,即使使用了scala语言进行编程,也会出现分布式环境下的单机程序[4],从而没有真正体现并行运算的优势。例如下面这段代码也能达到学生数据分析的结果,但因为没有利用到spark的分布式计算优势,最终出现内存溢出或时间超长的结果。具体代码如下:
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) } }这段代码通过构建一个数组,比较数组的第一个元素和数组中其他所有元素的消费时间间隔是否小于设定的时间间隔,然后把第一个元素移除,接着再进行比较,不断循环,这种设计思路就是典型的单机程序的设计思路。再如下面这段代码 d ata4.map(x=>( (x._1._1,x._2._1), //生成用户身份 id键值对 { /* 若两次消费时间小于设定间隔,则相关性计数+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-设定关联消费的时间间隔 n=n+1 } } n } )) 这段代码虽然好像使用了 scala特定的数据对象RDD,但在进行map操作时,还是通过循环比较字符串,效率也是十分低下的。 通过多种计算方案的比较,最后选择的方案是第一步对数据进行预处理,生成“key(消费日期-消费区域代码),value(消费时间,账户代码)”键值对,再进行笛卡尔积操作生成新的键值对,接着通过对键值对进行时间比较并统计汇总,从而得到任意一年来两个学生之间在一定时间内同时消费的次数,最终通过聚类分析出这些学生之间的亲密度。本系统中使用的数据集是所有在校生一年的消费记录共1800万条,通过6台服务器搭建的集群进行计算。其中每台服务器内存32G,时间间隔选择5分钟和10分钟两种情况,每次计算耗时25分钟左右。数据处理关键代码如下: 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)和方山服务区(05)的消费记录(数据格式:账户代码消费区域代码消费时间) val df1=dfConsume.select ("FLW_ACCID", "FLW_AREID", "FLW_CONTIME") where ("FLW_AREID= '01' OR FLW_AREID='03' OR FLW_AREID= '05'") //生成键值对,其中 key(消费日期-消费区域代码),value(消费时间,账户代码) 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)))) //根据消费日期,消费区域和消费时间依次排序 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运行过程中RDD数据集生成过程如图4所示。 Spark集群中计算节点作业过程中的输入输出容量及各个阶段的时间如图5所示。 1. 通过对“校园一卡通”的消费记录进行分析,可以作为贫困生认定的辅助。通过分析每位同学每个月消费的次数和消费的金额。接着对结果进行聚类,从而划分出贫困、正常和富裕的界限,分析结果如图6所示。 通过聚类算法分析可以得到:消费水平每月低于500元且消费次数大于90次的人数较少,消费次数多,消费金额少,可以将这部分学生定为贫困生。而次数大于20次,金额高于500元的人数较少,消费金额较高,可以定为富裕学生。 2. 通过选取 10分钟为计算时间间隔,得到任意两个学生一年内同时消费的次数,然后对每个学生与其他学生同时消费次数进行汇总,结果分布如图7所示。 目前,我们只对单一来源的数据进行了客观分析,因此对不同数据之间的联系与区别缺乏比较。校园卡消费信息与其他数据之间的联系仍旧需要被继续挖掘,比如,消费高低与学习水平的联系,消费水平与学校补助情况是否吻合,个人消费水平与交际情况的联系等等。由校园卡消费信息所提供的数据与其他数据如学生学习水平,图书馆停留时间,宿舍门禁时间等联系起来,应该能够得出更多更有用的结论,从而帮助学校在决策与政策实施方面提供一定的参考作用。 当今时代,大规模数据的分析结果(如大规模调研结果)在决策方面起了举足轻重的作用。本系统旨在通过对校园存储的庞大数据进行更深层次的发掘,从而对数据这种长期被忽视的资源进行再次利用。目前,高校的数据处理已经是一种趋势,以本校一年校园卡消费数据进行分析,便可以获得很多有效的信息。相信在不久的将来,当数字化校园全面普及,各种信息得到记录时,本系统将会拥有更多的数据,从而能够得出更有效的结论。 图4 RDD数据集转换流程图Fig.4 RDD data set transformation flow diagram 图5 作业过程状态图Fig.5 The job process status graph 图6 学生平均月消费次数和消费金额散点图Fig.6 Students' average monthly consumption times and consumption figure scatter plot 图7 学生关系权值图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. 数据挖掘——概念、模型、方法和算法[M]. 闪四清, 等, 译. 北京: 清华大学出版社,2003. [6] 安淑芝, 等. 数据仓库与数据挖掘[M]. 北京: 清华大学出版社, 2005年. [7] 张丽丽. 数据挖掘技术的应用分析[J]. 山西经济管理干部学院学报, 2003, 11(4): 75-76. [8] 毛建旭, 毛建频, 姚晓玲, 等. 基于等价类的大型数据库频繁项集挖掘算法[J]. 新型工业化, 2011, 1(4): 35-44. [9] 霍红卫, 林帅, 于强, 等. 基于MapReduce的模体发现算法[J]. 新型工业化, 2012, 2(9): 18-30. [10] 陈建军, 钱慎一, 卢中宁. 校园一卡通系统的数据分析与系统规划[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] 维克托, 迈尔-舍恩伯格, 肯尼思·库克耶. 大数据时代:生活、工作与思维的大变革[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的校园信息分析系统的设计与实现[J]. 软件,2017,38(10):94-99 南京可信云计算与大数据应用重点实验室、南京晓庄学院大学生科研创新项目。 魏笑笑(1993-),女,本科在读,学士,研究方向:Web应用开发、数据挖掘;王圣滔(1997-),男,本科在读,学士,研究方向:数据挖掘、数据可视化;谢田田(1994-),女,本科在读,学士,研究方向:数据挖掘;王小正(1974-),男,江苏省南京市人,讲师,硕士,研究方向:分布式应用。3 部分数据分析结果
4 系统展望
5 结语
(Information Engineering College, NanJing XiaoZhuang University, Nanjing, 211171)