闲聊大数据——Hadoop如何完成高考打分?

紧张的高考已经结束了,不管考试结果如何,至少经历了人生的一道坎。在接下来的三个月时间内,所有考生都可以随意分配自己的时间,家长们在这个时间段也不会刻意去限制孩子的行动,只要没有危险,开心就好。

闲聊大数据——Hadoop如何完成高考打分?

然而在这轻松的日子里有些人的忙碌才刚刚开始,这些人就是阅卷老师。

2018年,中国有975万考生报名了高考,是近十年来人数最多的一次。如果按照通用的四科(语文、数学、英语、文综或者理综)来算的话,一共就有近四千万试卷。一般而言,高考成绩会在靠后15天左右公布,那么如何能快送的给这四千万试卷打出分数呢?

大家都知道,试卷的评判一定是所有阅卷老师同时进行的,这似乎就是一个典型的分布式系统,下面小鸟来带大家一步步剖析如何用Hadoop构建高考评分系统。

闲聊大数据——Hadoop如何完成高考打分?

首先,各省先将本省的试卷扫描后存入整个HDFS系统。在这一步中,一份试卷存一个文件,每一份考试文件命名规则以考生考+省份+学科命名。

接下来编写第一个MapReduce程序,该程序的功能主要是统计出每个考生没门分数的成绩。

在第一个MapReduce程序的Map阶段时,先用setup函数获取文件名,接着按照省份和学科来给每份试卷评分。评分完毕后按照key为“考生考+省份+学科”,value为分数的形式,将所有的数据归入shuffle阶段。此步骤需要循环两次,因为从逻辑上考虑,不同的MapTask(阅卷老师)评出的分数不一定相同。

闲聊大数据——Hadoop如何完成高考打分?

由于全国卷的数量远远大于其他自主命题的试卷,因此在shuffle阶段时需要利用partition来做分区,其作用就是为了负载均衡,尽量让所有的结果同时输出。

假设全国有31个省份参加高考,一共有26个省份使用全国卷,另外5个省份自主命题。在内存允许的情况下,可以将ReduceTask设置为31个,其中5个自主命题省份各自用自己独立的paritition,另外26个使用全国卷的省份在剩下的26个partition下随意分配。

最后进入Reduce阶段,每个ReduceTask会接收到2个值,即前面不同阅卷老师打出的不同分数。之后进行一个简单的计算,如果差值在2分以内,则取高分输出。如果差值在2分以上,则通过key找到该试卷,对其单独评分。

闲聊大数据——Hadoop如何完成高考打分?

然后编写第二个MapReduce程序,该程序的功能就是将所有考生号+省份相同的相同的结果进行归并,得出每个考生每门学科的分数以及总分。第二个MapReduce程序为最基础的MapReduce程序,因此不做详解。

闲聊大数据——Hadoop如何完成高考打分?

最后编写第三个MapReduce程序,该程序的功能就是将省份相同的考生的总分按照从大到小的顺序排序,得出每个省份的总分排序表。

在第三个MapReduce程序中,排序用到的是Shuffle中的sort。即自定义一个集合类,在加入时就会事先排序,参照Java中的Comparable。

最终处理每个省份的总分排序表,划出分数线。至此高考评分完全结束。

闲聊大数据——Hadoop如何完成高考打分?

诚然,在真实的情况中,每个阅卷老师需要对每道题的每个知识点进行细化打分,因此系统还不完整。那么如何才能使评分系统更加完善呢?

欢迎小伙伴们留言或者私信讨论,喜欢的话请关注小鸟后多多收藏和转发~


分享到:


相關文章: