以WordCount为例对MapReduce进行详解

第一阶段:上传文件到hdfs
client端带上文件的内容和大小(假如300M)向yarn(ResourceManger,维护着一个列表,列表中记录着各个数据节点当前的状况,DataNode是否还活着,空间剩余,是否有任务进行中)请求上传该文件,yarn接收到请求后会根据文件的大小计算最少需要几个DataNode(128M,128M,44M需要三个,),同时去寻找相对比较闲置的DataNode作为计算节点,并把每个文件片存储和备份的DN号(通常两个DN号是不一样的)作为信息返回给client端,client端接收到yarn的信息后,带着数据信息去每个DataNode再次确认,全部确认完成后从最后一个DataNode开始依次用ByteBuffer开始写入当前DN应该存储的切片信息或备份信息,全部写完之后,反馈回client端,client再向yarn反馈完成记录,yarn的NameNode生成editlog,并备份其editlog到SecondaryNameNode的editlog,SecondaryNameNode的editlog进行合并,写入到其fsimage中,然后把fsimage的内容拷贝一份到NameNode的fsimage中,至此文件上传流程结束。

第二阶段:MapTask
Client端再发一个申请,yarn再做一个计算,同时去寻找相对比较闲置的DataNode作为计算节点还有一个作为AppMaster,此时AppMaster是清楚哪几个DataNode是作为计算节点的,然后启动三个节点的Map,如果条件允许Map和Reduce会在用一个节点上,然后用TextInputFormat按行读取的方式调用RecordRead-reader的方法去读取文件内容,行内容以键值对的信息(LongWritable,Text)作为入口参数,读到的内容作为键值传输为Mapper的map方法的入口参数(LongWritable,Text)进行逻辑处理形成新的键值(Text ,IntWritable),再用context.write发出去给OutPutCollection,下面开始shuffle过程。
第三阶段:shuffle(在map和reduce端进行)
OutPutCollection写入达到其容量的80%时开始溢出小文件,溢出时会根据分区和key排序,分区是根据key的hashcode取余NumReduceTasks(在job中设置的),此时如果有combiner的话,这些小文件中key相同的value值会合并,在小文件合并成大文件的时候,不同小文件中 key相同的value值也会合并,没有combiner的话,value值则不会合并相加,在所有map端都生成有序的大文件后,一起进入reduce阶段
第四阶段:ReduceTask
三个reducer一起启动,分别从map端根据自己的分区号拷贝自己分区的文件,多个文件再次合并形成一个大文件,根据key进行分组,此时不会combiner,所以大文件中会有Key相同value不同的键值对,到此shuffle的过程结束,然后会把一组看(K,values)发给迭代器进行value求和,之后用TextOutputFormat按行读取的方式调用RecordWrite-write的方法把文件内容写入磁盘形成文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值