- 主:jobtracker
- 从:tasktracker
1、 Split
- 数据上传到hdfs上以block的形式存在, 作为Split的数据,例如:wordcount按照行分割,将每行数据作为一个任务,交给map处理;
2、 Mapper:key-value(对象)
- Split拆分的数据交给map,按照键值对形式, 如wordcount,每行数据的第一个字母的序号作为key,每行数据作为value,交由map处理。输出得到的也是键值对形式。
3、 Shuffle
- a) 分区(partition,HashPartition:根据key的hashcode值 和 Reduce的数量 模运算),可以自定义分区,运算速度要快。一定要解决数据倾斜和reduce的负载均衡。
- b) 排序:默认按照字典排序。WriterCompartor(比较)
- c) 合并:减少当前mapper输出数据,根据key相同(比较),把 value 进行合并。
- d) 分组(key相同(比较),value组成一个集合)(merge)
4、 Reduce
- a) 输入数据:key + 迭代器
map输出的数据,经过shuffle(洗牌), 形成键相同的一系列值, 作为reduce的输入
Map-Reduce的思想就是“分而智之”
- Mapper负责“分”, 把复杂的任务分解成若干个 “简单的任务”执行
“简单任务”有几个含义:
- 数据或计算规模较原任务要大大缩小
- 就近计算,即会分配到存放了所需数据的节点进行计算,移动计算,而不是移动数据
- 这些小任务之间没有以来关系,可以并行计算
- 在mapper和reducer中间的一个步骤,包含4个过程:分区,排序,合并,分组,
- 可以见mapper的输出按照某种key值重新切分,和组合;把key值符合某种范围的输出到特定的reduce那里处理。
- 可以简化reduce的过程
- shuffler为map输出到reduce输入
map部分的shuffler: 首先map输出的数据首先存在内存中, 由于内存有限, 但达到一定阈值,数据即将溢出, 将数据写到磁盘中, 但是,在这之前, 首先要进行partition(使每个map输出的键值对都有一个分区号,将交由对应的reduce处理), sort(默认情况,对键进行字典排序), 然后spill to disk , 写到磁盘中,形成临时文件,当map task执行完了, shuffler会将所有的临时文件合并(merge),
reduce部分的shuffler: 从各个map经由shuffle得到的数据(磁盘中合并后的文件),fetch(抓取)该reduce对应的分区的数据,优先放在内存中, 但是也会有溢写,需要再次进行排序,这个shuffle过程进行了两次排,font>排序之后进行分组,每组交由一个reduce处理。至此shuffler结束。
- max.split(100M)
- min.split(10M)
- block(hadoop1.x中为64M, 2.0中为128M)
三者决定Split的大小:max(min.split, min(block, max.split)) 根据上面的公式可知:要么是一个碎片段就是一个block, 要么一个block被拆分成多个碎片段。 不可能出现一个碎片段由多个block组成:
- 如果这两个block不在同一台机器上,就需要进行数据的拷贝。这违背了mapreduce的理念:移动计算而不移动数据。
hadoop1.x中为jobtracker和tasktracker的主从架构 hadoop2.x中,运行在yarn架构中。为resourceManager和NodeManager主从架构。