1. client 客户端有一个文件 200m
2. 客户端subnmit()之前 对文件进行切片 hadoop默认切片为128m 所以会切成2片
3.客户端提交信息 job.split wc.jar job.xml 如果是本地模式没有jar包
4.提交信息给yarn yarn启动 MRAppMaster 进程计算出MapTask数量
5.当实例化一个maptask后,创建TextInputFormat,调用里面的RecoreReader方法将切片读取封装成(k,v)传送给Mapper
6.当调用了context.write()方法时,此时会初始化一个outputCollector对象将map输出的key,value收集到缓冲区(MapOutBuffer)中
默认是100m
7. 环形缓冲区是双向写入 左边的是索引 右边是数据 当缓冲区达到80%准备将数据溢写到文件之前,会以分区为单位对区内的数据进行快速排序,同时每溢写一次就调一次combiner进行合并 合并小的切片文件 多个maptask转变为一个task
8.此时将环形缓冲区的数据溢写到文件(分区且区内有效)
对所有溢写的文件进行Merge归并排序,此时一个maptask结束
reduce阶段
所有maptask任务完成后,启动相应数量的reducetask,并告知reducetask处理数据的范围
启动shuffle线程通过网络I/O将数据拷贝到内存中合并,此时如果数据量太大或者shuffle线程不够的话它也会先进行combiner合并一部分溢写到磁盘落盘处理
对每个map来的数据并归排序,让其所有数据整体有序
按照相同key进行分组(GroupingComparator(k,knext))
使用分组比较器对(key,value)进行迭代,一次读入一组进入reducer(k,v)创建TextOutputFormat对象,调用里面的RecoreWriter方法对数据进行写出
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)