閒聊大數據——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如何完成高考打分?

誠然,在真實的情況中,每個閱卷老師需要對每道題的每個知識點進行細化打分,因此係統還不完整。那麼如何才能使評分系統更加完善呢?

歡迎小夥伴們留言或者私信討論,喜歡的話請關注小鳥後多多收藏和轉發~


分享到:


相關文章: