易于编程、良好扩展性、高容错性、适合PB级别以上海量数据的离线处理
不擅长的领域:
实时计算:毫秒或秒级返回结果
流式计算:输入数据是静态的,不能动态变化
DAG计算:多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出
编程模型
一、将作业分为map和reduce两个阶段
二、map由一系列maptask组成
输入数据格式解析:InputFormat
输入数据处理:Mapper
数据分组:Partitioner
三、Reduce阶段由一系列ReduceTask组成
数据远程拷贝
按key排序
Reducer数据处理
数据输出格式:OutputFormat
1、输入:key/val对
2、用户提供两个函数实现:
map(k,v)>list(k1,v1)
reduce(k1,list(v1))>v2
3、(k1,v1)是中间key/val结果对
4、output:一系列(k2,v2)对
blck、split:block最小存储单位默认64m,split为mapreduce中最小计算单元,默认与block一一对应,可调整;
组件:
InputFormat
Combiner(map之后reduce之前,合并本地map相同key的value,通常与reducer逻辑一样)
Partitioner:决定每个maptask输出的每条数据交个哪个reducetask处理
默认实现:hash(key) mod RR为reducetask数目;
允许用户自定义
master-slave架构
master:jobtracker
管理所有作业
将作业分解成一系列任务
将任务指派给tasktracker
作业/任务监控、错误处理等
slave:tasktrackers
运行maptask和reducetask
与jobtracker交互,执行命令并汇报任务状态
client:管理者,提交任务,监控集群状态
maptask
解析每条数据记录并传递给用户编写的map
将map输出数据写入本地磁盘,如果是map-only作业则直接写入hdfs
reducetask
从maptask上远程读取数据
对数据排序
将数据分组传递给用户编写的reduce
设计原理
mapreduce的容错机制
jobtracker:单点故障
tasktracker:周期性向jobtracker汇报心跳信息,一旦出现故障,上面所有任务将调度到其他节点上
资源组织方式
机器用slot描述资源数量:由管理员配置slot数目,分为mapslot和reduceslot两种。
任务调度器:根据节点资源(slot)使用情况和作业要求,将任务调度到各个节点上
调度器考虑因素:
作业优先级、作业提交时间、作业所在队列的资源现在
任务调度器工作流程:client》jobtracker》tasksch(对作业初始化)》tasktrackers》task
fifo、capacity、fair
capacity
队列组织作业
每个队列内部采用fifo调度策略
每个队列分配一定比例的资源
可限制每个用户使用的资源量
fair
队列组织作业
基于最小资源量与公平共享量进行调度
作业优先级越高,分配到的资源越多(这里跟capacity好像有点出入)
多用户调度工作原理:
默认选择资源使用率最低的队列》选择作业》选择任务
数据本地性:如果任务运行在它将处理的数据的所在的节点,则称该任务具有数据本地性,避免跨节点机架传输。
本地性分类:同节点(node-local)、同机架(rack-local)、其他(off-switch);
推测执行机制:
作业完成时间取决于最慢的任务完成时间,发现某个任务运行速度远慢于任务平均速度,则为该任务启动一个备份任务同时运行,谁先运行则采用谁的结果。
不能启用推测机制的情况:任务存在严重的负载倾斜;特殊任务,如向数据库写入数据。
应用场景
简单数据统计
搜索引擎建立
海量数据查找
复杂数据分析算法实现:
聚类算法
分类算法
推荐算法
图算法