作业提交
- 创建一个job实例
- 向ResourceManage请求一个新应用ID
- 将运行所需要的资源复制到一个以作业ID命令的目录下的共享文件系统中
- 通过ResourceManage的submitApplication()方法提交作
作业初始化
- 将提交的作业请求传递给Yarn调度器,调度器分配一个容器,资源管理器在节点管理器的管理下,在容器中启动application Master进程
- application Master是一个JVM进程,主类是MRAppMaster,接受来自任务的进度和完成报告
- 接受来自共享文件系统的,在客户端计算的输入分片,对每一个分片创建一个map任务,以及reduce任务对象
- 如果作业不适合作为uber任务运行,则会为map和reduce任务向ResourceManage请求容器
任务的执行
- 一旦ResourceManage为任务分配容器后,application Master就通过NodeManager来启动容器
- 将任务需要的资源本地化(如:jar文件,缓存文件,配置)
- 运行map或reduce任务
进度和状态的更新
任务运行时,对其进度(progress,完成百分比)保持追踪,整个过程分为3个阶段,与shuffle的三个阶段相对应
当map或reduce任务运行时,子进程和自己的父application master通过umbilical接口通信
在作业期间,客户端每秒轮训一次application master,接收最新状态
作业完成
application master和任务容器清理其工作状态,commitJob()方法被调用,存档
失败
如果代码发生异常,任务JVM会在退出前向其父application master发送错误报告
如果一个任务失败过4次,将不会再重试
可设置任务失败最大百分比
被终止的任务尝试,不会被计入任务运行尝试次数
application master失败
节点管理器失败
资源管理器失败
可采用zookeeper构建高可用resourceManager
shuffle和排序
map端
- 利用缓冲的方式写到内存并处于效率考虑进行排序
- 每个map任务都有一个环形内存缓冲区用于存储任务输出,默认100MB,达到阈值开始把内存溢出到磁盘
- 写入磁盘前,根据最终要传的reduce把数据划分成相应分区partition,每个分区中,按键进行内存中排序,combiner
- 每次达到输出阈值,会新建一个溢出文件,在任务完成之前,合并已排序的输出文件
reduce端
- 复制map的输出后,reduce进入合并阶段,复制阶段可用解压缩节省效率
- 对已排序输出中的每个键调用reduce函数,输出直接写入文件系统
配置调优
总的原则是给shuffle过程尽量多的提供内存空间
- map端,可通过避免多次溢出写磁盘获得最佳性能,估算map输出大小,可计算作业运行整个阶段汇总溢出写磁盘的记录数
- reduce端,中间数据驻留在内存时,就能获得最佳性能.
任务执行
推测执行
Hadoop不会尝试诊断或修复执行慢的任务,相反,在一个任务运行比预期慢的时候,他会尽量检测,并启动
一个相同的任务作为备份,这就是“推测执行”
一个任务成功完成后,任何正在运行的重复任务都被终止
默认推测执行时启用的
对于reduce任务,关闭推测执行是有益的