Hadoop MapReduce体系和生命周期
MapReduce是一个分布式计算框架,主要由:编程模型和运行时环境组成
MapReduce采用Master/Slave架构:

主要由以下部分组成:
1 Client: 用户编写MapReduce程序通过Client提交到JobTracker,也能通过Client查看作业运行状态
2 JobTracker:负责资源监控和作业调度
监控所有TaskTracker与作业的健康状况,一旦发现失败,将相应的任务转移到其他节点
跟踪任务的执行进度、资源使用量等信息,告诉任务调度器(Task Scheduler)
任务调度器选择合适的任务使用这些资源
在hadoop中,任务调度器是一个可插拔的模块,用户可以自己设计
3 TaskTracker
TaskTracker会周期性地通过Heartbeat将本节点上资源的使用情况和任务的运行进度汇报给JobTracker
同时接受JobTracker发送过来的命令并执行相应的操作
TaskTracker使用“slot”等量划分本节点上的资源量。slot代表计算资源(CPU、内存等)
一个Task获取到一个slot后才有机会运行
slot分为Map slot和Reduce slot两种,分别供MapTask和ReduceTask使用
TaskTracker通过slot数目限定Task的并发度
4 Task
分为MapTask和ReduceTask两种,
对于MapReduce而言,其处理单位是split,split是一个逻辑概念,只包含一些元数据信息,如数据起始位置、长度、节点
它的划分完全由用户自己决定,split的多少确定了MapTask的数量,一一对应处理
MapTask处理的临时结果存放到本地磁盘上,被分成若干个partition,每个partition将被一个ReduceTask处理
ReduceTask处理过程:
1 从远程节点上读取MapTask中间结果
2 按照key对key/value进行排序
3 调用用户自定义的reduce()函数处理,将结果存在HDFS上
MapReduce作业生命周期:
1 作业提交与初始化。
用户提交作业后,由JobClient实例将作业相关信息上传到分布式文件系统,然后通过RPC通知JobTracker
JobTracker收到新作业提交请求后,由作业调度模块对作业进行初始化
为作业创建一个JobInProgress对象以跟踪作业运行状况
而JobInProgress会为每个Task创建一个TaskInProgress对象以跟踪每个任务的运行状态
TaskInProgress可能需要管理多个"Task Attempt"
2 任务调度与监控。
均有JobTracker完成。
一旦出现空闲资源,JobTracker会按照一定的策略选择一个合适的任务使用该资源,这由任务调度器完成
任务调度器是一个可插拔的独立模块,为双层架构,先选择作业,后从作业中选择任务,重点考虑数据本地性
当TaskTracker或Task失败时,转移计算任务
当某个Task执行进度落后于同一作业的其他Task时,启动一个相同的Task,选择快的Task结果
3 任务运行环境准备。
包括JVM启动和资源隔离,均由TaskTracker实现
TaskTracker为每个Task启动一个独立的JVM以避免不同Task在运行过程中互相影响
Task使用了操作系统进程实现资源隔离以防止Task滥用资源
4 任务执行。
TaskTracker为Task准备好运行环境后,便会启动Task
在运行过程中,每个Task的最新进度首先由Task通过RPC汇报给TaskTracker,再由TaskTracker汇报给JobTracker
5 作业完成
待所有Task执行完成后,整个作业执行成功
作业的提交:
jobClient的runJob()
1 新建JobClient实例
2 调用submitJob()方法
3 每秒轮询作业的进度
* 如果发现自上次报告后有改变,便把进度报告到控制台
* 作业完成后,如果成功,就显示作业计数器
* 如果失败,导致作业失败的错误被记录到控制台
JobClient的submitJob()方法提交过程:
1 向jobtracker请求一个新的作业ID
2 检查作业的输出说明
3 计算作业的输入分片。如果分片无法计算,作业就不提交,错误返回给MapReduce程序
4 将运行作业所需要的资源复制到一个以作业ID命名的目录下jobtracker的文件系统中,
5 告知jobtracker作业准备执行(通过调用jobTracker的submitJob()方法实现)
作业的初始化
1 jobTracker接收到对其submitJob()方法的调用
2 把此调用放到一个内部队列中,交由作业调度器进行调度,并对其进行初始化
3 初始化包括创建一个表示正在进行作业的对象--封装任务和记录信息,以便跟踪任务的状态和进程
任务分配
1 tasktracker运行一个简单的循环来定期发送“心跳”给jobtracker
2 “心跳”告知jobtracker,tasktracker是否存活,同时充当两者之间的消息通道
任务执行
1 tasktracker通过从共享文件系统把作业的JAR文件复制到tasktracker所在的文件系统,从而实现作业的JAR文件本地化
tasktracker将应用程序所需要的全部文件从分布式缓存复制到本地磁盘
2 tasktracker为任务新建一个本地工作目录,并把JAR文件中的内容解压到这个文件夹下
3 tasktracker新建一个TaskRunner实例来运行该任务
4 TaskRunner启动一个新的JVM来运行每个任务

浙公网安备 33010602011771号