MapReduce 分區(qū)

MapReduce 分區(qū)

分區(qū)概述

在 MapReduce 中, 通過我們指定分區(qū), 會將同一個分區(qū)的數(shù)據(jù)發(fā)送到同一個 Reduce 當(dāng)中進(jìn)行處理

例如: 為了數(shù)據(jù)的統(tǒng)計, 可以把一批類似的數(shù)據(jù)發(fā)送到同一個 Reduce 當(dāng)中, 在同一個 Reduce 當(dāng)中統(tǒng)計相同類型的數(shù)據(jù), 就可以實(shí)現(xiàn)類似的數(shù)據(jù)分區(qū)和統(tǒng)計等

其實(shí)就是相同類型的數(shù)據(jù), 有共性的數(shù)據(jù), 送到一起去處理

Reduce 當(dāng)中默認(rèn)的分區(qū)只有一個

需求:將以下數(shù)據(jù)進(jìn)行分開處理

詳細(xì)數(shù)據(jù)參見partition.csv 這個文本文件谷浅,其中第五個字段表示開獎結(jié)果數(shù)值寨典,現(xiàn)在需求將15以上的結(jié)果以及15以下的結(jié)果進(jìn)行分開成兩個文件進(jìn)行保存

wps1.jpg

分區(qū)步驟:

Step 1. 定義 Mapper

這個 Mapper 程序不做任何邏輯, 也不對 Key-Value 做任何改變, 只是接收數(shù)據(jù), 然后往下發(fā)送

public class MyMapper extends Mapper<LongWritable,Text,Text,NullWritable>{
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        context.write(value,NullWritable.get());
    }
}
Step 2. 自定義 Partitioner

主要的邏輯就在這里, 這也是這個案例的意義, 通過 Partitioner 將數(shù)據(jù)分發(fā)給不同的 Reducer

/**
 * 這里的輸入類型與我們map階段的輸出類型相同
 */
public class MyPartitioner extends Partitioner<Text,NullWritable>{
    /**
     * 返回值表示我們的數(shù)據(jù)要去到哪個分區(qū)
     * 返回值只是一個分區(qū)的標(biāo)記,標(biāo)記所有相同的數(shù)據(jù)去到指定的分區(qū)
     */
    @Override
    public int getPartition(Text text, NullWritable nullWritable, int i) {
        String result = text.toString().split("\t")[5];
        if (Integer.parseInt(result) > 15){
            return 1;
        }else{
            return 0;
        }
    }
}
Step 3. 定義 Reducer 邏輯

這個 Reducer 也不做任何處理, 將數(shù)據(jù)原封不動的輸出即可

public class MyReducer extends Reducer<Text,NullWritable,Text,NullWritable> {
    @Override
    protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
        context.write(key,NullWritable.get());
    }
}
Step 4. 主類中設(shè)置分區(qū)類和ReduceTask個數(shù)
public class PartitionMain  extends Configured implements Tool {
    public static void main(String[] args) throws  Exception{
        int run = ToolRunner.run(new Configuration(), new PartitionMain(), args);
        System.exit(run);
    }
    @Override
    public int run(String[] args) throws Exception {
        Job job = Job.getInstance(super.getConf(), PartitionMain.class.getSimpleName());
        job.setJarByClass(PartitionMain.class);
        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);
        TextInputFormat.addInputPath(job,new Path("hdfs://192.168.52.250:8020/partitioner"));
        TextOutputFormat.setOutputPath(job,new Path("hdfs://192.168.52.250:8020/outpartition"));
        job.setMapperClass(MyMapper.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(NullWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setMapOutputValueClass(NullWritable.class);
        job.setReducerClass(MyReducer.class);
        /**
         * 設(shè)置我們的分區(qū)類耕餐,以及我們的reducetask的個數(shù),注意reduceTask的個數(shù)一定要與我們的
         * 分區(qū)數(shù)保持一致
         */
        job.setPartitionerClass(MyPartitioner.class);
        job.setNumReduceTasks(2);
        boolean b = job.waitForCompletion(true);
        return b?0:1;
    }
}

MapReduce 中的計數(shù)器

計數(shù)器是收集作業(yè)統(tǒng)計信息的有效手段之一,用于質(zhì)量控制或應(yīng)用級統(tǒng)計。計數(shù)器還可輔助診斷系統(tǒng)故障红竭。如果需要將日志信息傳輸?shù)?map 或 reduce 任務(wù), 更好的方法通常是看能否用一個計數(shù)器值來記錄某一特定事件的發(fā)生喘落。對于大型分布式作業(yè)而言茵宪,使用計數(shù)器更為方便。除了因?yàn)楂@取計數(shù)器值比輸出日志更方便瘦棋,還有根據(jù)計數(shù)器值統(tǒng)計特定事件的發(fā)生次數(shù)要比分析一堆日志文件容易得多稀火。

