Upload
raina
View
113
Download
0
Embed Size (px)
DESCRIPTION
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 (); - PowerPoint PPT Presentation
Citation preview
MapReduce 运行机制
王陈林2013.04.11
CONTENTS
1 :作业的提交2 :作业的初始化3 :任务的分配4 :任务的执行5 :状态的更新6 :作业的结束
• Hadoop = HDFS + MapReduce• HDFS: NameNode, DataNode
0 、背景知识
• MapReduce: JobTracker, TaskTracker, Map-Reduce
Configuration conf = getConf();Job job=new Job(conf,"Count the words");// 指定作业代码job.setJarByClass(FirstHadoopProgram.class);// 设置 mapjob.setMapperClass(MyMapper.class);// 设置 combinerjob.setCombinerClass(MyCombiner.class);// 设置 partitionerjob.setPartitionerClass(MyPartitioner.class);// 设置 reducejob.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
• JobClient.submitJobInternal(conf) 方法返回一个 RunningJob 对象 .[S1]
1 、作业的提交
jobID:job_201101281410_0001
包括作业 jar 文件 job.jar ,配置文件 job.xml 和计算所得的输入分片 job.split )复制到 HDFS 以 job id 命名的目录下
向JobTracker申请JobID[S2]
检查Job的输出配置
计算Job的输入分片
生成Job的job.xml
运行资源复制到HDFS[S3]
向JobTracker 提交Job[S4] jobSubmitClient.submitJob()
2 、作业的初始化
一个 Job 封装对象,封装任务和记录信息 [5]
setuptask :创建输出目录和任务的临时工作目录,cleanuptask :删除临时工作目录。
获取分片信息,为每个输入分片创建一个 map 任务 [6]
数量由 mapred.reduce.task 来决定
为Job创建JobInProgress
创建setupTask和cleanupTask
创建Map Tasks
创建Reduce Tasks
将JobInProgress加入到作业队列
等待被调度等待被调度
3 、任务的分配
TaskTracker:请求任务
JobTraker:选择合适的任务
TaskTracker得到任务,准备执行
被动式;以 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 、任务的执行
将作业所需资源拷贝的本地
创建Task工作目录
创建TaskRunner运行任务
job.jar 文件,分布式缓存上任务所需要的资源复制到本地磁盘
为 task 创建工作目录,解压 jar 包到其下
启动新的 JVM[S9] ,运行任务 [S10]
Job 的执行过程
Shuffle• 为了确保每个 reducer 的输入都按键排序,将 map 的输出作为输
入传输给 reducer 的过程—称为 shuffle.
Map 端
• 整体概述:• 每个 map task 都有一个内存缓冲区,存储
着 map 的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个 map task 结束后再对磁盘中这个 map task 产生的所有临时文件做合并,生成最终的正式输出文件,然后等待 reduce task 来拉取。
Memory Buffer
Map
ʒ input
ʓ partition
ʔ Sort & Combiner
ʕ Merge
Map 端
Memory Buffer
Map
ʒ input
ʓ partition
ʔ Sort & Combiner
ʕ Merge
map task 读取 split 到内存
Map 端
Memory Buffer
Map
ʒ input
ʓ partition
ʔ Sort & Combiner
ʕ Merge
提供 Partitioner 接口,可自定义;默认hash(key)/reduce_task_num
Partition
写入到内存缓冲区
<key, value>
<key, value, partitition>
Map 端
Memory Buffer
Map
ʒ input
ʓ partition
ʔ Sort & Combiner
ʕ Merge
默认 100M * 0.8缓冲区超过阈值
启动溢写线程
80M分区&内排序
Combiner
写入到磁盘溢写文件
按 partition 值分区
Combiner 合并中间结果, “ aaa”/1, ”aaa”/1 → ”aaa”/2
Spill
Map 端
Memory Buffer
Map
ʒ input
ʓ partition
ʔ Sort & Combiner
ʕ Merge
io.sort.factor; 默认10
“aaa”/5, ”aaa”/8 → {“aaa”, [5, 8, …]}
{“aaa”, 13}
多路读取溢写文件
按分区Merge成Group
Combiner
map最终输出文件 一个已分区已排序的输出文件
Reduce 端
有一个完成就开始复制检测到有map任务完成
启动copy线程
拷贝map输出到内存缓冲区
多线程复制,默认 5mapred.reduce.parallel.copies
Reduce 端
③ 形成 Reducer的输入文件
0.7 * maxHeap * 0.66缓冲区超过阈值
启动溢写线程
内排序
Combiner
写入到磁盘溢写文件
Reduce 端
同于map 端④步
• 状态组成:• 作业任务的状态 ( 运行状态,成败状态 ) ; Map 和 reduce 的进度;作业
计数器的值;状态消息或描述•构成进度的操作:• 读入一条输入记录• 写入一条输出记录• 在一个 Reporter 中设置状态描述 (Reporter.setStatus())• 增加计数器 (Reporter. incrCounter())• 调用 Reporter 的 progress() 任务 (Reporter. progress())
4 、状态的更新
任务进度的计算• Map 任务:• 已处理输入所占的比例
• Reduce 任务:• 整个过程分成三部分:复制、排序、处理输入• 每个过程各占 1/3• eg :处理了一半的输入,则进度为 5/6
状态更新的机制
任务设置标志
独立线程检测标志
TaskTracker heartbeats上报
JobTracker整合状态信息
JobClient查询状态
Task 进度发生变化,设置状态更新标志。
一个独立线程每隔 3秒检查一次此标志,如果已设置,则告知tasktracker 当前任务状态。
Tasktracker 每隔 5秒,通过 heartbeats向 jobtracker 报告此节点的状态。
Jobtracker 整个状态,得到 Job 的全局视图。
JobClient.monitorAndPrintJob() 每秒查询这些信息。
• Job 的成功完成:• JobTracker 接收到最后一个任务的完成报告,设置 job 状态为 successful• Job从 waitForCompletion() 返回• 启动 cleanup 任务, JobTracker->finalizeJob(JobInProgress job)
• Job 的中止结束:• Web UI 或 命令行的方式 hadoop job -kill Job_ID
• Job 的失败告退:• 任务失败• JobTracker失败
• TaskTracker失败:不会导致 Job失败
4 、作业的结束
任务失败•异常错误:• 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
Job 提交 Job 初始化
Task 的分配
Task 的执行状态更新Job 结束
谢谢