目錄 正文 前言
在Hadoop中,排序是MapReduce的靈魂,MapTask和ReduceTask均會(huì)對(duì)數(shù)據(jù)按Key排序,這個(gè)操作是MR框架的默認(rèn)行為,不管你的業(yè)務(wù)邏輯上是否需要這一操作。
技術(shù)點(diǎn)
MapReduce框架中,用到的排序主要有兩種:快速排序和基于堆實(shí)現(xiàn)的優(yōu)先級(jí)隊(duì)列(PriorityQueue)。
Mapper階段
從map輸出到環(huán)形緩沖區(qū)的數(shù)據(jù)會(huì)被排序(這是MR框架中改良的快速排序),這個(gè)排序涉及partition和key,當(dāng)緩沖區(qū)容量占用80%,會(huì)spill數(shù)據(jù)到磁盤,生成IFile文件,Map結(jié)束后,會(huì)將IFile文件排序合并成一個(gè)大文件(基于堆實(shí)現(xiàn)的優(yōu)先級(jí)隊(duì)列),以供不同的reduce來拉取相應(yīng)的數(shù)據(jù)。
Reducer階段
從Mapper端取回的數(shù)據(jù)已是部分有序,Reduce Task只需進(jìn)行一次歸并排序即可保證數(shù)據(jù)整體有序。為了提高效率,Hadoop將sort階段和reduce階段并行化,在sort階段,Reduce Task為內(nèi)存和磁盤中的文件建立了小頂堆,保存了指向該小頂堆根節(jié)點(diǎn)的迭代器,并不斷的移動(dòng)迭代器,以將key相同的數(shù)據(jù)順次交給reduce()函數(shù)處理,期間移動(dòng)迭代器的過程實(shí)際上就是不斷調(diào)整小頂堆的過程(建堆→取堆頂元素→重新建堆→取堆頂元素...),這樣,sort和reduce可以并行進(jìn)行。
分組Top N分析
在數(shù)據(jù)處理中,經(jīng)常會(huì)碰到這樣一個(gè)場(chǎng)景,對(duì)表數(shù)據(jù)按照某一字段分組,然后找出各自組內(nèi)最大的幾條記錄情形。針對(duì)這種分組Top N問題,我們利用Hive、MapReduce等多種工具實(shí)現(xiàn)一下。
場(chǎng)景模擬

computer,huangxiaoming,85,86,41,75,93,42,85
computer,xuzheng,54,52,86,91,42
computer,huangbo,85,42,96,38
english,zhaobenshan,54,52,86,91,42,85,75
english,liuyifei,85,41,75,21,85,96,14
algorithm,liuyifei,75,85,62,48,54,96,15
computer,huangjiaju,85,75,86,85,85
english,liuyifei,76,95,86,74,68,74,48
english,huangdatou,48,58,67,86,15,33,85
algorithm,huanglei,76,95,86,74,68,74,48
algorithm,huangjiaju,85,75,86,85,85,74,86
computer,huangdatou,48,58,67,86,15,33,85
english,zhouqi,85,86,41,75,93,42,85,75,55,47,22
english,huangbo,85,42,96,38,55,47,22
algorithm,liutao,85,75,85,99,66
computer,huangzitao,85,86,41,75,93,42,85
math,wangbaoqiang,85,86,41,75,93,42,85
computer,liujialing,85,41,75,21,85,96,14,74,86
computer,liuyifei,75,85,62,48,54,96,15
computer,liutao,85,75,85,99,66,88,75,91
computer,huanglei,76,95,86,74,68,74,48
english,liujialing,75,85,62,48,54,96,15
math,huanglei,76,95,86,74,68,74,48
math,huangjiaju,85,75,86,85,85,74,86
math,liutao,48,58,67,86,15,33,85
english,huanglei,85,75,85,99,66,88,75,91
math,xuzheng,54,52,86,91,42,85,75
math,huangxiaoming,85,75,85,99,66,88,75,91
math,liujialing,85,86,41,75,93,42,85,75
english,huangxiaoming,85,86,41,75,93,42,85
algorithm,huangdatou,48,58,67,86,15,33,85
algorithm,huangzitao,85,86,41,75,93,42,85,75

一、數(shù)據(jù)解釋
數(shù)據(jù)字段個(gè)數(shù)不固定: 第一個(gè)是課程名稱,總共四個(gè)課程,computer,math,english,algorithm, 第二個(gè)是學(xué)生姓名,后面是每次考試的分?jǐn)?shù)
二、統(tǒng)計(jì)需求: 1、統(tǒng)計(jì)每門課程的參考人數(shù)和課程平均分
2、統(tǒng)計(jì)每門課程參考學(xué)生的平均分,并且按課程存入不同的結(jié)果文件,要求一門課程一個(gè)結(jié)果文件,并且按平均分從高到低排序,分?jǐn)?shù)保留一位小數(shù)
3、求出每門課程參考學(xué)生成績(jī)最高的學(xué)生的信息:課程,姓名和平均分
第一題
CourseScoreMR1.java

View Code
第二題
CourseScoreMR2.java

View Code
CSPartitioner.java

View Code
第三題
CourseScoreMR3.java

View Code
CourseScoreGC.java

View Code
|