MapRduce-单词统计的执行流程

分配资源阶段

  1. 发起一个提交作业的请求,到达resourcemanager
  2. nodemanager想resourcemanager汇报自己的状态(带宽,内存,cpu...)
  3. 客户端进行规划,在job.xml中,进行切片。
  4. resourcemanager 管理很多的nodemanager 为其分配资源(带宽,内存,cpu...)
  5. 分配完资源之后,客户端与nodemanager打交道,把自己的jar包、切片 分发给nodemangaer,datamanager就有了客户端的数据。
  6. 客户端就知道运行多少个maptask ,有多少个切片就有多少个maptask ,多少个切片也就是多少个block的数量。(1个线程池执行一个maptask),多少个block就有多少个MapReduce,多少个task就有多少个分区。
  7. 看数据在那个分区中进行计算,通过单词的hash值/分区的个数,来判断该数据在那个分区中计算

Map阶段

  1. 对数据进行分区,并分别对每个分区进行map映射(map<data,1>) 
  2. 对分区的map进行排序

Map->Reduce阶段(shuffle洗牌过程)

        这个阶段是效率最慢的,需要通过网络拉取将各个datanode分区中的数据,分别对应到相应的reduce中。这就是mapreduce慢的原因。

Reduce阶段

  1. 将reduce中的数据进行排序
  2. 对map中的key进行分组 (map<data,[1,1,1,1]>)
  3. 调用自己的方法,Reduce.reduce(Text,Iterable<IntWritable>) (map<data,4>)

输出阶段

调用TextOutPutFormat,将输出结果写到hdfs中。

猜你喜欢

转载自blog.csdn.net/wt5264/article/details/121702714