mapreduce的shuffle

shuffle的环形缓冲区

map----shuffle过程—reduce
元数据:描述原始数据的数据 原始数据在缓冲区的位置
1)分区信息
2)原始数据key的起始位置
3)原始数据value的起始位置
4)value的长度信息
长度是固定的(4 * 16)
原始数据:序列化的数据 map输出的key 、value的键值对
环形缓冲区 byte []
缓冲区中:分界线 辨识元数据和原始数据的
缓冲区的默认大小:
< property>
< name>mapreduce.task.io.sort.mb< /name>
< value>100< /value>
< /property>
缓冲区的数据达到一定的量之后会溢写到磁盘 spill
有个溢写阈值:总体容量占比0.8 100M*0.8=80M
< property>
< name>mapreduce.map.sort.spill.percent< /name>
< value>0.80< /value>
< /property>
如果80M没有溢写完成,20M写完,写处于阻塞状态,等待80M的空间释放
溢写之前先排序:按照分区排序(相同分区的数据在一起),再按照map的key排序(相同的key在一起)(快速排序)
排序:分区,元数据 元数据的顺序
每个分区内按照map的key 原始数据读取 调整元数据的位置
溢写:根据元数据写原始数据(元数据排完序就没有意义了)
溢写完成后对溢写文件进行归并(merge)然后在进行归并排序,按照分区归并(把每一个分区的数据放在一起),再在每一个分区内部排序(按照map输出的key排的序)

**reducetask在一个maptask执行完成开始启动
MRappmaster:进度
reducetask是从MRappmaster获取maptask进度的
reducetask会先启动多线程取maptask端fetch数据(抓取对应分区的数据)
copy数据的线程数,默认启动5个线程
< property>
< name>mapreduce.reduce.shuffle.parallelcopies< /name>
< value>5< /value>
< /property>
将抓取过来的每一个分区的数据进行归并排序
将每一个分区的数据发送给reducetask的时候进行分组,
**

底层源码

@InterfaceAudience.LimitedPrivate({"MapReduce"})
@InterfaceStability.Unstable
public static class MapOutputBuffer<K extends Object, V extends Object>
    implements MapOutputCollector<K, V>, IndexedSortable {
	//分区编号
    private int partitions;
    //配置文件  JobConf配置文件对象  job.setJarByClass(Driver.class)
    //job.xml中  <name>  <value>
    private JobConf job;
    private TaskReporter reporter;
    //map输出的key和value的类型
    private Class<K> keyClass;
    private Class<V> valClass;
    private RawComparator<K> comparator;
    private SerializationFactory serializationFactory;
    private Serializer<K> keySerializer;
    private Serializer<V> valSerializer;
    private CombinerRunner<K,V> combinerRunner;
    private CombineOutputCollector<K, V> combineCollector;

    // Compression for map-outputs
    private CompressionCodec codec;

    // k/v accounting
    private IntBuffer kvmeta; // metadata overlay on backing store
    int kvstart;            // marks origin of spill metadata
    int kvend;              // marks end of spill metadata
    int kvindex;            // marks end of fully serialized records
    //分界线   元数据/序列化(map输出的原始数据)
    int equator;            // marks origin of meta/serialization
    int bufstart;           // mar
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值