MapReduce原理及编程(含词频统计编程实例)

1、MapReduce基础

1.1 什么是MapReduce

  • 是一个分布式计算框架,它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务
  • 适用于大规模数据处理场景:每个节点处理存储在该节点的数据(移动数据不如移动计算)
  • 每个job包含Map和Reduce两部分

1.2 MapReduce的设计思想

  • 分而治之:简化并行计算的编程模型
  • 构建抽象模型map和reduce:开发人员专注于实现Mapper和Reducer函数
  • 隐藏系统层细节:开发人员专注于业务逻辑实现

1.3 MapReduce特点

  • 优点
    • 易于编程
    • 可扩展性
    • 高容错性
    • 高吞吐量
  • 不适用领域
    • 难以实时计算
    • 不适合流式计算
    • 不适合DAG(有向图)计算

2、MapReduce编程规范

需要重点明确两点:

  • 1.一个记录调用一次 map()方法。
  • 2.相同的 key 调用一次 reduce()方法。

用户编写的程序分成三个部分:Mapper、Reducer和Driver

  • Mapper
    • MapReduce框架处理的数据格式是<K,V>键值对形式
    • Map端接收<K,V>键值对数据,经过处理输出新的<K,V>键值对
    • Map端处理逻辑写在Mapper类中的map()方法中
  • Reducer
    • Reduce端搜集多个Mapper端输出的<K,V>数据,进行汇总
    • Reducer的业务逻辑写在reduce()方法中
    • 每一组相同k的<k,Iterator>组调用一次reduce()方法
  • Driver
    • 整个程序需要编写一个Driver来进行提交
    • 将自定义Mapper和Reducer类组合成一个job,并提交job对象

MapReduce编程三部曲

  • 输入Input。MapReduce输入一系列k1/v1。

  • Map和Reduce阶段:

    map: (k1,v1) → list (k2,v2)
    reduce: (k2,list(v2)) → list (k3,v3)
    其中k2/v2是中间结果对。

  • 输出Output:MapReduce输出一系列k2/v3

3、MapReduce词频统计编程实例

在这里插入图片描述

需求:使用MapReduce编程完成词频统计,文档内容如下:

Hello Hadoop BigData
Hello Hadoop MapReduce
Hello Hadoop HDFS
BigData Perfect

步骤:
1、编写Java代码(包括Mapper、Reducer、Job)
2、将java代码打包上传至Linux系统执行

hadoop jar WCMR.jar cn.kgc.WCDriver /user/data  /user/out
# WCMR.jar:指定jar包
# cn.kgc.WCDriver:指定Job
# /user/data:输入路径
# /user/out:输出路径

拓展:常用的数据类型对应的 hadoop 数据序列化类型

Java 类型 Hadoop Writable 类型
boolean BooleanWritable
byte ByteWritable
int IntWritable
float FloatWritable
long LongWritable
double DoubleWritable
string Text
map MapWritable
array ArrayWritable

3.1 新建maven工程,添加pom文件依赖关系

版本号根据需求填写,代码如下:

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.6.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.6.0</version>
  
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编程实现基本的词频统计数据处理可以使用MapReduce框架来实现。对于两个输入文件,即文件a和文件b,可以按照以下步骤编写mapred程序: 1. 首先,需要编写一个Mapper类,该类继承自Hadoop的Mapper类。在Mapper类中,我们需要重写map方法。在该方法中,将文件a和文件b的内容分割成单词,并将每个单词作为键,将出现的次数作为值进行输出。 2. 接下来,需要编写一个Reducer类,该类继承自Hadoop的Reducer类。在Reducer类中,我们需要重写reduce方法。在该方法中,将相同的单词进行合并,并计算出现的总次数。 3. 在main方法中,我们需要设置job的各种参数,如输入路径、输出路径、Mapper类和Reducer类等。 4. 最后,运行该程序,即可得到基本的词频统计结果。 下面是一个简单的示例代码: ```java import java.io.IOException; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; 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.output.FileOutputFormat; public class WordCount { public static class WordCountMapper extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context) throws IOException, InterruptedException { String[] words = value.toString().split(" "); // 分割单词 for (String word : words) { this.word.set(word); context.write(this.word, one); // 输出键值对:(单词, 1) } } } public static class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException { int sum = 0; for(IntWritable val : values) { sum += val.get(); // 计算词频总和 } result.set(sum); context.write(key, result); // 输出结果:(单词, 词频总和) } } public static void main(String[] args) throws Exception{ Job job = Job.getInstance(); job.setJarByClass(WordCount.class); job.setMapperClass(WordCountMapper.class); job.setCombinerClass(WordCountReducer.class); // 设置Combiner类,可以减少网络传输 job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); // 输入路径 FileOutputFormat.setOutputPath(job, new Path(args[1])); // 输出路径 System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` 以上是一个简单的基本词频统计MapReduce程序的示例代码,可以根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值