例题详解MapReduce过程

本文深入解析MapReduce的Map、Partition、Combine和Reduce过程,通过示例阐述如何利用Combiner提升效率,并介绍一个计算单词平均长度的任务,包括分区依据、组合操作以及Reduce的最终计算。
摘要由CSDN通过智能技术生成

1、概述

MapReduce程序主要可分为三部分,即:mapper、reducer、driver(即main函数提交作业部分),根据需求不同可以设置partitioner、combinner以及cleanup部分。后三部分作用分别描述如下:

  • mapper:实现从输入文件中以(key,value)的形式获取想要提取的数据;

  • reducer:实现将mapper的输出结果汇总、归并;

  • driver:负责作业设置、作业提交;

  • partitioner:实现将Map阶段的输出结果按指定的方法分到不同的分区中,为reduce阶段做准备。若没有自定义分区方法,则会启动默认的partitioner,它根据ReduceTask的数量将Map的结果进行分区;

  • combinner:在进入reduce之前对map的输出结果进行组合,例如:在执行Word Count程序时,map端输出结果有100万个(hello,1)的key/value对;若将其直接传到reduce端,需要传输100万次,当这个reduce在另一台服务器时需要消耗大量的网络带宽资源,运行效率不高;但是,若将这100万个(hello,1)组合成(hello,1000000)传到reduce端,则只需要传递1次,可以大大地提升效率;

  • cleanup:Mapper类与Reducer类中都包含了这个方法,该方法在MapReduce程序执行过程中只运行一次,实现Mapper/Reducer类的清尾工作。

这里写图片描述

2、任务描述

假设输入文本中有若干个单词,要求对文本中的单词求平均长度(单词的长度=字符数)

  • map输出时,判断单词的首字符是否是字母,如果不是,则不输出;

  • partition按照单词的首字母进行分区, 这样就可以得到26个分区;

  • combine内求每个单词的次数和(map端的输出结果求和);

  • 定义26个reduce,reduce0只接收以字母a开头的单词,reduce1只接受以字母b开头的单词;educe内求总长和总次数(每个单词的总长=该单词长度*该单词次数),总长=每个单词的总长和,总次数=每个单词的次数和

  • reduce的cleanup中:reduce输出平均长度=总长/总次数
    这样,得到了26个结果文件,每个文件里只有一个数,即以某字母开头的单词的平均长度。

3、详细代码

3.1 Map端函数

public static class MapClass extends Mapper<LongWritable, Text, Text, IntWritable>
  {
    private 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值