33
MapReduce 运运运运 运运运 2013.04.11

MapReduce 运行机制

  • 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

Page 1: MapReduce 运行机制

MapReduce 运行机制

王陈林2013.04.11

Page 2: MapReduce 运行机制

CONTENTS

1 :作业的提交2 :作业的初始化3 :任务的分配4 :任务的执行5 :状态的更新6 :作业的结束

Page 3: MapReduce 运行机制

• Hadoop = HDFS + MapReduce• HDFS: NameNode, DataNode

0 、背景知识

Page 4: MapReduce 运行机制

• MapReduce: JobTracker, TaskTracker, Map-Reduce

Page 5: MapReduce 运行机制

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);

Page 6: MapReduce 运行机制

• 四个实体• JobClient• JobTracker• TaskTracker• HDFS

Page 7: MapReduce 运行机制

• 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()

Page 8: MapReduce 运行机制

2 、作业的初始化

一个 Job 封装对象,封装任务和记录信息 [5]

setuptask :创建输出目录和任务的临时工作目录,cleanuptask :删除临时工作目录。

获取分片信息,为每个输入分片创建一个 map 任务 [6]

数量由 mapred.reduce.task 来决定

为Job创建JobInProgress

创建setupTask和cleanupTask

创建Map Tasks

创建Reduce Tasks

将JobInProgress加入到作业队列

等待被调度等待被调度

Page 9: MapReduce 运行机制

3 、任务的分配

TaskTracker:请求任务

JobTraker:选择合适的任务

TaskTracker得到任务,准备执行

被动式;以 heartbeat 与 JobTracker 交流,汇报自己的情况(内存信息,任务槽信息等),表明能否运行新任务。[S7]

先选择 Job ,再选择 Job 下合适的任务来分配,涉及到Job 的调度和 Task 的选取。

Page 10: MapReduce 运行机制

Job 的调度• 默认的 FIFO 算法• Job 队列 + 优先级 (mapred.job.priority : VERY_HIGH, HIGH, NORMAL, LOW, or VERY_LOW)• 优点:简单• 缺点:不支持抢占,容易造成高优先级被阻塞。

• FairScheduler• 每个用户都有一个作业池,根据任务槽数设置池的容量,也可以设置池

的权重• 优点:支持抢占,让每个用户公平共享集群

• CapacityScheduler• 集群由很多队列组成,每个队列有一个分配能力,队列内部根据 FIFO 调

Page 11: MapReduce 运行机制

Task 的分配• 先 Map 槽后 Reduce 槽• 采取“数据就近”原则, data locality.• datalocality 等级:• Node-local :输入分片就在 Task Tracker 本地 • Rack-local : 输入分片在 Task Tracker 所在的 rack( 机架 ) 内其它 Task

Tracker 上 • Off-switch :输入分片在其它的 rack 内

• 理论上的缺陷: 跨 rack 取数据导致进度变慢

Page 12: MapReduce 运行机制

4 、任务的执行

将作业所需资源拷贝的本地

创建Task工作目录

创建TaskRunner运行任务

job.jar 文件,分布式缓存上任务所需要的资源复制到本地磁盘

为 task 创建工作目录,解压 jar 包到其下

启动新的 JVM[S9] ,运行任务 [S10]

Page 13: MapReduce 运行机制

Job 的执行过程

Page 14: MapReduce 运行机制

Shuffle• 为了确保每个 reducer 的输入都按键排序,将 map 的输出作为输

入传输给 reducer 的过程—称为 shuffle.

Page 15: MapReduce 运行机制

Map 端

• 整体概述:• 每个 map task 都有一个内存缓冲区,存储

着 map 的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个 map task 结束后再对磁盘中这个 map task 产生的所有临时文件做合并,生成最终的正式输出文件,然后等待 reduce task 来拉取。

Memory Buffer

Map

ʒ input

ʓ partition

ʔ Sort & Combiner

ʕ Merge

Page 16: MapReduce 运行机制

Map 端

Memory Buffer

Map

ʒ input

ʓ partition

ʔ Sort & Combiner

ʕ Merge

map task 读取 split 到内存

Page 17: MapReduce 运行机制

Map 端

Memory Buffer

Map

ʒ input

ʓ partition

ʔ Sort & Combiner

ʕ Merge

提供 Partitioner 接口,可自定义;默认hash(key)/reduce_task_num

Partition

写入到内存缓冲区

<key, value>

<key, value, partitition>

Page 18: MapReduce 运行机制

Map 端

Memory Buffer

Map

ʒ input

ʓ partition

ʔ Sort & Combiner

ʕ Merge

默认 100M * 0.8缓冲区超过阈值

启动溢写线程

80M分区&内排序

Combiner

写入到磁盘溢写文件

按 partition 值分区

Combiner 合并中间结果, “ aaa”/1, ”aaa”/1 → ”aaa”/2

Spill

Page 19: MapReduce 运行机制

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最终输出文件 一个已分区已排序的输出文件

Page 20: MapReduce 运行机制

Reduce 端

有一个完成就开始复制检测到有map任务完成

启动copy线程

拷贝map输出到内存缓冲区

多线程复制,默认 5mapred.reduce.parallel.copies

Page 21: MapReduce 运行机制

Reduce 端

③ 形成 Reducer的输入文件

0.7 * maxHeap * 0.66缓冲区超过阈值

启动溢写线程

内排序

Combiner

写入到磁盘溢写文件

Page 22: MapReduce 运行机制

Reduce 端

同于map 端④步

Page 23: MapReduce 运行机制

• 状态组成:• 作业任务的状态 ( 运行状态,成败状态 ) ; Map 和 reduce 的进度;作业

计数器的值;状态消息或描述•构成进度的操作:• 读入一条输入记录• 写入一条输出记录• 在一个 Reporter 中设置状态描述 (Reporter.setStatus())• 增加计数器 (Reporter. incrCounter())• 调用 Reporter 的 progress() 任务 (Reporter. progress())

4 、状态的更新

Page 24: MapReduce 运行机制

任务进度的计算• Map 任务:• 已处理输入所占的比例

• Reduce 任务:• 整个过程分成三部分:复制、排序、处理输入• 每个过程各占 1/3• eg :处理了一半的输入,则进度为 5/6

Page 25: MapReduce 运行机制

状态更新的机制

任务设置标志

独立线程检测标志

TaskTracker heartbeats上报

JobTracker整合状态信息

JobClient查询状态

Task 进度发生变化,设置状态更新标志。

一个独立线程每隔 3秒检查一次此标志,如果已设置,则告知tasktracker 当前任务状态。

Tasktracker 每隔 5秒,通过 heartbeats向 jobtracker 报告此节点的状态。

Jobtracker 整个状态,得到 Job 的全局视图。

JobClient.monitorAndPrintJob() 每秒查询这些信息。

Page 26: MapReduce 运行机制
Page 27: MapReduce 运行机制

• Job 的成功完成:• JobTracker 接收到最后一个任务的完成报告,设置 job 状态为 successful• Job从 waitForCompletion() 返回• 启动 cleanup 任务, JobTracker->finalizeJob(JobInProgress job)

• Job 的中止结束:• Web UI 或 命令行的方式 hadoop job -kill Job_ID

• Job 的失败告退:• 任务失败• JobTracker失败

• TaskTracker失败:不会导致 Job失败

4 、作业的结束

Page 28: MapReduce 运行机制

任务失败•异常错误:• Map或 Reduce 代码运行异常: task attempt标记 failed ,释放任务槽。• 子进程 JVM异常退出: task attempt标记 failed.

• 任务挂起:• TaskTracker长时间未收到进度更新,标记 failed ,杀死子进程 JVM.• mapred.task.timeout属性设置,默认为 10min.

• 任务中止:• Web UI 或 命令行的方式主动杀死 task attempt• 不会导致 Job失败

Page 29: MapReduce 运行机制

任务失败 ->Job失败• 最大失败次数:

• 任何一个任务失败次数大于允许的最大值,则 Job标记失败。• 设置:默认是 4 mapred.map.max.attempts

mapred.reduce.max.attempts

• 任务失败百分比:• 少数任务失败不导致整个 Job失败。• 设置: mapred.max.map.failures.percent

mapred.max.reduce.failures.percent

Page 30: MapReduce 运行机制

TaskTracker失败•停止发送 heartbeats超出时限:• 设置: mapred.tasktracker.expiry.interval. 默认 10min.• 将其从等待调度的 TaskTracker 池中移除• 已完成和进行中的任务重新调度运行

• TaskTracker Blacklists :• 来自同一 job 的任务在此 TaskTracker失败个数,超过阈值,则被该 job加入黑名单 : mapred.max.tracker.failures , 4

Page 31: MapReduce 运行机制

JobTracker失败• 单点失败, Job注定失败,概率小•没有处理 JobTracker失败的机制

• 新一代架构 YARN : 0.23• 让 JobTracker 重启,正在执行的 job 也重新 submit 。• 设置: mapred.jobtracker.restart.recover

Page 32: MapReduce 运行机制

Job 提交 Job 初始化

Task 的分配

Task 的执行状态更新Job 结束

Page 33: MapReduce 运行机制

谢谢