分配资源阶段
- 发起一个提交作业的请求,到达resourcemanager
- nodemanager想resourcemanager汇报自己的状态(带宽,内存,cpu...)
- 客户端进行规划,在job.xml中,进行切片。
- resourcemanager 管理很多的nodemanager 为其分配资源(带宽,内存,cpu...)
- 分配完资源之后,客户端与nodemanager打交道,把自己的jar包、切片 分发给nodemangaer,datamanager就有了客户端的数据。
- 客户端就知道运行多少个maptask ,有多少个切片就有多少个maptask ,多少个切片也就是多少个block的数量。(1个线程池执行一个maptask),多少个block就有多少个MapReduce,多少个task就有多少个分区。
- 看数据在那个分区中进行计算,通过单词的hash值/分区的个数,来判断该数据在那个分区中计算
Map阶段
- 对数据进行分区,并分别对每个分区进行map映射(map<data,1>)
- 对分区的map进行排序
Map->Reduce阶段(shuffle洗牌过程)
这个阶段是效率最慢的,需要通过网络拉取将各个datanode分区中的数据,分别对应到相应的reduce中。这就是mapreduce慢的原因。
Reduce阶段
- 将reduce中的数据进行排序
- 对map中的key进行分组 (map<data,[1,1,1,1]>)
- 调用自己的方法,Reduce.reduce(Text,Iterable<IntWritable>) (map<data,4>)
输出阶段
调用TextOutPutFormat,将输出结果写到hdfs中。