MapReduce的应用开发与编程模型详细进阶概述

!!!学习之前请回顾一下之前的菜鸟基础介绍

https://blog.csdn.net/weixin_42507474/article/details/107055643

首先我们 复习一下什么是MapReduce:是Google的一个编程模型,采用并行计算的处理方式来进行大数据量的计算

**MapReduce拥有“分散任务、汇总结果”的特点,及把对大规模数据集的操作,分发给主节点管理下的各个子节点共同完成,然后整合各个子节点的中间结果,从而得到最终的计算结果。**这以特点有效的更简洁的让程序员的程序 运行在分布式系统下。

顺便介绍一下MapReduce的特点方便我们以后更加的能了解它

  1. 易于编程
  2. 良好的扩展性
  3. 高容错性
  4. 能对PB以上海量数据进行离线处理
    了解好MapReduce的特点才能更加深刻的认识这一知识点

记住这些特点后记住MapReduce并不是万能的,在一下场景中它并不擅长。

  1. 实时计算,因为MapReduce无法像Mysql一样,在毫秒或者秒级内返回结果
  2. 流式计算,流式计算的输入数据是动态的,而MapReduce输入数据集是静态的,故而不适用。
  3. DAG有向图计算,如果MapReduce使用其后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,降低使用性能。这是因为多个应用程序存在依赖关系。

ok,接下来进入我们对MapReduce的详细了解。

一、MapReduce的编程模型

1.模型概述
MapReduce由两个阶段组成:Map和Reduce。用户只需编写Map和Reduce两个函数。
map()函数以key/value对作为输入,产生另外一系列key/value对作为中间输出写入本地磁盘。MapReduce框架会自动将这些中甲数据按照key值进行聚集,且key值相同(默认是对key值进行哈希取模)的数据被同一交给Reduce()函数处理
Reduce函数以key及对应的value列表作为输入,经合并key相同的value值后,产生另外一系列key/value对作为最终输出写入HDFS。

Map阶段
1)由一定数量的Map Task 组成
2)输入数据格式解析:InputFormat(把输入文件分片)
3)输入数据处理:Mapper
4)数据分组:Partitioner
Reduce阶段
1)由一定数量的Redyce Task组成
2)数据远程拷贝:从Map Task 的输出拷贝部分数据
3)数据按照key排序和分组(key相同的都放在一起)
4)数据处理:Reducer
5)数据输出格式:OutputFormat(输出文件格式、分隔符等的设置)
一张图介绍MapReduce
在这里插入图片描述
编程模型三步曲
1)Input:一系列K1/V1对
2)Map和Reduce:Map:(K1,V1)->list(K2,v2),Reduce:(K2,list(v2))->list(k3,v3)[K2和V2是中间结果对]
3)Output:一系列(K3,v3) 对。

二、MapReduce的编程实例

学习理论知识是不能够足以支撑我们对MapReduce进行足够的了解的,我们要带着MapReduce的原理去通过实例来深入理解MapReduce的原理!
现在我们使用MapReduce来实现词频统计。
1.WordCount实现设计分析
1)Map过程:并行读取文本,对读取的单词进行map操作 ,每个词都已<key,value>形式生成。
读取第一行 Hello World Bye World,分割单词形成Map
<Hello,1><World,1><Bye,1><World,1>
读取第二行Hello Hadoop Bye Hadoop,分割单词形成Map
<Hello,1><Hadpp[,1><Bye,1><Hadoop,1>
读取第三行 Bye Hadoop Hello Hadoop,分割单词形成Map
<Bye,1><Hadoop,1><Hello,1><Hadoop,1>

2)Reduce操作是对map的结果进行排序合并,最后得出词频
reduce将形成的Map根据相同的key组合成value数组。<Bye,1,1,1><Hadoop,1,1,1,1><Hello,1,1,1><World,1,1>循环执行Reduce(k,v[]),分别统计每个单词出现的个数。即有结果如下:<Bye,3>,<Hadoop,4>,<Hello,3>,<World,2>

2.代码开发与设计实现
1)首先新建工程,添加maven依赖:hadoop-commen、hadoop-hdfs、hadoop-mapreduce-client-core
2)开始进行代码的完成。
详情代码请见:

https://blog.csdn.net/weixin_42507474/article/details/107055643

