本文我们从一个简单的实例出发,统计文本中不同单词出现的次数,来讲述 MapReduce 的执行流程。

考虑如下的文本信息(文件名为hello):

hello you
hello me

MapReduce 工作流程

  • (1) [K1, V1]:将输入文本的每一行,解析成一个 key、value 对

    键:当前文本行的首地址,则第一行的首地址为0,则第二行的首地址为10(第一行的换行也站一个字节)。

    值:当前文本行文本 内容。

    第一步解析为:[0, hello you]、[10, hello me]

    每一个键值对调用一次 Map 函数,则就会调用两次 Map 函数

  • (2)Map:[K1, V1] ⇒ [K2, V2]

    Map 函数接受的是每一行的文本信息,它无法获取所有行的内容,自然它处理的也是一个单独的文本行的内容,对本例而言也即统计当前行中单词出现的次数;

    public void map(K, V, ctx){String[] splited = v.split("\t");for (String word: splited){ctx.write(<word, 1>);// 向上下文中写数据}
    }

    本例而言:<hello, 1>, <you, 1>, <hello, 1>, <me, 1>

  • (3)默认为1个分区

  • (4)先排序再分组,将相同 key (实现了 Comparable 接口的 compareTo 方法)的不同 values 置于一个集合中

    先排序:<hello, 1>, <hello, 1>, <me, 1>, <you, 1>
    分组:<hello, {1, 1}>, <me, 1>, <you, 1>

  • (5)规约

  • (6)拷贝到 Reducer 所在的节点

    属于框架的工作;

  • (7)Reduce

    本例而言,reduce被调用三次;

    public void reduce(K, Vs, ctx){ctx.write(K, Vs.size());
    }
  • (8)保存结果

    <hello, 2>, <me, 1>, <you, 1>

如何以 MapReduce 的思维处理业务

  • (1)在MapReduce中流转的是键值对

    input ⇒ <K1, V1> ⇒ <K2, V2> ⇒ <K2, V2s> ⇒ <K3, V3>

  • (2)客户输入的文本信息提供了<K1, V1>,客户的要求给定了<K3, V3><K2、V2>在 Map 产生,在 Reduce 步被消灭)

  • (3)使用 MapReduce 的核心就在于确定<K2, V2>,如何确定K2, V2呢:

    • (1)分组:把相同 key 的 values 放在一起
    • (2)Reduce 函数

代码实现

package mr;import java.io.IOException;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;public class WordCount {static class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>{@Overrideprotected void map(LongWritable k1, Text v1,Mapper<LongWritable, Text, Text, LongWritable>.Context ctx)throws IOException, InterruptedException {String[] splits = v1.toString().split(" ");for (String word: splits)ctx.write(new Text(word),  new LongWritable(1L));}} static class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable>{@Overrideprotected void reduce(Text k2, Iterable<LongWritable> v2s,Reducer<Text, LongWritable, Text, LongWritable>.Context ctx)throws IOException, InterruptedException {long cnt = 0L;for (LongWritable v2 : v2s) {cnt += v2.get();}ctx.write(k2, new LongWritable(cnt));}}private static final String INPUT_PATH = "hdfs://hadoop0:9000/hello";private static final String OUTPUI_PATH = "hdfs://hadoop0:9000/hello_res";public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = new Job(conf, WordCount.class.getSimpleName());// step 1: 输入   ==> <K1, V1>// 向任务传递输入文件FileInputFormat.setInputPaths(job, INPUT_PATH);// 指定对输入文件进行格式化处理的类job.setInputFormatClass(TextInputFormat.class);// 注意:FileInputFormat TextInputFormat 包的选择// 步骤可省// step 2: <K1, V1> ==> <K2, V2>job.setMapperClass(MyMapper.class);// 指定map输出的<K, V>类型,如果<K3, V3> 与 <K2, V2>的类型一致,以下的两个设置也是可省的job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(LongWritable.class);// step 3: 分区job.setPartitionerClass(HashPartitioner.class);job.setNumReduceTasks(1);// 以上两个设置均可省略// 也即以上两个操作都是默认操作// step 4: 排序、分组// step 5:规约// step 2.1// step 2.2:指定自定义Reducer类job.setReducerClass(MyReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(LongWritable.class);// step 2.3: 指定输出路径FileOutputFormat.setOutputPath(job, new Path(OUTPUI_PATH));// 指定对输出结果进行格式化处理的类job.setOutputFormatClass(TextOutputFormat.class);// 此步可省// 将作业提交给 JobTrackerjob.waitForCompletion(true);}
}

在启动hadoop的之后,运行该程序时,可能会报权限异常,将 FileUtil 解压拷贝到当前目录再次运行即顺利执行。

