MapReduce
Map:
1.一次只以一条记录为单位做映射
2.不会关心其他行
Reduce:
以一组为单位计算
什么叫做一组:
分组(KEY:VALUE)
键值对是由MAP映射实现的
Reduce计算来自于Map输出
例如建立2个Reduce,一个Reduce从全部Map中拉取性别为男的数据。
另一个Reduce拉取性别为女的数据。
Block块大小
CPU:密集型计算(Block块小一点适合)
I/O:密集型计算(Block块大一点适合)
split切片
控制并行度(粒度)
每次根据条件切一定范围的数据
而且HDFS中块是有信息的(偏移量,节点位置等),我们的切片可以复用HDFS块信息
不同切片分别去往不同块节点
这就是计算向数据移动
MapReduce会将被切割中断的块信息自动恢复
例如:
块1: hel
块2: lo
底层会将他们拼接上hello
Map、Reduce并行度
Map并行度:
由切片决定,默认值为块数量。
Reduce并行度:
由开发人员决定,默认值为1个.
比例关系
block -- split:
1:1、1:N、N:1
split -- map:
1:1
map -- reduce(为N时注意:组不能被分割):
N:1、N:N、1:1、1:N
group(KEY) -- partition:
N:1、N:N、1:1
MapReduce总结:
1.数据以一条数据为单位,经过map方法映射(切割)成KV键值对。
2.相同KEY为一组,一组数据调用一次Reduce方法,方法内迭代计算这组数据。
3.Reduce拉取一组数据就有可能是好多个T,一次性根本拿不完。
4.利用迭代器模式,传给Reduce的其实是一个迭代器,一条一条的拿,边拿边处理
5.任何用户想要读取IO都需要CPU操作系统内核,一条一条读取IO,一次一次的切换内核很麻烦。
6.我们最应该用的是带BUff的带缓冲区的IO,缓冲区默认大小100M,无需频繁的切换内核。