1.MapReduce简介
MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop集群上。
一个完整的mapreduce程序在分布式运行时有三类实例进程:
MRAppMaster 负责整个程序的过程调度及状态协调
MapTask 负责map阶段的整个数据处理流程
ReduceTask 负责reduce阶段的整个数据处理流程
2.MapReduce核心编程思想

1)分布式的运算程序往往需要分成至少2个阶段。
2)第一个阶段的maptask并发实例,完全并行运行,互不相干。
3)第二个阶段的reduce task并发实例互不相干,但是他们的数据依赖于上一个阶段的所有maptask并发实例的输出。
4)MapReduce编程模型只能包含一个map阶段和一个reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个mapreduce程序,串行运行。
3.MapReduce编程规范

用户需要编写的代码分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端)
1)Mapper阶段
(1)用户自定义的Mapper要继承自己的父类
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3)Mapper中的业务逻辑写在map()方法中
(4)Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5)map()方法(maptask进程)对每一个<K,V>调用一次

2)Reducer阶段
(1)用户自定义的Reducer要继承自己的父类
(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(3)Reducer的业务逻辑写在reduce()方法中
(4)Reducetask进程对每一组相同k的<k,v>组调用一次reduce()方法
3)Driver阶段
整个程序需要一个Drvier来进行提交,提交的是一个描述了各种必要信息的job对象
4.实操案例
需求:统计某个文本文件中每个单词出现的次数并输出到文件
4.1编写Mapper类

public class WordCountMapper extends Mapper<LongWritable,Text,Text,LongWritable> {@Overridepublic void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();String[] split = line.split(",");for (String word : split) {context.write(new Text(word),new LongWritable(1));}}
}

4.2编写Reduce类


public class WordCountReducer extends Reducer<Text,LongWritable,Text,LongWritable> {/*** 自定义我们的reduce逻辑* 所有的key都是我们的单词,所有的values都是我们单词出现的次数* @param key* @param values* @param context* @throws IOException* @throws InterruptedException*/@Overrideprotected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {long count = 0;for (LongWritable value : values) {count += value.get();}context.write(key,new LongWritable(count));}
}

4.3编写Driver类即是主方法main的类

public class JobMain extends Configured implements Tool {@Overridepublic int run(String[] args) throws Exception {Job job = Job.getInstance(super.getConf(), JobMain.class.getSimpleName());//打包到集群上面运行时候,必须要添加以下配置,指定程序的main函数job.setJarByClass(JobMain.class);//第一步:读取输入文件解析成key,value对job.setInputFormatClass(TextInputFormat.class);TextInputFormat.addInputPath(job,new Path("hdfs://node1:8020/wordcount"));//第二步:设置我们的mapper类job.setMapperClass(WordCountMapper.class);//设置我们map阶段完成之后的输出类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(LongWritable.class);//第三步,第四步,第五步,第六步,省略//第七步:设置我们的reduce类job.setReducerClass(WordCountReducer.class);//设置我们reduce阶段完成之后的输出类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(LongWritable.class);//第八步:设置输出类以及输出路径job.setOutputFormatClass(TextOutputFormat.class);TextOutputFormat.setOutputPath(job,new Path("hdfs://node1:8020/wordcount_out"));boolean b = job.waitForCompletion(true);return b?0:1;}/*** 程序main函数的入口类* @param args* @throws Exception*/public static void main(String[] args) throws Exception {Configuration configuration = new Configuration();Tool tool  =  new JobMain();int run = ToolRunner.run(configuration, tool, args);System.exit(run);}
}

关于这个最后的主类还有另外一种写法

public class WordMain {public static void main(String[] args) throws IOException,ClassNotFoundException,InterruptedException {args = new String[]{"E:\\mapreduce\\hello.txt","E:\\mapreduce\\20200712"};Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(WordMain.class);job.setMapperClass(WordCountMapper.class);job.setReducerClass(WordCountReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(LongWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(LongWritable.class);FileInputFormat.setInputPaths(job,new Path(args[0]));FileOutputFormat.setOutputPath(job,new Path(args[1]));job.waitForCompletion(true);}
}

两种方式任君选择,需要注意的是输出路径一定不能存在否则会报错的。其实也很好理解。毕竟这是要在集群中运行的如果两个不同的mapreduce任务输出路径是同一个那么结果就无法分清楚了。关于基本的MapReduce就介绍到这里,后续的省略的第3456步会在后面文章中更新的。

MapReduce编程模型相关推荐

