Hadoop运行机制理解心得

  1. Shuffle过程
  • Map端Shuffle
  • Spill:将MapTask处理好的数据写入磁盘
  • 所有MapTask的数据会先进行分区标记
  • 所有标记完成的数据会被写入一个环形缓冲区【内存:100M】
  • 当缓冲区达到存储阈值80%,这部分就被锁定,准备溢写
  • 对着80%中的K2V2进行排序:相同分区的数据放在一起
  • 内存:快排
  • 将这部分数据写入磁盘变成小文件
  • 最终每个MapTask会产生很多个有序的小文件
  • Merge:将每个MapTask对应的所有小文件进行合并成一个大文件
  • 合并排序:归并排序:基于有序文件的合并排序
  • 每个MapTask得到一个整体有序的大文件
  • MapTask程序结束通知程序管理者APPMaster,APPMaster会通知ReduceTask
  • Reduce端SHuffle
  • Merge:每个ReduceTask到每个MapTask取属于自己的数据
  • 合并排序:将所有属于自己的数据进行合并排序
  • 归并排序
  • 最终实现每个ReduceTask中的数据是整体有序的,实现分组
  • 思考:自定义分组:订单id,排序比较器:订单价格
Order_0000001	Pdt_01	222.8
Order_0000001	Pdt_05	25.8
Order_0000002	Pdt_03	522.8
Order_0000002	Pdt_04	122.4
Order_0000002	Pdt_05	722.4
Order_0000003	Pdt_01	222.8
Order_0000003	Pdt_01	1000.8
Order_0000003	Pdt_01	999.8
Order_0000003	Pdt_01	1000.8


Order_0000002	Pdt_05	722.4


Order_0000003	Pdt_01	222.8

Order_0000001	Pdt_01	222.8

Order_0000002	Pdt_04	122.4

Order_0000001	Pdt_05	25.8
  • 分组规则
  • 默认:调用K2的排序器作为分组的比较器
  • 自定义:继承WritableComparator,实现compare方法
job.setGroupingComparatorClass
  1. Shuffle的优化
  • 尽量让程序避免shuffle过程
  • Map Join
  • ComBiner:Map端的聚合
  • 利用MapTask的个数比较多,每个MapTask负责处理的数据比较小,让每个MapTask提前做一次每个MapTask中的聚合,减轻进入Reduce的数据量
  • 聚合逻辑:就是Reduce逻辑
  • 实现:job.setCombinerClass(Reduce.class)
  • 发生:每次排序结束都会做会做一次Combiner
  • Compress:压缩
  • 利用压缩减少数据的磁盘以及网络IO的带宽,提高传输的速度
  1. MapReduce中的补充
  • 分片规则
  • 文件大小 / 分片大小 > 1.1
  • 如果大于1.1倍,一个分片大小就是一个分片
  • 剩余的是一个分片
  • 如果不大于,整个文件就是一个分片
  • 分片大小:max(最小分片大小,min(最大分片大小,块的大小))
  • |
  • 文件是否大于一个块的1.1倍
  • 135M > 128 x 1.1
  • 作为一个分片
  • 145M
  • split1:128M
  • split2:17M
  • MapReduce Join
  • Join规则
  • Join算法
  • Reduce Join:发生在reduce端,通过shuffle将两份数据的关联词在分组时进行关联
  • 必须经过Shuffle
  • 适合于大数据join大数据
  • Map Join:将小数据放入分布式内存,让每一份完整的小数据与大数据的每一个部分进行join
  • 不需要经过shuffle
  • 适合于小数据join大数据
  1. YARN的资源管理和任务调度
  • 主从架构
  • MapReduce程序在YARN上运行过程
  • YARN中的任务调度机制
  • FIFO:单队列,不能实现多个程序的并发或者并行
  • Capacity:容量调度,多队列,每个队列内部是FIFO,多个队列可以并行,允许资源动态抢占
  • Fair:公平调度,多队列,每个队列内部共享资源,多个队列可以并行,每个队列内部可以并发,允许资源动态抢占,允许配置权重优先级