7.1 MapReduce 模型简介
传统数据处理理念: 数据向计算靠拢
MapReduce 理念: 计算向数据靠拢 , 即将应用程序分发到数据所在的机器
具体来说就是当要处理数据块A的时候,将距离数据块A最近的map分配给数据块A,而往往它们是在同一块机器上的
MapReduce 架构: Master/Slave
7.2 MapReduce 体系结构
几个概念
- JobTracker
- TaskTracker: 接收JobTracker发送的命令执行具体任务,以心跳的方式发送资源占用情况及任务运行进度
- 资源调度单位:slot(槽),将所有可用的CPU和内存资源打包等分,等分的单位即为slot;同时slot分为map类型的slot,用于执行map任务;reduce类型的slot,用于执行reduce任务,两者互不通用.
7.3 MapReduce 工作流程
一个大数据集分成多个片,每个分片分配一个map执行任务,最后所有map的结果经过分区、排序、合并、归并等操作,称为shuffle,再进行reduce任务。
分片只是逻辑上的分片,而这个分片可能会大于HDFS的一个块的大小,假如两个块不在一个机器上,则还需要跨机器读取,因此一般把分片大小设为一个HDFS块的大小.
Reduce任务数量的设置,取决于可用的reduce slot的数量,比可用的reduce slot少一点
7.4 Shuffle 过程原理
Map端的Shuffle
map任务的结果不直接写入磁盘,而是先写入预先分配的缓存(一般是100MB),减少IO的消耗。
溢写是指,不能等缓存满了才写入磁盘,因为map一直在执行,是不会等写操作的,所以缓存快满的时候,达到一个阈值:溢写比(比如0.8),才会写入磁盘
达到溢写比时也不是直接写入,而是要经过
- 分区: 按照不同的reduce任务所需要的数据分区,
- 排序: 自动实现,按照<key,value>的key的字典序排序
- 合并: 可选,比如相同的key值的value值相加或取最大值
Reduce端的Shuffle过程
reduce端从每个map那对应自己需要数据的分区拉取数据,
如果map shuffle没有经过合并则拿到的是<key,value-list>,如<'a',<1,1,1>>
如果经过合并则是<key, value>
而reduce 拿到map的输出,还会进行归并,把相同键值的value 归并成value-list。 如<'a',1>,<'a',1> 归并为<'a',<1,1>>
7.5 MapReduce 应用程序的执行过程
Master 对应 JobTracker
Worker对应 TaskTracker
MapReduce 产生的中间结果 如缓存,不会写到HDFS,而是直接写入Worker所在的机器的磁盘.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。