hadoop內(nèi)置計數(shù)器列表

MapReduce任務(wù)計數(shù)器 org.apache.hadoop.mapreduce.TaskCounter
文件系統(tǒng)計數(shù)器 org.apache.hadoop.mapreduce.FileSystemCounter
FileInputFormat計數(shù)器 org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter
FileOutputFormat計數(shù)器 org.apache.hadoop.mapreduce.lib.output.FileOutputFormatCounter
作業(yè)計數(shù)器 org.apache.hadoop.mapreduce.JobCounter

每次mapreduce執(zhí)行完成之后,我們都會看到一些日志記錄出來兽狭,其中最重要的一些日志記錄如下截圖

1561707398432.png

所有的這些都是MapReduce的計數(shù)器的功能憾股,既然MapReduce當(dāng)中有計數(shù)器的功能,我們?nèi)绾螌?shí)現(xiàn)自己的計數(shù)器箕慧?服球??

需求:以以上分區(qū)代碼為案例颠焦,統(tǒng)計map接收到的數(shù)據(jù)記錄條數(shù)

第一種方式

第一種方式定義計數(shù)器斩熊,通過context上下文對象可以獲取我們的計數(shù)器,進(jìn)行記錄
通過context上下文對象伐庭,在map端使用計數(shù)器進(jìn)行統(tǒng)計

public class PartitionMapper  extends Mapper<LongWritable,Text,Text,NullWritable>{
    //map方法將K1和V1轉(zhuǎn)為K2和V2
    @Override
    protected void map(LongWritable key, Text value, Context context) throws Exception{
        Counter counter = context.getCounter("MR_COUNT", "MyRecordCounter");
        counter.increment(1L);
        context.write(value,NullWritable.get());
    }
}

運(yùn)行程序之后就可以看到我們自定義的計數(shù)器在map階段讀取了七條數(shù)據(jù)

1561707440117.png
第二種方式

通過enum枚舉類型來定義計數(shù)器
統(tǒng)計reduce端數(shù)據(jù)的輸入的key有多少個

public class PartitionerReducer extends Reducer<Text,NullWritable,Text,NullWritable> {
   public static enum Counter{
       MY_REDUCE_INPUT_RECORDS,MY_REDUCE_INPUT_BYTES
   }
    @Override
    protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
       context.getCounter(Counter.MY_REDUCE_INPUT_RECORDS).increment(1L);
       context.write(key, NullWritable.get());
    }
}
1561707423325.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粉渠,一起剝皮案震驚了整個濱河市分冈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霸株,老刑警劉巖雕沉,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異去件,居然都是意外死亡坡椒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門尤溜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倔叼,“玉大人,你說我怎么就攤上這事宫莱≌稍埽” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵授霸,是天一觀的道長巡验。 經(jīng)常有香客問我,道長绝葡,這世上最難降的妖魔是什么深碱? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任腹鹉,我火速辦了婚禮藏畅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘功咒。我一直安慰自己愉阎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布力奋。 她就那樣靜靜地躺著榜旦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪景殷。 梳的紋絲不亂的頭發(fā)上溅呢,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音猿挚,去河邊找鬼咐旧。 笑死,一個胖子當(dāng)著我的面吹牛绩蜻,可吹牛的內(nèi)容都是我干的铣墨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼办绝,長吁一口氣:“原來是場噩夢啊……” “哼伊约!你這毒婦竟也來了姚淆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤屡律,失蹤者是張志新(化名)和其女友劉穎腌逢,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體超埋,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡上忍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纳本。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窍蓝。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖繁成,靈堂內(nèi)的尸體忽然破棺而出吓笙,到底是詐尸還是另有隱情,我是刑警寧澤巾腕,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布面睛,位于F島的核電站,受9級特大地震影響尊搬,放射性物質(zhì)發(fā)生泄漏叁鉴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一佛寿、第九天 我趴在偏房一處隱蔽的房頂上張望幌墓。 院中可真熱鬧,春花似錦冀泻、人聲如沸常侣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胳施。三九已至,卻和暖如春肢专,著一層夾襖步出監(jiān)牢的瞬間舞肆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工博杖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椿胯,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓欧募,卻偏偏與公主長得像压状,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容