mapreduce的工作原理

 mapreduce工作流程
 任务提交
1. 拆-split逻辑切片--任务切分。
  FileInputFormat--split切片计算工具
  FileSplit--单个计算任务的数据范围。
2. 获得split信息和个数。

MapTask阶段
1. 读取split范围内的数据。k(偏移量)-v(行数据)
    关键API:TextInputFormat。
2. 循环调用mapper.map(k,v)
   关键代码:
       while(xx.next){
         mapper.map(k,v);
       }
3. mapper.map执行完毕后,输出k-v,调用k-v的分区计算
  Partitioner.getPartition(k,v,reduceTask数量)--分区号。
4. 将输出k-v{分区号},存入临时缓冲区。环形缓冲区。
  MapOutputBuffer--环形缓冲区。
5. 如果缓冲区写满80%(mapper代码执行完毕),触发spill溢写过程。
    ① 读取k-v{分区号},对溢写范围内的数据进行排序。
    ② 存放到本地磁盘文件中,产生分区内的溢写文件。
6. 溢写完毕后,产生多个溢写文件
    ① 将多个溢写文件合并成1个有序---归并排序。
    ② combiner(分区 合并 调用reducer--局部reduce操作)【如果开启】
结果:
  每个MapTask执行完毕后本地磁盘,每个分区(目录)内只有一个文件。(Key有序)
  


ReduceTask阶段
1. 从各个MapTask节点下载对应分区的结果文件。
    MapTask(分区0文件)
    MapTask(分区0文件)→  ReduceTask-0
    MapTask(分区0文件)
    
2. merge操作
    ① 排序
    ② 按照key分组
    ③ 将key相同的多个value--->[v,v,v,v]
    
3. 循环调用Reducer.reduce方法处理数据
    while(xxx){
      reducer.reduce(k,vs);
    }
4. reducer.reduce输出key-value,将数据写入HDFS中。
    TextOutputForamt 格式化数据的工具类
    FileOutputFormat 指定输出HDFS的路径位置。
整个过程排序的次数:3次:
第一次: MapTask阶段环形缓冲区开始spill溢写,缓冲区每次溢写,发生一轮排序。
第二次: Maptask多次溢写产生的多个溢写文件(单个文件每部k有序),要做归并排序,maptask每个分区内,只保留1个文件(key有序)
第三次: ReduceTask-0汇总多个MapTask的(对应分区-0)结果文件,归并排序(合并排序)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值