Hadoop2.8.0<Mapreduce模型+shuffle过程>

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Gpwner/article/details/73323991

1.Mapreduce模型

这里写图片描述

map阶段:

  • 输入数据格式的解析:inputformat
  • 输入数据的处理:mapper
  • 数组分组:partitioner
  • map阶段有一定量的maptask组成,其实就是多线程在处理我们的任务,多个task分布在物理上的多台机器上执行,reduce阶段是由一定数量的reduceTask组成的
    reduce阶段

  • 从map阶段的输出结果做一个数据拷贝,把对应的数据拷贝大reduce端

  • 然后拷贝过来的数据按照key进行排序,把排序之后的数据做一个合并作为reduce的输入
  • reducer做数据处理,把多个单词的词频统计,最后是ouputformat做数据的输出

    可以人为控制阶段:
    Inputformat、Mapper、Partitioner(输出数据的分区)、reducer、outputformat(输出数据的格式、路径、是否要压缩等)

1>.输入数据做一个分片,数据是存储在HDfs上的,输入数据首先通过inputformat这个对象做一个分片,然后mapper阶段读入每一个分片,一个分片对应一个mapper,因为有四个分片所以对应的有四个mapper对象,mapper将句子中的单词分割,转换为(k,v),k是单词,v是1的格式,mapper节结果输出到本地磁盘,不是输出到Hdfs,输出本地磁盘之前会对数据进行一次分区,分区之后在存入mapper的本地磁盘。

2>.在执行reducer之前会执行一个叫做shuffle的过程,shuffle阶段将mapper阶段的结果拷贝到reducer端,这里shuffle将(class,1),(bad,1),(class,1)分别从第二、三、四个map的输出结果做排序拷贝到reducer,拷贝之后进行排序,排序完成之后将相同key进行合并,比如第二个reduce中现在有三个(Hadoop,1),会合并成一个集合类型,(Hadoop,[1、1、1]),然后把数据作为reducer的输入数据,reducer将数据作累加,比如Hadoop:1+1+1=3,最后每一个reducer都有一个输出结果,这些结果是输出到hdfs上的,wordcount过程结束

mapreduce的数据流

这里写图片描述

(1)两个节点,inputformat将数据从hdfs读取数据,inputformat将数据作分片(分别在两个节点机器将数据做了三个分片)
(2)分片完成之后产生recordreader对象,然后map阶段调用RecordReader对象循环读取分片中的数据
(3)然后map将每一条数据读入之后做处理,然后map的输出结果被partitioner做分区,数据输出到本地磁盘之后进入shuffle
(4)shuffle阶段,两台机器之间互相拉取数据,shuffle将数据排序,排序完成之后合并,合并结果作为reducer的输入,reducer对输入数据做进一步的处reducer将通过outputformat将数据写回hdfs。.

map的输出结果会根据reduceTask的个数进行分区,分区个数和reducer的个数有关,默认以hash函数分区,也可以自定义分区函数。shuffle:map和reduce之间的数据流,每一个reduceTask的输入来自多个mapTask的输出,在这阶段,参数调优对job的运行时间有着很大的影响。这是一个奇迹发生的地方。

inpuformat:

1验证作业输入的正确性;
2对输入文件做分片,分片的大小默认和hdfs的块大小 是相等的将分片单独发给一个mapTask;
3.提供recordreader的实现,这个对象从指定的分片中正确地读入一条一条的K-V,这些K-V对将由我们的Mapper方法处理。

split和Hdfs的Block的区别

Hdfs中存储数据的最小单元,默认的大小是128M
split是mapreduce的最小计算单元,它并不代表数据本身,而是记录了split的长度和数据为准信息的数组
每一个split对应着一个MapTask
默认情况下split数量和Block的数量是一一对应的
Block和Split的关系是任意的,可以由用户控制

2.shuffle阶段

这里写图片描述

mapshuffle
(1)map阶段首先将结果输入到内存缓冲区,图中有三个map,三个内存缓冲区,假设缓冲区做配置,百分之二十,百分之八十,如果内存中的数据超过了缓冲区的百分之八十,会将数据自动刷入maptask所运行机器的本地磁盘,在内存中还做了一个分区和排序。
(2).分区是和reduceTask的数量相关的,图中有两个ReduceTask,所以分区产生了两个分区。输出得到本地磁盘的时候,会刷出很多个小文件,在Map阶段执行完成之后,后台会起一个线程将相同分区中的小文件合并为大文件,最终在MapTask所运行机器会生成两个大的分区文件。

reduce shuffle
(1)将map阶段的结果进行拷贝,图中分别从三个mapTask中的深蓝色的分区中的数据拷贝到第一个ReduceTask,三个浅蓝色的分区文件也会拷贝到第二个(粉红色的)reduceTask,拷贝过来之后,将三个文件进行排序,然后做合并,最后将合并完成的数据作为reduce的输入,reduce对这些数据做处理,最终将数据输出到Hdfs

猜你喜欢

转载自blog.csdn.net/Gpwner/article/details/73323991
今日推荐