首页 > 应用 > 软件技巧 > 正文

MapReduce 入门之一步步自实现词频统计功能的教程

2024-07-16 17:44:36
字体:
来源:转载
供稿:网友

笔记中提供了大量的代码示例,需要说明的是,大部分代码示例都是本人所敲代码并进行测试,不足之处,请大家指正~

LZ 本来想先仔细写一写 Hadoop 伪分布式的部署安装,然后介绍一些 HDFS 的内容再来介绍 MapReduce,是在是没有抽出空,今天就简单入门一下 MapReduce 吧。

一、MapReduce 概述

1.MapReduce 是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.

2.MapReduce 由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算

二、具体实现

1.先来看一下 Eclipse 中此应用的包结构

2.创建 map 的任务处理类:WCMapper

 

/* * 1.Mapper 类的四个泛型中,前两个指定 mapper 输入数据的类型,后两个指定 mapper 输出数据的类型 *   KEYIN 是输入的 key 的类型,VALUEIN 是输入的 value 的类型 *   KEYOUT 是输出的 key 的类型,VALUEOUT 是输出的 value 的类型 * 2.map 和 reduce 的数据的输入输出都是以 key-value 对的形式封装的 * 3.默认情况下,框架传递给我们的 mapper 的输入数据中,key 是要处理的文本中一行的起始偏移量,为 Long 类型, * 这一行的内容为 value,为 String 类型的  * 4.后两个泛型的赋值需要我们结合实际情况 * 5.为了在网络中传输时序列化更高效,Hadoop 把 Java 中的 Long 封装为 LongWritable, 把 String 封装为 Text */public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable> {        //重写 Mapper 中的 map 方法,MapReduce 框架每读一行数据就调用一次此方法    @Override    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {        //书写具体的业务逻辑,业务要处理的数据已经被框架传递进来,就是方法的参数中的 key 和 value        //key 是这一行数据的起始偏移量,value 是这一行的文本内容                //1.将 Text 类型的一行的内容转为 String 类型        String line = value.toString();                //2.使用 StringUtils 以空格切分字符串,返回 String[]        String[] words = StringUtils.split(line, " ");                //3.循环遍历 String[],调用 context 的 writer()方法,输出为 key-value 对的形式        //key:单词   value:1        for(String word : words) {            context.write(new Text(word), new LongWritable(1));        }            }}

2.创建 reduce 的任务处理类:WCReducer:

 

/* * 1.Reducer 类的四个泛型中,前两个输入要与 Mapper 的输出相对应。输出需要联系具体情况自定义 */public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable> {        //框架在 map 处理完之后,将所有的 kv 对缓存起来,进行分组,然后传递一个分组(<key,{values}>,例如:<"hello",{1,1,1,1}>),    //调用此方法    @Override    protected void reduce(Text key, Iterable<LongWritable> values, Context context)throws IOException, InterruptedException {                //1.定义一个计数器        long count = 0;                //2.遍历 values的 list,进行累加求和        for(LongWritable value : values) {            //使用 LongWritable 的 get() 方法,可以将 一个 LongWritable 类型转为 Long 类型            count += value.get();        }                //3.输出这一个单词的统计结果        context.write(key, new LongWritable(count));    }}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表