vlambda博客
学习文章列表

大数据学习笔记—MapReduce

MapReduce是一个分布式运算程序的编程框架。核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式程序。


*分布式程序核心思想

例如,做一个大数据量多文本档的每个单词的个数统计,分为多步骤。首先,将文档存到的block进行分别统计计算,再将计算结果进行分配汇总计算。

注:MapReduce变成模型只能包含一个map阶段和Reduce阶段,如果业务的逻辑非常复杂,那就只能用多个MapReuduce程序,串行运行

*提出问题

1、map task如何进行任务分配?

2、reduce task如何分配要处理的任务

3、maptask和reducetask之间如何衔接?

4、如果maptask运行失败,如何处理?

5、maptask如果都要自己负责输出分区,很麻烦

*提出解决

引入一个主管 MapReduce Application Master,负责调度整个流转过程。


*wordcount实现逻辑及代码实现

用户编写的程序分为三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端),用户自定义的 Mapper,Reducer都需要继承各自的父类。

1、Mapper

  • 输入输出参数为KeyValue对(KV的类型可自定义)

  1. KEYIN:

    默认情况下,是mr框架独到的一行文本的偏移量,Long类型。

    但是文件传输需要序列化传输,在hadoop中有更精简的序列化接口,所以不直接使用Long,而是用org.apache.hadoop.io.LongWritable

  2. VALUEIN:默认情况下,是mr框架所读到的一行文本的内容,String类型。序列化原因同上,因此使用org.apache.hadoop.io.Text

  3. KEYOUT:用户自定义逻辑处理完成之后输出数据中的key。此题中为单词,String类型,同上原因用Text。

  4. VALUEOUT:用户自定义逻辑处理完成之后输出数据中的value。此题中为数量,Integer类型,同上原因用IntWritable。

  • 业务逻辑写在自定义的map()方法中

大数据学习笔记—MapReduce

注意:map计算的结果不是直接给reduce立即处理,而是存储在临时文件,计算结束后由reduce进行逻辑处理

2、Reducer

  • Reducer的输入数据类型对应Mapper的输入数据类型,也是KV对

  1. KEYIN、VALUEIN:

    对应mapper输出的KEYOUT,VALUEOUT类型

  2. KEYOUT、VALUEOUT:

    是自定义的reduce逻辑处理结果的输出数据类型

  • 业务逻辑reduce()方法中

  1. Text key为入参,此题中是单词

  2. Iterable<IntWritable> values 迭代器,此题为reduce的结果集

  3. reduce()方法对每一组相同key的<k,v>组只调用一次

大数据学习笔记—MapReduce

注:·每个reduce的汇总结果会写入hdfs文件中

3、Driver

整个程序需要一个Driver来进行提交,提交的是一个描述了各种必要信息的job对象。因此引入一个main()方法,相当于一个yarn集群的客户端,需要再次封装mr程序的相关运行参数jon对象,指定jar包,并最终提交给yarn执行。

大数据学习笔记—MapReduce

注:若放在linux跑的服务器上有yarn环境,可以不用声明yarn环境

*wordcount运行流程

1、客户端submit时,会去hdfs中查看文件大小并进行规划分配,得到job.split切片,并将job.split、job.xml、wc.jar打包提交给yarn

2、yarn的ResouceManager找NodeManager服务器的mr appmaster去分配map task任务(以文件就近原则)

3、map task 从hdfs中逐行读取,提交给wordcountMapper的map(k,v)方法,再由context.write(k,v)输出到outputCollector收集结果文件

4、等待map处理完后,由reducetask开始执行wordcountReduce的redice(k,v)方法将结果输出到outputFormat到HDFS中存储