A.4 使用介绍

前面介绍了云计算在线检测平台的理论内容,本节将从功能使用、题目介绍、返回结果说明、使用注意事项四个方面详细介绍平台的使用方法。

A.4.1 功能使用

本附录第2节介绍了平台中前台用户接口和后台程序运行的结果和功能块。而与用户直接相关的就是前台功能的使用。下面用三个使用实例来说明如何使用前台功能。

1.如何注册用户,如何修改信息?

注册功能的使用流程如下:

1)在首页点击Register链接,进入注册界面;

2)填写个人信息,包括用户名、注册码(选填)、密码、邮箱、单位、国家、验证码等;

3)根据提示进行调整,比如如果提示用户名已存在,就需要换一个用户名,如果提示密码重复错误,就需要重新输入密码等。

4)注册成功,如果注册完之后可以进入注册成功界面,就表示注册成功了,界面上显示的是自己除密码外的所有注册信息,同时用户所注册的邮箱会收到一封包含用户名和密码的注册邮件,以防止忘记用户名或密码。

使用修改信息功能的流程如下:

1)登录之后在首页点击Update your info链接,进入信息修改页面;

2)填写要修改的个人信息;

3)点击提交之后就会进入修改成功界面,界面显示修改的信息。

2.如何提交自己的代码并查看结果?

1)登录之后点击具体题目下的submit按钮,进入代码提交页面,或者点击submit solution链接直接进入提交页面,再或者在首页的problem一栏下输入problem ID直接进入problem,然后点击提交进入代码提交页面;

2)在代码提交页面的空白处粘贴自己的代码,点击提交;

3)提交之后页面自动跳入仅包含此次提交信息的页面,在这个页面中用户能够查看自己提交的代码,同时页面还能够在代码运行结束之后自动更新result一栏的状态,并显示运行结果(此处采用了AJAX技术,由于存在技术兼容问题,所以只有firefox支持),更新之后用户可以点击查看运行结果;

4)用户想查看结果和自己的代码,也可以点击My Submission链接,进入自己的提交记录页面,点击特定记录后的source就可以查看提交的代码了,点击result一栏的结果可以查看具体的结果信息。

3.如何进行理论测试?

1)登录后点击Theory test进入理论测试界面;

2)根据具体的题目选择正确答案,然后提交(理论测试每份试卷限时30分钟,如果在页面上停留的时间超过30分钟,平台也会自己提交页面现有答案);

3)提交之后页面自动跳入结果页面,显示每到题目的回答是否正确。

A.4.2 返回结果介绍

在平台上提交代码之后在提交历史中的result一栏就可以看到结果。那么都有什么结果?都代表什么意思?针对具体的错误用户应该如何应对?下面将进行详细介绍。

Accepted:表示用户提交的代码已经被接受,而用户代码被接受的前提是代码能够正确运行,并且在以平台的测试数据作为输入数据执行的输出结果和平台标准的输出结果完全相同。但是需要提醒的是,由于MapReduce编程框架的原因,平台上的这些题目完全可以在MapReduce结构中的Map或Reduce阶段独立完成,但是这种做法没有完全发挥MapReduce并行运行的效率,不是最优的办法。所以如果用户的代码被Accepted了,用户还需要审视自己的代码,检查它是否最大程度利用了并行运行来提高效率。

Compile Error:表示用户代码编译错误,出现这种情况说明在用户的代码中存在语法问题,在进行普通的Java程序编译时出错了。用户可以点击result栏的错误结果链接去查看具体的语法错误位置,并进行修改。用户也可以在本地进行普通的Java编译,待通过之后再提交到平台上。

MapReduce Error:表示代码在Hadoop上运行时出现错误并没有输出结果。这种情况出现的可能性比较多,主要包括:常见的Java程序逻辑错误、MapReduce逻辑错误等。Java程序逻辑错误又主要包括数组越界、未初始化等,MapReduce逻辑错误则主要包括输入输出类型不匹配等。在遇到MapReduce Error时相对比较麻烦,需要用户仔细核对自己的代码,找出逻辑错误的地方进行修改,然后再尝试提交。

Wrong Answer:表示代码能够在Hadoop上正常运行并有输出结果,只是用户的输出结果和标准结果并不匹配。出现这种情况时,用户首先要检查自己代码的输出格式是否正确,比如顺序是否和实例输出相同。然后再检查结果是否完整,是不是漏掉了某些结果等,最后检查是不是程序逻辑错误导致的结果错误。

Runtime Error:表示代码执行的时间太长,也就是说用户代码在Hadoop上执行的时间超出了正常的执行时间。出现这种情况的原因主要是用户程序存在死循环或平台同时提交的程序太多,使运行效率降低了。用户只需要查看是否存在死循环代码并在平台空闲的时间提交就可以了。

Memory Exceed:表示程序运行时内存溢出,即用户代码中过多使用了内存或无限申请内存的代码(这主要针对主函数中的代码,如果在MapReduce中出现类似的代码会返回MapReduce Error)。出现这种情况,就需要用户在自己的代码中仔细查找是否有过多使用内存或无限开内存的代码。

Evil Code:表示提交的程序中存在恶意代码,也就是说用户代码中存在系统调用代码或意图更改平台服务器配置的代码等。这就需要用户清除代码中根本用不到的代码和一些恶意代码了。

Sim Code:表示提交程序的指纹和网站代码指纹库中的某一个指纹相似度超过了网站定义的阈值,也就是说此代码有抄袭的嫌疑。发生这种错误之后网站会向用户和网站管理员自动发送相关邮件,并附上用户代码和雷同代码,如果判错用户可同管理员联系。

以上介绍了平台运行用户提交的代码之后所返回的各种结果及其出现的原因和应对策略。错误的根本原因是代码问题,所以用户遇到问题需要耐心审视自己代码,修改其中不正确的代码和逻辑,删除无用代码。

A.4.3 使用注意事项

这一节主要向大家介绍平台使用的一些注意事项,这部分内容也可以参考平台FAQs中的内容。

Java程序主类的名字必须为MyMapre(否则编译错误)。存在这个限制的原因是需要统一所有提交的代码,然后由Shell文档再将其提交到Hadoop上运行,所以不能为每个用户的代码写专门的Shell文档。

在配置MapReduce程序的输入输出时必须使用下面两个语句(原因和前一个注意事项相同):


旧API

FileInputFormat.setInputPaths(conf, new Path(args[0]));

FileOutputFormat.setOutputPath(conf, new Path(args[1]));

新API

FileInputFormat.addInputPath(job, new Path(otherArgs[0]));

FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));


MapReduce程序必须处于一个Java源文件内,它不支持引用其他文件的类。也就是说必须把Map、Reduce、Combine等类写到一个文件内。

平台对同时运行的MapReduce程序数量有限制。因为系统资源有限,而Hadoop平台及MapReduce程序在处理少量数据时的表现并不是很好(即使运行少量数据,WordCount程序也需要花费20多秒的时间),所以需要用户耐心等待提交程序的检测结果,而且不要同时提交多个程序,以免占用过多的平台资源。