该案例代码说明:
1)对于map函数的方法
继承Mapper类,实现reduce方法,这里有3个参数,前面两个参数Object key、Text value口试输入的key和value,第三个参数Context context记录的是整个上下文,我们可以通过context将数据写出去。
2)对于reduce函数的方法
继承Reducer类,实现reduce方法,reduce函数的输入也是一个key/value的形式,不过他的value是迭代器的形式Iterablevalues,也就是说reduce的输入是一个key对应一组value,reduce也有context参数,和map的context参数作用一致。
3)对于main函数的调用
创建Configuration类:
Configuration conf = new Configuration
运行MapReduce之前都要初始化Configuration类,该类主要是读取MapReduce的系统配置信息
创建Job类:

Job job = Job.getInstance(conf,"word count");
job.setJarByClass(WordCount.class);
jon.setMapperClass(TokenizerMapper,class);
job.setReducerClass(IntSumReducer.class);

第一行构建一个job,有两个参数,一个是conf,另一个是job这个名称。第二行设置我们自己开发的MapReduce类。第三行和第四行设置map函数和reduce函数实现类。
设置输出的key/value类型:

job.setOutputKeyClass(Text.class);
jon.setOutputValueClass(IntWritable.class);

这里是定义输出的key/value的类型,也就是最终存储在HDFS的结果文件中的key/value类型。

设置Job的输入输出路径并提交到集群运行
FileInpurFormat.addInputPath(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1]);
System.exit(job.waitForCompletion(true)?0:1);
第一行构建输入的数据库文件,第二行构建输出的数据文件,最后一行表示如果job运行成功了,我们的程序就会退出。

三、MapReduce的应用开发

1)MapReudce输入/输出类型
类型概述:使用Hadoop中的MapReduce编程模型非常简单,只需要定义好map和reduce函数的输入和输出key/value对的类型即可。那么各种数据类型是如何在MapReduce中使用的。
MapReduce中的map和reduce函数需要遵循如下的格式:

map:(k1,v1)->list(l2,v2)
reduce:(k2,list(v2))–>llist(k3,v3)

可以看出reduce函数的输入类型需要与map函数的输出类型一致

2)MapReduce中常用的设置

  1. 输入数据类型由输入格式(InputFormat)设置
  2. map的输出的key的类型通过setMapOuputKeyClass设置,value的类型通过setMapOuputValueClass设置
  3. reduce的输出的Key的类型通过setOuputKeyClass设置,Value的类型通过setOuputValueClass设置

说了其中的常用设置,是不是都不知道什么是InputFormat?别急,接下来我们就来看看输入格式与输出格式。

四、MapReduce输入格式与输出格式

由MapReduce处理的输入文件是存储在HDFS上的,这些文件的格式是任意的:可以使用基于行的日志文件,可以使用二进制格式,多行输入记录或者其他一行格式。所以这些文件一般都会达到数十GB大,所以我们即将认知的就是来解决这一问题的。
MapReduce输出格式
1.InputFormat接口
这一接口决定了输入文件如何被Hadoop分块。他能够从一个job中得到split集合,然后再为这个split集合配上一个适合的RecordReader来读取split中的数据
。可以看一下这一接口的源码更好的了解他的工作原理,里面的两个方法一个是分片,一个用来将键值从InputSplit中正确读出。看一下这一接口的图片解析。
在这里插入图片描述
一般接口实现类有一下常用实用类:
1)FileInputFormat是所有使用文件作为数据源的InputFormat实现的基类主要作用是指出作业的输入文件位置
2)KeyValueTextInputFormat:每一行均为一条记录,被分隔符分割为key(Text),value(Text)。

MapReduce输出格式
1.OutputFormat接口:
主要用于买书输出数据的格式,它能够将用户提供的key/value对写入特定格式的文件中通过OutputFormat接口,也可以实现具体的输出格式,但过程复杂没有必要
2.OutputFormat实现类常用有
1)文本输出
默认的输出格式是TextOutputFormat,把每天记录写为文本行利用他的键和值可以实现任意Writable的任意类型
2)二进制输出
SequenceFileOutputFormat将它的输出写为一个顺序文件。

在这里,我们大概就是对MapReduce基本上有了一个比较深入的了解。以后接下来我们会对MapReduce的Combiner等时候来进行详细的讲解。

猜你喜欢

转载自blog.csdn.net/weixin_42507474/article/details/107336634