WordCount——MapReduce 实例入门相关推荐

  1. 学习笔记Hadoop(十四)—— MapReduce开发入门(2)—— MapReduce API介绍、MapReduce实例

    四.MapReduce API介绍 一般MapReduce都是由Mapper, Reducer 及main 函数组成. Mapper程序一般完成键值对映射操作; Reducer 程序一般完成键值对聚合 ...

  2. 大数据之hadoop伪集群搭建与MapReduce编程入门

    一.理论知识预热 一句话介绍hadoop: Hadoop的核心由分布式文件系统HDFS与Map/Reduce计算模型组成. (1)HDFS分布式文件系统 HDFS由三个角色构成: 1)NameNode ...

  3. Hadoop环境搭建测试以及MapReduce实例实现

    目录 1 任务 2 过程 2.1 熟悉常用的 Hadoop 命令 2.2 Hadoop环境搭建 1.SSH登录权限设置 2.安装Java环境 3.Hadoop的安装 4.伪分布式安装配置 2.3 Wo ...

  4. Hadoop之mapreduce 实例三

    Hadoop之mapreduce 实例三 转载于:https://www.cnblogs.com/chaoren399/archive/2013/01/04/2844503.html

  5. 微信公众平台开发教程(四) 实例入门:机器人(附源码)

    微信公众平台开发教程(四) 实例入门:机器人(附源码) 上一篇文章,写了基本框架,可能很多人会觉得晕头转向,这里提供一个简单的例子来予以说明,希望能帮你解开谜团. 一.功能介绍 通过微信公众平台实现在 ...

  6. 单片机独立式按键c语言程序,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询)...

    (原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询) /************************************************************ ...

  7. 《Hadoop MapReduce实战手册》一1.4 给WordCount MapReduce程序增加combiner步骤

    本节书摘来异步社区<Hadoop MapReduce实战手册>一书中的第1章,第1.4节,作者: [美]Srinath Perera , Thilina Gunarathne 译者: 杨卓 ...

  8. 矩阵键盘逐行扫描C语言,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法).pdf...

    (原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法).pdf /***************************************************** ...

  9. pygame游戏实例入门

    pygame游戏实例入门 开发环境 第三方库安装 任务介绍 大概实现思路 具体实现流程 游戏背景界面 猴子类 猴子类编写 猴子类运行 香蕉类 香蕉类编写 香蕉类运行 综合编写及碰撞检测 总结 开发环境 ...

最新文章

  1. 用Leangoo管理你的项目
  2. mysql中拼接用什么_MySQL中常用的拼接语句的小结(代码示例)
  3. 美国-5大牛校--8条小牛--14好校--18很不错的大学
  4. Arduino数字引脚作为GPIO的使用
  5. 如何读取服务器的文件夹大小,请教如何获取outlook文件夹对话框中服务器数据大小?...
  6. Windows API的时间结构体、时间转换及时间获取
  7. 随便说说---java初级学习路线
  8. @PostConstruct注解学习,最详细的分享教程
  9. rdd分片 spark_Spark分区
  10. java id自增_Java分布式自增长ID实现方案
  11. cortana 无法使用_如何使用Cortana创建和编辑列表(并将它们与Wunderlist同步)
  12. 基于FPGA的帧差法仿真实现
  13. w10安装ubuntu_记 Win10 + Ubuntu 双系统安装
  14. 解除微信授权的html5网页,微信授权登录网页管理在哪里看?如何取消授权
  15. 采用Windows PowerShell运行conda activate xx出现 C:\Users\xxx\Documents\WindowsPowerShell\profile.ps1报错问题
  16. Parameterize Method (令函数携带参数)
  17. 转:陈佩斯曝光春晚背后种种肮脏行径
  18. 解决AMD Software提示图形驱动版本不匹配问题
  19. MyBatis SSM
  20. lombok小辣椒的使用

热门文章

  1. win10基于anaconda下的tensorflow2.0.0及cuda10.0、cudnn安装成功
  2. Linux下性能压测工具WRK,性能测试神器 wrk 使用教程
  3. Python之 类属性和类方法
  4. Mysql集群拆分_MySQL 5.7跨集群拆分迁移
  5. 为什么普通红包自己不能领_为什么窗帘不能用洗衣机洗呢?千万别让窗帘砸在自己手里!...
  6. 西安石油大学计算机学院于晓,西安石油大学计算机学院2009届本科毕业设计答辩.doc...
  7. php如何修改xml中的数据,php如何修改xml内容
  8. Java动态规划求最长公共子序列(LCS)
  9. 探索软件设计模式(二)
  10. (5)【整合】基于机器学习的酒店评论文本倾向性分析