1客户端(切片清单)
job 要做五件事 最重要的是第二件
2map输入数据
利用lineRecordRedurer 方法做行读取器
一个切片的的信息:
file:来自的文件
start: 偏移量
length: 大小
hosts: 位置信息
1 map输入对hdfs拿一个输入流 seek()方法 到自己map的偏移量位置 这样就不会读到其他map
2 调整切片的偏移量向下边多读一行 (分割块时把信息分割开了,用这个方法把信息调整完整)
3洗牌
洗牌包括 map输出数据 和reduce 拉取数据
但是源码中 是reduce拉取数据的过程
1 map输出数据
主要工作的的是mapoutputbuffer
首先调用write(k,v)方法 但底层 会多传一个叫p的分区信息
根据hash得到一个值用来代表partition 但会打乱数据的逻辑
所以一般在客户端设置
这五个步骤在init方法中
1 得到的数据会写在内存中的buffer缓冲区
默认是100mb大小 (可以调优增加速度) 占用80%会写到磁盘
在buffer中 每对k,v要存进buffer内要确定他的位置就要有索引 那么就会在buffer的后边开辟一个
16b大小的空间来记录他的信息 分为 四部分
1 key的起始位置
2 value的起始位置
3 value的结束位置
4 p 这条数据的分区信息
这是一个环形的缓冲区
2 在内存中进行快速排序
这是整个排序唯一次从乱序变成有有序的过程 唯一一次用到快排
3 用到比较器
在源码中 看 用户有没有自己编写比较器 如果有编写就用编写的 如果没有就用源码自身带的 (字典序 和数值序 )
4 conbiner–处理本map的数据
用于压缩文件 相同的数据合并起来 减少reduce拉取数据I/o时间
conbiner 是处理本map中的数据
第一次conbiner是缓冲区写完一个80%排序时触发一次,压缩文件 写到磁盘
当多个写完多个的时候(即溢写数量超过3的时候)会再次触发conbiner合并相同的数据
生成的多个文件 先按分区排序,再按key排序
5 溢写 和线程
8%的数据写满 进行排序输出的过程 要给20%的大方开始写数据
最后有一个flash的方法 把一个个小文件合并成一个大文件
洗牌的主要目的:
解决 磁盘I/O 网络I/O传输速度问题
2 reduce拉取数据
map的输出和reduce的输入时并行的
例如有100map 弄好30个后 reduce先拉取过来 然后map和reduce各自工作
reduce强依赖map排序的结果分组
存在buffer缓冲区
进行归并排序
比较器 :
看用户有没有做分组比较器
再看快排时有没有自己做做比较器
然后再用系统自己的比较器
真假迭代器:
reduce迭代的过程:
读一行 同时判断下一行是不是和自己的key相同
当读到和下一行的的key不同时 就能判断一组
所以这个过程基本不消耗内存