Hadoop之MR运行流程

本文详细介绍了Hadoop MapReduce(MR)的运行流程,包括MapTask的启动、数据切片逻辑、Mapper处理过程以及Reducer阶段。重点讲解了数据切片的逻辑、自定义切片大小的方法以及如何优化切片信息。同时,文中还阐述了Mapper如何处理数据,将KV对存放在内存缓冲区,并通过分区、排序和合并等步骤进行预处理。最后,概述了Reducer的数据拷贝、归并排序以及分组输出的过程。
摘要由CSDN通过智能技术生成

1.MR运行原理图:

在这里插入图片描述

2.MapTask的详细流程:

1.提交相应的信息到mr appmaster

(1)都回提交哪些信息?

  • split.xml 配置信息
  • jar包
  • 切片信息.mrappmaster根据切片信息开启对应数量的maptask
(2) 切片信息怎么得到?

默认TextInputFormat调用父类FileInputPutFormat 中getSplits方法得到切片信息。
再调用createRecordReader 返回RecordReader对象读取切片记录。默认使用LineRecordreader 读取切片信息。行偏移量作为key,内容作为value。RecordReader会在输入块上被反复调用,直到整个输入块被处理完毕,每一次调用RecordReader都会调用Mapper类的map()函数。

InputFormat<?, ?> input =  ReflectionUtils.newInstance(job.getInputFormatClass(), conf);
    List<InputSplit> splits = input.getSplits(job)

类之间的关系:在这里插入图片描述
InputFormat只定义了规范。没有添加实现方法
在这里插入图片描述

public abstract class InputFormat<K, V> {
   
                 //输入数据切分成splits
    public abstract List<InputSplit> getSplits(JobContext context) 
             throws IOException, InterruptedException;         
    //返回一个能够读取分片记录的RecordReader  默认是 LineRecordReader 每行的偏移量作为map的key,每行的内容作为map的value;   
    //SequenceFileInputFormat的RecordReader是SequenceFileRecordReader;      public abstract RecordReader<K,V> createRecordReader(InputSplit split,
       TaskAttemptContext context) throws IOException, InterruptedException;
}

getSplits的源码:默认是TextInputForamt

public class TextInputFormat extends FileInputFormat<LongWritable, Text> {
   

  @Override
  public RecordReader<LongWritable, Text> 
    createRecordReader(InputSplit split,
                       TaskAttemptContext context) {
   
    String delimiter = context.getConfiguration().get(
        "textinputformat.record.delimiter");
    byte[] recordDelimiterBytes = null;
    if (null != delimiter)
      recordDelimiterBytes = delimiter.getBytes(Charsets.UTF_8);
    return new LineRecordReader(recordDelimiterBytes);
  }

  @Override
  protected boolean isSplitable(JobContext context, Path file) {
   
    final CompressionCodec codec =
      new CompressionCodecFactory(context.getConfiguration()).getCodec(file);
    if (null == codec) {
   
      return true;
    }
    return codec instanceof SplittableCompressionCodec;
  }

}


************
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值