博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从零开始学Hadoop——浅析MapReduce(二)
阅读量:4262 次
发布时间:2019-05-26

本文共 3058 字,大约阅读时间需要 10 分钟。

      上篇博客我们介绍了MapReduce的基本概念,并且对它的运行原理做了一些解析,今天我们来通过一个实际例子来深刻体会一下它的运行过程。

三、实例

      今天我们来做一个简单的统计。对只用空格将英文单词隔开的一些数据源,将所有单词出现的次数做一些统计。

1、数据源

hello tomhello jerryhello kittyhello worldhello tom

2、Map

      Map过程需要继承org.apache.hadoop.mapreduce包中的Mapper类,并重写map方法

      通过在map方法中添加两句把key值和value值输出到控制台的代码,可以发现map方法中的value值存储的是文本文件中的一行(以回车符作为行结束标记),而key值为该行的首字符相对于文本文件的首地址的偏移量。然后WCMapper 类将每一行拆分成一个个的单词,并将

public class WCMapper extends Mapper
{
@Override protected void map(LongWritable key, Text value,Mapper
.Context context) throws IOException, InterruptedException { //接收数据V1 String line=value.toString(); //切分数据 String[] words=line.split(" "); //循环 for (String w:words) { //出现一次,记作一个,输出 context.write(new Text(w), new LongWritable(1)); } }}

2、Reduce

      Reduce过程需要继承org.apache.hadoop.mapreduce包中的Reducer类,并重写reduce方法

      reduce方法的输入参数key为单个单词,而values是由各Mapper上对应单词的计数值所组成的列表,所以只要遍历values并求和,即可得到某个单词的出现总次数

public class WCReducer extends Reducer
{
@Override protected void reduce(Text key, Iterable
v2s,Reducer
.Context context) throws IOException, InterruptedException { //接收数据 //定义一个计算器 long counter=0; //循环v2s for (LongWritable i:v2s) { counter+=i.get(); } //输出 context.write(key,new LongWritable(counter)); }}

3、WordCount调用

      在MapReduce中,由Job对象负责管理和运行一个计算任务,并通过Job的一些方法对任务的参数进行相关的设置。此处设置了使用WCMapper完成Map过程和使用的WCReduce完成Combine和Reduce过程。还设置了Map过程和Reduce过程的输出类型:key的类型为Text,value的类型为LongWritable。任务的输入和输出路径则由命令行参数指定,并由FileInputFormat和FileOutputFormat分别设定。完成相应任务的参数设定后,即可调用job.waitForCompletion()方法执行任务

public class WordCount {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException{ //构建job对象 Job job=Job.getInstance(new Configuration()); //main方法所在的类 job.setJarByClass(WordCount.class); //设置Mapper相关属性 job.setMapperClass(WCMapper.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(LongWritable.class); FileInputFormat.setInputPaths(job, new Path("/words.txt")); //设置Reducer相关属性 job.setReducerClass(WCReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); FileOutputFormat.setOutputPath(job, new Path("/wcount.txt")); //提交任务 job.waitForCompletion(true); }}

4、解说

这里写图片描述

这里写图片描述

(1)将文件拆分成splits,由于测试用的文件较小,所以每一个文件为一个split,并将文件按行分割成
对,如图,这一步由Mapreduce框架自动完成,其中偏移量包括了回车所占的字符
(2)将分割好的
对交给用户定义的map方法进行处理,生成新的
(3)得到map方法输出的
对后,Mapper会将它们按照key值进行排序,并执行Combine过程,将key值相同的value值累加,得到Mapper的最终输出结果
(4)Reduce先对从Mapper接收的数据进行排序,再交由用户自定义的reduce方法进行处理,得到新的
对,并作为WordCount的输出结果

总结:

      至此,我们将Hadoop的两大核心学习完了,但是对我们来说,这只是刚刚开始,不过我们要打好基础,在之后的学习过程中去更加深入的研究。让我们一起准备迎接明天的挑战吧。

你可能感兴趣的文章
前端面试之手写一个bind方法
查看>>
浅析当下的 Node.js CommonJS 模块系统
查看>>
如何让 node 也支持从 url 加载一个 module?
查看>>
使用 HeadlessChrome 来测试 WebRTC 应用
查看>>
从输入URL到页面加载的过程?如何由一道题完善自己的前端知识体系!
查看>>
想象一双结实而富有弹性的大腿:理解 Flexbox 布局
查看>>
GraphQL 初探—面向未来 API 及其生态圈
查看>>
使用 CSS Houdini 绘制平滑圆角
查看>>
聊聊Vue.js的template编译
查看>>
Vue源码阅读连载之响应式设计
查看>>
CSS布局 -- 圣杯布局 & 双飞翼布局
查看>>
产生随机数
查看>>
android 操作系统
查看>>
button事件的两种处理方法
查看>>
android 震动
查看>>
【数据结构与算法】(四) c 语言静态队列的简单实现
查看>>
[linux] unix domain socket 例子
查看>>
[linux] c 实现简单的web服务器
查看>>
栈--判断回文字符串
查看>>
解决 The `master` repo requires CocoaPods 1.0.0 - (currently using 0.39.0)
查看>>