作为一个从未接触过Hadoop的人来说Map Reduce,如果大家看的有问题,就立刻警觉这人有毛病。。。
1MapRecude作业运行机制
1.1 概述
概述
用途MapReduce是一种计算框架,用于大规模数据的并行处理。
作业和任务
- MapReduce 作业( Job )是指客户端需要执行的一个工作单元(它包括输入数据、MapReduce程序和配置信息)。
- Hadoop将作业分成若干个小任务(Task)来执行,其中包括两类任务:map任务和reduce任务。
数据流
- Hadoop将输入数据划分成等长的小数据块,称为分片(split);
- 一个合理的分片大小趋向于HDFS的一个块的大小,默认是64M;
- 在存有输入数据的节点上运行map任务可以获得最佳性能,这就是所谓的本地化优化
Jortracker
- Jobtracker是主线程,它负责接收客户作业提交,调度任务到工作节点上运行,并提供诸如监控工作节点状态及任务进度等管理功能,一个MapReduce集群有一个jobtracker,一般运行在可靠的硬件上。
- tasktracker是通过周期性的心跳来通知jobtracker其当前的健康状态,每一次心跳包含了可用的map和reduce任务数目、占用的数目以及运行中的任务详细信息。Jobtracker利用一个线程池来同时处理心跳和客户请求。
- 当一个任务被提交时,组成作业的每一个任务的信息都会存储在内存中,在任务运行的时候,这些任务会伴随着tasktracker的心跳而更新,因此能近乎实时的反映任务进度和健康状况。
Tasktracker
第二个后台程序—tasktracker—由jobtracker指派任务,实例化用户程序,在本地执行任务并周期性地向jobtracker汇报状态。
在每一个工作节点上永远只会有一个tasktracker。
Tasktracker和DataNode运行在一个机器上,从而使得每一台物理机器既是一个计算节点,同时也是一个存储节点。每一个tasktracker能够配置map和reduce的任务片数(taskslot),这个数字代表每一种任务能被并行执行的数目。
1 MapReduce作业运行机制
1.1 作业的提交
- 1.执行runjob()方法创建一个JobClient实例,见步骤1;
- 2.向JobTracker请求一个新的作业Id,检查作业的输出说明,计算作业的输入分片,见步骤2;
- 3.复制作业资源(Jar文件、配置文件和计算所得分片信息)到以作业ID命名的的目录下的Jobtracker的文件系统下,见步骤3;
- 4.调用Jobtracker的submitjob()方法来通知Jobtracker作业准备执行,见步骤4.
1.2 作业的初始化
- 1.创建一个表示正在运行作业的对象——封装任务和记录信息,以便跟踪任务的状态和进程,见步骤5;
- 2.获取已经计算好的输入分片信息,为每一个分片创建一个map任务(reduce任务的个数由用户配置),将任务放入任务列表,见步骤6.
1.3 任务的分配
- 1.TaskTracker定期发送“心跳”给JobTracker. “心跳”告知JobTracker它是否存活,同时也充当两者之间的消息通道。作为“心跳”的一部分,tasktracker会指明它是否已经准备好运行新的任务,如果是,jobtracker会为它分配一个任务,并使用“心跳”的返回值与tasktracker进行通信,见步骤7;
- 2.Jobtracker为tasktracker选择任务之前,必须先选定任务所在的作业;
- 3.选择map任务时,jobtracker会考虑tasktracker的网络位置,选在一个距离其输入分片最近的tasktracker。
1.4 任务的执行
- 1.把作业的JAR 文件等资源复制到TaskTracker所在的文件系统,见步骤8; 然后Tasktracker解压JAR文件到本地目录;然后,新建一个TaskRunner实例来运行该任务;
- 2.TaskRunner启动一个新的JVM,见步骤9;
- 3.在JVM运行任务,见步骤10.
1.5 进度和状态的更新
一个作业和每个任务都有一个状态信息,包括:作业或任务的运行状态(running, successful, failed),map和reduce的进度,计数器值,状态消息或᧿述。
这些信息通过一定的时间间隔由child JVM –> task tracker –> job tracker汇聚。job tracker将产生一个表明所有运行作业及其任务状态的全局试图。你可以通过Web UI查看。同时JobClient通过每秒查询jobtracker来获得最新状态。
1.5 作业的完成
- 当jobtracker收到作业最后一个任务已完成的通知后,便把作业的状态设置为“成功”。然后,在Job查询状态时,便知道任务已成功完成,于是Job打印一条消息告知用户,然后从wairForCompetion()方法返回。Job的统计信息和计数值也在这时输出到控制台。
- 如果jobtracker有相应的设置,也会发送一个HTTP作业通知。
- 最后,jobtracker清空作业的工作状态。
作业的调度
FIFO Scheduler
- 这个调度是Hadoop默认的 ,使用FIFO调度算法来运行Job,并且可以设置优先级,但是这个FIFO调
度并不支持抢占,所以后来的高优先级的Job仍然会被先来低优先级的Job所阻塞。
Fari Scheduler
- Fair Scheduler的目标是让每个用户公平的享有集群当中的资源,多个Job提交过来后,空闲的任务槽资源可以以“让每个用户公平共享集群”的原则被分配,某个用户一个很短的Job将在合理时间内完成,即便另一个用户有一个很长的Job正在运行。
- 一般Job都放在Job池当中,默认时,每个用户都有自己的Job池,当一个用户ᨀ交的Job数超过另一个用户时,不会因此得到更多的集群资源。
- 另外Fair Scheduler支持抢占,如果一个池的资源未在一段时间内公平得到集群资源,那么Fair Scheduler会从终止得到多余集群资源的Task,分给前者。
Capacity Scheduler
- Capacity Scheduler(容量调度器)中,集群资源会有很多队列,每个队列有一定的分配能力,在每个队列内会按照FIFOScheduler去分配集群资源。