A.2 结构和功能
正如前一节中所介绍的,云计算在线检测平台已发展成由三大部分组成,分别是前台用户接口、后台程序运行及平台程序过滤模块,下面分别对它们进行介绍。
A.2.1 前台用户接口的结构和功能
前台用户接口的功能结构如图A-1所示。它主要包括四部分内容:用户完全服务、实例编程练习、分布式系统理论知识测试、帮助功能(指网站的使用帮助、Hadoop介绍文档,以及网站的中文页面)。下面分别详细介绍这四个功能块。
用户完全服务主要包括注册、登录和更新信息等。注册是指用户在Register页面完成新用户的注册,云计算在线检测平台只对注册用户提供代码检测服务。在注册页面需要填写用户名、注册码(选填)、密码、单位、邮箱等信息,注册成功之后用户就可以使用注册的用户名和密码登录了,同时邮箱会收到一封注册邮件,以防止用户忘记用户名和密码以致无法登录。在注册时如果发生用户名已注册、密码重复错误、验证码输入错误等,将会导致注册失败。注册成功后可以在首页的右上角直接使用用户名和密码进行登录,也可以在login页面完成登录操作。登录成功的用户可以选择login out。更改个人信息是指更改个人密码等信息,如果用户期望做出更改,可以在update your info页面完成。
图 A-1 前台接口的结构图
MapReduce实例编程练习主要包括题目浏览、提交答案、查看提交记录、查看提交源码、查看检测结果。在云计算在线检测平台上,开发小组设计了很多基于MapReduce并行框架能够解决的实际问题。用户可以在problem页面详细浏览各个问题的背景,以及输入输出要求和注意事项。然后利用自己的MapReduce理论知识,针对具体实例问题来编写自己的实例解决代码,并且在submit solution页面提交代码。网站会运行用户提交的代码,然后在网站上反馈相应的结果。用户可以在My submission页面中查看自己的提交记录,也可以单击每一条记录中的source连接查看自己提交的代码,同时还可以单击result栏下面的连接查看检测结果。
分布式系统理论知识测试主要指用户单击首页的theory test之后会出现一份限时半小时的试卷,共20道选择题。这些选择题都是随机从平台中题库里选出来的,题目是关于分布式系统的理论知识,主要集中在Hadoop及其子项目上。用户答题完毕单击提交按钮或在页面上停留的时间超过半小时,所有答案就会提交。平台通过比对之后会将每道题目的正确答案及用户的回答一起返回,并计算出此次测试的分数。
帮助功能主要指网站的使用帮助、网站对应的中文页面,以及Hadoop的介绍文档和用于讨论的BBS版块。网站的使用帮助在首页的FAQs页面下,主要是关于网站在实际使用中要注意的事项。网站对应的中文页面可以点击Chinese链接进入。中文页面也提供了与英文页面完全相同的服务。Hadoop快速指南网站上的Hadoop Quick Start链接和它所提供的在线文档,主要为用户提供一些Hadoop分布式系统的初步认识和安装说明。BBS论坛允许用户在平台上交流MapReduce的学习经验,以及对平台上题目,同时还可以留下自己关于平台使用的疑问。
A.2.2 后台程序运行的结构和功能
后台程序运行的功能结构如图A-2所示。后台中的主要模块也是四部分:Tomcat服务器、MySQL数据库、Hadoop分布式环境、Shell文档。下面详细介绍这四个功能块。
Tomcat服务器:担当网站的Web服务器角色,保证用户能够从网络上访问到平台,并将开发小组基于JSP技术开发的网页呈现在用户的电脑上。
MySQL数据库:其中主要是网站的信息,包括用户个人信息、用户提交记录、网站题库等。基于JSP技术开发的网页通过调用MySQL的接口,获取用户请求的信息,并将其呈现在网页上或将网页上提交的信息保存到数据库中。
图 A-2 后台结构图
Hadoop分布式环境:是整个后台的核心所在,因为它是云计算在线检测平台提供特色服务的核心。开发小组首先在多台计算机上安装好Hadoop分布式系统,形成一个分布式环境,然后再在集群上配置网站提供服务,这就可以保证为用户提交的代码提供并行程序运行所需的真实分布式环境。Hadoop集群的主要功能就是运行用户提交的代码,给出结果。
Shell文档:在检测平台的系统中扮演着人体中血液的角色。它首先将网页保存下来的用户代码进行预处理,比如检测是否是正确的Java程序等,然后再对预处理之后的结果进行预编译,成功之后再将代码提交到Hadoop上,接着再收集Hadoop的运行结果,然后与标准结果进行比对,最后将比对的结果分类返回给前台网页,呈现在用户面前。综合来说,Shell文档将前台功能块和后台功能块串联了起来,以便为用户提供连贯的服务。
A.2.3 平台程序过滤功能
这部分主要实现了两个与用户程序直接相关的功能:非MapReduce合理框架程序过滤和雷同代码程序过滤。添加过滤模块的主要出发点是,管理员发现在平台的使用过程中,部分用户直接提交他人代码或者经过一些初级的代码移动、替换等提交他人代码,甚至有些用户提交的代码所有任务均安排在一个节点的Reduce函数中完成任务,Map函数的功能就是直接输出获取的输入,这种程序看似运用了MapReduce框架,但是并不是合理的MapReduce框架程序,因为它未能利用MapReduce框架来并行处理问题,甚至由于Map函数这个无用过程的存在增加了处理的负担。这两种现象都是不应该出现的,但是由于之前平台是自动运行,只匹配结果是否正确,导致这些不合理代码会被接受。为了避免这些现象,管理员升级了平台,增加了代码过滤模块。下面简要介绍这两个功能实现细节:
(1)非MapReduce合理框架程序过滤功能
MapReduce框架通过Map和Reduce两个函数,实现了集群对海量数据的并行处理。其中Map函数起到数据预处理和分流的功能,Reduce函数再根据不同的key获取不同的Map函数输出流,进行深度数据处理,可见Map函数和Reduce函数二者功能缺一不可。但是在平台使用中,部分用户只是简单地将所有数据的处理任务都放在一个节点的Reduce函数中,Map函数仅输出接受的输入。这种处理方法是不合理的。
通过观察和分析这些程序,管理员发现,用户要想将所有的任务放在一台节点的Reduce函数中处理,那么他就需要将Map输出的key选为一个固定值。所以从这一点出发,在平台的非MapReduce合理框架程序过滤中,管理员首先定位Map函数的输出位置,再定位输出位置中key的位置,如果程序辨别此key值为某个固定值,那么说明用户并未将输入数据分流,是不合理的MapReduce框架程序,从而不执行此程序,输出为MapReduce Error。
(2)雷同代码的过滤
抄袭在平常的工作中非常常见,特别是在计算机领域。从发现有雷同代码出现之后,管理员就开始研读对应的雷同代码检测文献,学习相关方法,并将之运用到平台中。现在平台的雷同代码过滤主要采取以下步骤:
过滤无效字符,替换变量为同一字符;
按照固定窗口大小,滑动获取固定大小的连续字符串;
计算每个字符串的Hash函数值;
按照固定窗口大小,滑动获取固定大小的连续Hash函数值;
获取每个连续函数值串中的最小函数值,结合其位置参数作为代码的指纹,某一位置上的函数值只能出现一次;
计算此代码指纹与代码指纹库中每个指纹的相似度,如果超过某一阈值则判为雷同代码;
界面显示雷同代码,并自动发送邮件给用户和系统管理员。
由于代码抄袭和代码学习之间的界限并不明确,可能会将代码错判为雷同代码,雷同代码的过滤在平台中发挥了巨大作用,模块刚加入之处就判出了两例雷同代码。
代码过滤模块的加入,并不是为了增加用户使用的难度,而是为了规范用户的代码,优化平台的使用。系统管理员会根据实际的使用情况,不断更新扩展此模块功能,使平台功能更加完善,用户使用更加方便。