330 likes | 584 Views
MapReduce 运行机制. 王陈林 2013.04.11. 1 : 作业的提交. 2 : 作业的 初始化. 3 : 任务的分配. 4 : 任务的执行. 5 : 状态的更新. 6 : 作业的结束. CONTENTS. 0 、背景知识. Hadoop = HDFS + MapReduce HDFS: NameNode , DataNode. MapReduce : JobTracker , TaskTracker , Map-Reduce. Configuration conf = getConf ();
E N D
MapReduce运行机制 王陈林 2013.04.11
1:作业的提交 2:作业的初始化 3:任务的分配 4:任务的执行 5:状态的更新 6:作业的结束 CONTENTS
0、背景知识 • Hadoop = HDFS + MapReduce • HDFS: NameNode, DataNode
Configuration conf = getConf(); Job job=new Job(conf,"Count the words"); //指定作业代码 job.setJarByClass(FirstHadoopProgram.class); //设置map job.setMapperClass(MyMapper.class); //设置combiner job.setCombinerClass(MyCombiner.class); //设置partitioner job.setPartitionerClass(MyPartitioner.class); //设置reduce job.setReducerClass(MyReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); //设置输入输出 FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job,new Path(args[1])); System.exit(job.waitForCompletion(true)?1:0);
四个实体 • JobClient • JobTracker • TaskTracker • HDFS
1、作业的提交 • JobClient.submitJobInternal(conf)方法返回一个RunningJob对象.[S1] jobID:job_201101281410_0001 包括作业jar文件job.jar,配置文件job.xml和计算所得的输入分片job.split)复制到HDFS以job id命名的目录下 jobSubmitClient.submitJob()
2、作业的初始化 一个Job封装对象,封装任务和记录信息[5] setuptask:创建输出目录和任务的临时工作目录, cleanuptask:删除临时工作目录。 获取分片信息,为每个输入分片创建一个map任务[6] 数量由mapred.reduce.task来决定
3、任务的分配 被动式;以heartbeat与JobTracker交流,汇报自己的情况(内存信息,任务槽信息等),表明能否运行新任务。[S7] 先选择Job,再选择Job下合适的任务来分配,涉及到Job的调度和Task的选取。
Job的调度 • 默认的FIFO算法 • Job队列 + 优先级(mapred.job.priority:VERY_HIGH, HIGH, NORMAL, LOW, or VERY_LOW) • 优点:简单 • 缺点:不支持抢占,容易造成高优先级被阻塞。 • FairScheduler • 每个用户都有一个作业池,根据任务槽数设置池的容量,也可以设置池的权重 • 优点:支持抢占,让每个用户公平共享集群 • CapacityScheduler • 集群由很多队列组成,每个队列有一个分配能力,队列内部根据FIFO调度
Task的分配 • 先Map槽后Reduce槽 • 采取“数据就近”原则,data locality. • datalocality等级: • Node-local:输入分片就在Task Tracker本地 • Rack-local: 输入分片在Task Tracker所在的rack(机架)内其它Task Tracker上 • Off-switch:输入分片在其它的rack内 • 理论上的缺陷:跨rack取数据导致进度变慢
4、任务的执行 job.jar文件,分布式缓存上任务所需要的资源复制到本地磁盘 为task创建工作目录,解压jar包到其下 启动新的JVM[S9],运行任务[S10]
Shuffle • 为了确保每个reducer的输入都按键排序,将map的输出作为输入传输给reducer的过程—称为shuffle.
Map端 • 整体概述: • 每个map task都有一个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个map task结束后再对磁盘中这个map task产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task来拉取。
Map端 map task读取split到内存
Map端 提供Partitioner接口,可自定义;默认hash(key)/reduce_task_num
Map端 Spill 默认100M * 0.8 按partition值分区 Combiner合并中间结果, “aaa”/1, ”aaa”/1 → ”aaa”/2
Map端 io.sort.factor; 默认10 “aaa”/5, ”aaa”/8 → {“aaa”, [5, 8, …]} {“aaa”, 13} 一个已分区已排序的输出文件
Reduce端 有一个完成就开始复制 多线程复制,默认5 mapred.reduce.parallel.copies
Reduce端 ③形成Reducer的输入文件 0.7 * maxHeap * 0.66
Reduce端 同于map端④步
4、状态的更新 • 状态组成: • 作业任务的状态(运行状态,成败状态);Map和reduce的进度;作业计数器的值;状态消息或描述 • 构成进度的操作: • 读入一条输入记录 • 写入一条输出记录 • 在一个Reporter中设置状态描述(Reporter.setStatus()) • 增加计数器(Reporter. incrCounter()) • 调用Reporter的progress()任务(Reporter. progress())
任务进度的计算 • Map任务: • 已处理输入所占的比例 • Reduce任务: • 整个过程分成三部分:复制、排序、处理输入 • 每个过程各占1/3 • eg:处理了一半的输入,则进度为5/6
状态更新的机制 Task进度发生变化,设置状态更新标志。 一个独立线程每隔3秒检查一次此标志,如果已设置,则告知tasktracker当前任务状态。 Tasktracker每隔5秒,通过heartbeats向jobtracker报告此节点的状态。 Jobtracker整个状态,得到Job的全局视图。 JobClient.monitorAndPrintJob()每秒查询这些信息。
4、作业的结束 • Job的成功完成: • JobTracker接收到最后一个任务的完成报告,设置job状态为successful • Job从waitForCompletion()返回 • 启动cleanup任务,JobTracker->finalizeJob(JobInProgress job) • Job的中止结束: • Web UI 或 命令行的方式hadoop job -kill Job_ID • Job的失败告退: • 任务失败 • JobTracker失败 • TaskTracker失败:不会导致Job失败
任务失败 • 异常错误: • Map或Reduce代码运行异常:task attempt标记failed,释放任务槽。 • 子进程JVM异常退出:task attempt标记failed. • 任务挂起: • TaskTracker长时间未收到进度更新,标记failed,杀死子进程JVM. • mapred.task.timeout属性设置,默认为10min. • 任务中止: • Web UI 或 命令行的方式主动杀死 task attempt • 不会导致Job失败
任务失败->Job失败 • 最大失败次数: • 任何一个任务失败次数大于允许的最大值,则Job标记失败。 • 设置:默认是4 mapred.map.max.attempts mapred.reduce.max.attempts • 任务失败百分比: • 少数任务失败不导致整个Job失败。 • 设置:mapred.max.map.failures.percent mapred.max.reduce.failures.percent
TaskTracker失败 • 停止发送heartbeats超出时限: • 设置:mapred.tasktracker.expiry.interval.默认10min. • 将其从等待调度的TaskTracker池中移除 • 已完成和进行中的任务重新调度运行 • TaskTracker Blacklists: • 来自同一job的任务在此TaskTracker失败个数,超过阈值,则被该job加入黑名单 :mapred.max.tracker.failures,4
JobTracker失败 • 单点失败,Job注定失败,概率小 • 没有处理JobTracker失败的机制 • 新一代架构YARN:0.23 • 让JobTracker重启,正在执行的job也重新submit。 • 设置:mapred.jobtracker.restart.recover