MapReduce是Hadoop中的完成数据计算任务的核心框架
1. MapReduce 组成实体
(1)Client节点:此节点上运行MapReduce程序和JobClient实例对象,负责提交MapReduce作业。
(2)JobTracker:协调调度,主控节点,一个Hadoop集群仅有一个JobTracker节点
(3)Map TaskTracker:执行 Map任务,一个Hadoop集群有多个TaskTracker节点
(4)Reduce TaskTracker:执行Reduce任务,一个Hadoop集群有多个TaskTracker节点
(5)HDFS,存储数据文件,配置文件
2. MapReduce 作业流程
(1)作业启动
(2)作业初始化
(3)作业/任务调度
(4)Map执行
(5)shuffle
(6)Reduce执行
(7)作业完成
3. 作业流程分布讲解
(1)作业启动:
由Client节点运行MapReduce程序,创建JobClient实例
↓
JobClient向JobTracker发出请求,获得一个JobID,用于标识本次MapReduce作业
↓
JobClient将运行作业需要的相关资源(配置文件、输入数据分片数量、包含Mapper类和Reducer类的JAR文件)
放入作业对应的HDFS目录, 计算分片数量和map任务数量
↓
向JobTracker提交作业,并获得作业的状态对象句柄
(2)作业初始化:
切分数据
对于多个JobClient的请求,JobTracker使用队列机制,由作业调度器进行调度
↓
JobTracker创建一个代表此作业的JobInProgress实例,用于后续跟踪和调度此作业
↓
JobTracker从HDFS中获得输入数据的分片信息,决定创建Map任务的数量,并对应创建出一批TaskInProgress,以监控和调度Map任务
(3)作业/任务调度:
TaskTracker向JobTracker 发送心跳消息,主动pull 任务
↓
JobTracker向有闲置资源的TaskTracker派发任务
(4)Map执行:
TaskTracker从HDFS提取相关资源(Jar包、数据)
↓
TaskTracker 创建一个TaskRunner实例运行Map任务
↓
TaskRunner在一个单独的JVM中启动MapTask执行map函数
(使用单独的JVM是为了避免MapTask的异常影响TaskTracker的正常运行)
↓
定期存入缓存,缓存已满时存入本地磁盘
↓
MapTask定期向TaskTracker报告进度
↓
输出键值对 word:1
(5)Shuffle:
汇总相同的key的1值信息,确保相同的key交由同一个reduce任务进行合并处理
(6)Reduce:
JobTracker分配Reduce任务
↓
创建ReduceRunner运行Reduce任务
↓
ReduceRunner在单独的JVM中启动ReduceTask执行reduce函数
↓
从Map节点下载中间结果数据
↓
当所有Map任务完成后,JobTracker会通知所有的Reduce TaskTracker节点开始Reduce任务执行
↓
ReduceTask定期向TaskTracker报告进度
(7)完成作业:
JobTracker通过每一个TaskTracker和其之间的心跳消息,全部任务完成
↓
JobClient轮询获知任务完成
↓
JobClient通知用户程序整个作业完成,显示必要信息。