  1. [转]Hadoop集群_WordCount运行详解--MapReduce编程模型

    Hadoop集群_WordCount运行详解--MapReduce编程模型 下面这篇文章写得非常好,有利于初学mapreduce的入门 http://www.nosqldb.cn/1369099810 ...

  2. Hadoop MapReduce编程模型

    MapReduce编程模型 目录 MapReduce编程模型 1.MapReduce编程模型简介 2.什么是MapReduce 3.MapReduce的优缺点 4.MapReduce程序设计方法 5. ...

  3. mapreduce 编程模型

    MapReduce是在总结大量应用的共同特点的基础上抽象出来的分布式计算框架,它适用的应用场景往往具有一个共同的特点:任务可被分解成相互独立的子问题.基于该特点,MapReduce编程模型给出了其分布 ...

  4. 大数据快速入门(05):MapReduce 编程模型赏析

    一.Hadoop 诞生的传奇故事 (上图是 Doug Cutting,hadoop 之父) 1985年,Cutting 毕业于美国斯坦福大学. Cutting 的第一份工作是在 Xerox 做实习生, ...

  5. 一个wordcount程序轻松玩转MapReduce编程模型

    可以毫不夸张的说,几乎开发中绝大部分的MR程序都是基于wordcount编程模型而来,或者说用wordcount变化而来(改变的主要是业务方面的逻辑).所以,熟练掌握wordcount编程模型,是掌握 ...

  6. Mapreduce编程模型(一)

    1.1Mapreduce模型简介 Mapreduce是一种可用于数据处理的编程模型,Hadoop上可以运行各种语言版本的Mapreduce程序.Mapreduce程序是并行运行的,采用了分治的思想.编 ...

  7. Mapreduce编程模型基础

    一.Mapreduce概述 Hadoop MapReduce 是一个分布式计算框架,用于编写批处理应用程序.编写好的程序可以提交到Hadoop集群上用于并行处理大规模的数据集. MapReduce 作 ...

  8. MapReduce编程模型详解

    1.1 MapReduce是什么 Hadoop MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的,具有容错能力的 ...

  9. Map-Reduce编程模型gif图片解释

    2019独角兽企业重金招聘Python工程师标准>>> 原文地址 5-algorithms-widely-industry/ http://en.docsity.com/news/a ...

最新文章

  1. python 无头模式 绕过检测_Python chrome 无头模式的问题
  2. 2020年人工神经网络第二次作业-参考答案第二题
  3. 介绍一位高级数据分析师,告诉你数据分析原来这么好玩
  4. 如何做带宽估计和丢包策略
  5. windows事件id大全_技术转载 || springboot+redis做过期事件通知业务
  6. 用php的for循环画椭圆,如何快速简单的使用css3画出各种各样的椭圆
  7. postgres建表
  8. 联想a500手机驱动_一块砖也敢刷:联想手机A368T刷了三次才重新进入系统
  9. asp.net—单例模式
  10. 文件存储形式的通讯录
  11. 灵格斯怎么屏幕取词_灵格斯词霸(Lingoes)基础使用教程
  12. R软件中调用windows字体二
  13. 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(二)
  14. 重启 WMI 服务。
  15. C语言试题106之有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
  16. 基于SpringBoot + Vue的个人博客系统16——文章的修改和删除
  17. TLC2543和mini2440通信的速率
  18. Xamarin效果第二十三篇之离线语音识别
  19. c语言程序代码应缩进几格,汉诺塔c语言程序代码
  20. 转贴点关于娜娜的文章

热门文章

  1. PDF转Word工具PySidePDF开源
  2. 夏日艳阳+高岸深谷,Share Creators最新手机壁纸来了
  3. Go指南练习之《图片》(Images)
  4. 保留两位小数有右对齐c语言,[理学]3 C语言 第三章顺序控制语句.ppt
  5. 背景图片蒙版和头像圆形效果
  6. html表格空格符是什么,HTML中的空格符号是什么
  7. 《我学区块链》—— 十九、以太坊安全之 以太坊浏览器Mist漏洞
  8. promis取值问题 --- 通过.then
  9. HDU5556 Land of Farms 最大独立集
  10. SQLSERVER 查看当前用户 应用 及IP