火龙果?整理 uml.org.cn
Hadoop的Map/Reduce框架也是基于这个原理实现的,下面简要介绍一下Map/Reduce框架主要组成及相互的关系。 1. Hadoop MapReduce作业的总体结构
运行于Hadoop的MapReduce应用程序最基本的组成部分包括一个Mapper和一个Reducer类,以及一个创建JobConf的执行程序,在一些应用中还可以包括一个Combiner类,它实际也是Reducer的实现。 1) JobTracker和TaskTracker
它们都是由一个master服务JobTracker和多个运行于多个节点的slaver服务TaskTracker两个类提供的服务调度的。master负责调度job的每一个子任务task运行于slave上,并监控它们,如果发现有失败的task就重新运行它,slave则负责直接执行每一个task。TaskTracker都需要运行在HDFS的DataNode上,而JobTracker则不需要,一般情况应该把JobTracker部署在单独的机器上。 2) JobClient
每一个job都会在用户端通过JobClient类将应用程序以及配置参数Configuration打包成jar文件存储在HDFS,并把路径提交到JobTracker的master服务,然后由master创建每一个Task(即MapTask和ReduceTask)将它们分发到各个TaskTracker服务中去执行。 3)JobInProgress
JobClient提交job后,JobTracker会创建一个JobInProgress来跟踪和调度这个job,并把它添加到job队列里。JobInProgress会根据提交的job jar中定义的输入数据集(已分解成FileSplit)创建对应的一批TaskInProgress用于监控和调度MapTask,同时在创建指定数目的TaskInProgress用于监控和调度ReduceTask,缺省为1个ReduceTask。 4)TaskInProgress
JobTracker启动任务时通过每一个TaskInProgress来launch Task,这时会把Task对象(即MapTask和ReduceTask)序列化写入相应的TaskTracker服务中,TaskTracker收到后会创建对应的TaskInProgress(此TaskInProgress实现非JobTracker中使用的
- 27 -
火龙果?整理 uml.org.cn
TaskInProgress,作用类似)用于监控和调度该Task。启动具体的Task进程是通过TaskInProgress管理的TaskRunner对象来运行的。TaskRunner会自动装载job jar,并设置好环境变量后启动一个独立的java child进程来执行Task,即MapTask或者ReduceTask,但它们不一定运行在同一个TaskTracker中。 5) MapTask和ReduceTask
一个完整的job会自动依次执行Mapper、Combiner(在JobConf指定了Combiner时执行)和Reducer,其中Mapper和Combiner是由MapTask调用执行,Reducer则由ReduceTask调用,Combiner实际也是Reducer接口类的实现。Mapper会根据job jar中定义的输入数据集按
图3.5Map/Reduce框架中主要组成和它们之间的关系图
- 28 -
火龙果?整理 uml.org.cn
用户可以配置和向框架提交MapReduce任务(简言之,作业)。一个MapReduce作业包括Map任务,混淆过程,排序过程和一套Reduce任务。然后框架会管理作业的分配和执行,收集输出和向用户传递作业结果。
一个作业的组成要素如表格3.2和图3.6所示。 表格 3.2 MapReduce任务的构成要素 要素 配置作业 输入分割和派遣 接受分割的输入后,每个Map任务的启动 Map函数,对于每个键值对被调用一次 混淆,分割和排序Map的输出并得到快 排序,将混淆的块进行组合和排序 接受排序快后,每个Reduce任务的启动 有谁处理 用户 Hadoop框架 Hadoop框架 用户 Hadoop框架 Hadoop框架 Hadoop框架 Reduce函数,对于每一个关键字和对象的所有数用户 据值被调用一次 收集输出结果,在输出目录存储输出结果,输出Hadoop框架 结果分为N个部分,N是Reduce任务的号码 用户负责处理作业初始化,指定输入位置,指定输入和确保输入格式和位置是正确无误的。框架负责在集群中TaskTracker节点上派遣作业,执行map过程,混淆过程,排序过程和Reduce过程,把输出写入输出目录,最后通知用户作业完成状态。
- 29 -
火龙果?整理 uml.org.cn
图3.6 MapReduce 流程
2. Job创建过程
1)JobClient.runJob() 开始运行job并分解输入数据集
一个MapReduce的Job会通过JobClient类根据用户在JobConf类中定义的InputFormat实现类来将输入的数据集分解成一批小的数据集,每一个小数据集会对应创建一个MapTask来处理。JobClient会使用缺省的FileInputFormat类调用
FileInputFormat.getSplits()方法生成小数据集,如果判断数据文件是isSplitable()的话,会将大的文件分解成小的FileSplit,当然只是记录文件在HDFS里的路径及偏移量和Split
- 30 -
相关推荐: