hadoop 学习笔记(二)MapReduce的工作机制
来源:互联网 发布:betterfps用什么算法 编辑:程序博客网 时间:2024/06/05 09:15
图1 Hadoop运行MapReduce作业的工作原理
作业的提交
JobClient的runJob()方法是用于新建JobClient实例并调用其submitJob()方法的便捷方式(步骤1)。提交作业后,runJob()每秒轮询作业的进度,如果发现上次报告后有改变,便把进度报告到控制台。作业完成后,如果成功,就显示作业计数器。如果失败,导致作业失败的错误被记录到控制台。
JobClient的submitJob()方法所实现的作业提交过程如下。
- 向JobTracker请求一个新的作业ID(步骤2)。
- 检查作业的输出说明。例如,如果没有指定输出目录或输出目录已经存在,作业就不提交,错误抛回给MapReduce程序。
- 计算作业的输入分片。如果分片无法计算,比如因为输入路径不存在,作业就不提交,错误抛回给MapReduce程序。
- 将运行所需的资源(包括作业JAR文件、配置文件和计算所得的输入分片)复制到一个以作业ID命名的目录下jobtracker的文件系统中。作业JAR的副本较多(由mapred.submit.replication属性控制,默认值为10),因此在运行作业的任务时,集群中有很多个副本可提供tasktracker访问。(步骤3)
- 告知jobtracker作业准备执行(通过调用JobTracker的submitJob()方法实现)。(步骤4)
当JobTracker接收到对其submitJob()方法的调用后,会把此调用放入一个内部队列中,交由作业调度器进行调度,并对其进行初始化。(步骤5)。
为了创建任务运行列表,作业调度器首先从共享文件系统中获取JobClient已计算好的输入分片信息(步骤6)。然后为每个分片创建以一个map任务。创建的reduce任务的数量由JobConf的mapred.reduce.task属性决定,然后调用器创建相应数量的要运行的reduce任务。任务在此时被指定ID。
任务的分配
tasktracker运行一个简单的循环来定期发送“心跳”给jobtracker。“心跳”告知JobTracker,TaskTracker是否还存活,同时也充当两者之间的消息通道。作为“心跳”的一部分,TaskTracker会指明是否已经准备好运行新的任务,如果是,JobTtracker会为它分配一个任务,并使用"心跳"的返回值与TaskTracker进行通信(步骤7)。
对于map任务和reduce任务,tasktracker有固定数量的任务槽。例如,一个TaskTracker可能同时运行两个map任务和两个reduce任务。准确的数量由tasktracker核数量和内存大小来决定。
为了选择一个reduce任务,jobTracker简单地从待运行的reduce任务列表中选取下一个来执行,不用考虑数据的本地化。然而对于一个map任务,JobTracker会考虑tasktracker的网络设置,并选取一个距离其输入分片文件最近的TaskTracker。在最理想的情况下,任务是数据本地化的。同样,任务也可能是机架本地化的:任务和输入分片在同一个机架,但不在同一节点上。
任务的执行
现在,TaskTracker已经被分配了一个任务,下一步是运行该任务。第一步,通过从共享文件系统把作业的JAR文件复制到TaskTracker所在的文件系统中,从而实现作业的JAR文件本地化。同时,TaskTracker将应用程序所需要的全部文件从分布式缓存复制到本地磁盘(步骤8)。第二步,TaskTracker为任务新建一个本地工作目录,并把JAR文件中的内容解压到这个文件夹下。第三步,TaskTracker新建一个TaskRunner实例来运行该任务。
TaskRunner启动一个新的JVM(步骤9)来运行每个任务(步骤10),以便用户定义的map和reduce函数的任何软件问题都不会影响到TaskTracker(例如导致崩溃或挂起)。但在不同任务之间重用JVM还是可能的。
子进程通过umbilical接口与父进程进行通信。
- Streaming 和Pipes
Streaming 和Pipes都运行特殊的map和reduce任务,目的是运行用户提供的可执行程序,并与之通信。
在Streaming中,任务使用标准输入和输出Streaming与进程(可以用任何语言编写)进行通信。另一方面,Pipes任务则监听套接字(socket),发送其环境中的一个端口号给C++进程,如此一来,在开始时,C++进程即可建立一个与其父Java Pipes任务的持久化套接字连接。
在这两种情况下,在任务执行过程中,Java进程都会把输入键/值对传回Java进程。从TaskTracker的角度来看,就像taskTracker的子进程自己在处理map或reduce代码一样。
作业的完成
当JobTracker收到作业最后一个任务已完成的通知后,便把作业的状态设置为"成功"。然后,在JobClient查询状态时,便知道任务已经完成,于是JobClient打印一条消息告知用户,然后从runJob()方法返回。
失败
1. 任务失败
2. TaskTracker失败
3. JobTracker失败
JobTracker失败在所有失败中是最严重的一种。目前Hadoop没有处理JobTracker失败的机制---它是一个单点故障---因此在这种情况下,作业注定失败。这种失败的概率是很小的,因为具体某台机器失败的几率很小。 未来版本的Hadoop可能会通过运行多个JobTracker的方法来解决这个问题,任何时候,这些JobTracker中都只有一个是主JobTracker。可以使用ZooKeeper作为JobTracker的协调机制来决定哪个是主JobTracker。
- hadoop 学习笔记(二)MapReduce的工作机制
- Hadoop学习笔记(5) MapReduce工作机制
- Hadoop学习笔记一:MapReduce的工作机制
- hadoop学习笔记--7.MapReduce的工作机制
- 《hadoop权威指南》学习笔记-MapReduce工作机制(上)
- Hadoop学习笔记(一):MapReduce工作机制
- hadoop,MapReduce的工作机制
- Hadoop-MapReduce的工作机制
- Hadoop学习笔记(二):MapReduce的进度和状态
- Hadoop学习笔记(二):MapReduce的特性-计数器、排序
- hadoop 学习笔记 二 ----MapReduce
- Hadoop学习笔记(Map-Reduce的工作、调度机制)
- 【Hadoop权威指南】MapReduce的工作机制
- Hadoop学习笔记-MapReduce工作原理
- Hadoop回顾--MapReduce工作原理(二)
- Hadoop-hdfs和mapreduce学习笔记二
- Hadoop学习笔记(二)——MapReduce
- 笔记:Hadoop权威指南 第6章 MapReduce 的工作机制
- Highcharts学习笔记之一——饼图
- 智能电视应用适配指南
- 类加载器
- 巧用批处理和reg文件制作“假”病毒,请勿乱用
- 最短路 Dijkstra
- hadoop 学习笔记(二)MapReduce的工作机制
- WaitForSingleObject
- Class<Object>与Class<?>有何区别
- hdu 5124 离散化+头尾标记+快速读入+STL----map ,set
- JavaI/O相关知识总结
- CentOS 6.6 安装python2.7.9
- 【android】利用ContentObserver监听短信来获取验证码
- jquery实现checkbox全选
- 查询表名称和注释