《Hadoop权威指南》知识点整理3

MapReduce部分

MapReduce工作机制_作业运行机制

  1. Hadoop运行MapReduce作业的工作原理
    (1) Job创建实例,通过waitForCompletion()每秒轮询作业进度
    (2) 向ResourceManager请求一个新应用ID,用于MapReduce作业ID
    (3) 将运行作业所需要的资源复制到一个以作业ID命名的目录下的共享文件系统中
    (4) 调用ResourceManager的submitApplication()方法提交作业
    (5) ResourceManager将请求传递给YARN调度器,调度器分配一个容器,然后ResourceManager在节点管理器的管理下在容器中启动application master的进程
    (6) application master(主类为MRAppMaster的Java程序)接受来自Job的进度和完成报告
    (7) application master接受来自共享文件系统的、在客户端计算的输入分片。为每个分片创建一个map对象和reduce任务对象,分配任务ID。当作业很小,am判断在新的容器中分配和运行任务的开销大于并行运行它们的开销时,就选择将任务和自己在同一个JVM上运行,这种作业被称为uber任务。
    (8) 作业不适合作为uber任务时,am会向RM请求容器,map任务的优先级高于reduce任务
    (9) 一旦RM的调度器为任务分配了特定节点上的容器,am就通过与NodeManager通信来启动容器
    (10) 任务由主类为YarnChild的Java程序执行,首先将任务所需的资源本地化(作业配置、JAR文件、来自分布式缓存的文件)
    (11) 运行map任务或reduce任务
  2. Streaming运行特殊的map任务和reduce任务,运行用户提供的可执行程序并与之通信。在任务执行过程中,Java进程都会把输入键值对传递给外部的进程,后者通过用户定义的map函数和reduce函数来执行并把输出键值对传回Java进程
  3. MapReduce作业是长时间运行的批量作业
  4. am收到作业最后一个任务已完成的通知后会把作业状态设为成功,Job轮询时获知状态并告知用户。am和任务容器会清理其工作状态(中间输出将被删除),作业信息被历史服务器存档
  5. 一个作业和它的每个任务都有一个状态:运行中、成功完成、失败、map和reduce进度、作业计数器的值、状态消息或描述

MapReduce工作机制_失败

  1. 可能失败的实体:任务、application master、NodeManager、ResourceManager
  2. 任务运行失败:(1) map任务或reduce任务中的用户代码抛出运行异常;(2) Streaming进程以非零退出代码退出;(3) 由于JVM软件缺陷导致任务JVM突然退出;(4)任务挂起后,一旦am注意到有一段时间未收到进度更新(超时),便会将任务标记为失败,杀死任务JVM。am在被告知一个任务失败后会重新调度该任务的执行并避免在失败过的NM上重新调度,默认失败4次后不再重试。
  3. application master运行失败:YARN中的应用程序在运行失败后会有尝试机会,默认2次,am向RM发送周期性心跳,当am失败时RM会检测到该失败并在新的容器中开始新的master实例。作业初始化时,客户端向RM询问并缓存am的地址,使其向am查询时不必重载RM,若am运行失败,则客户端向am发出申请时超时,客户端会折回想RM重新请求新的am地址,该过程对用户透明
  4. NodeManager运行失败:NM失败后会停止向RM发送心跳信息,并且将其从自己的节点池中移除以调度启用容器。若应用程序的运行失败次数过高,那么该NM可能会被拉黑,即便该NM自己没有运行失败过
  5. ResourceManager运行失败:严重问题,作业和任务将无法启动。为获得高可用性(HA),双机热配置下运行一对RM是必要,若主RM失败则备份RM接管。所有运行中的应用程序信息存储在一个高可用的状态存储区中(Zookeeper或HDFS备份),新RM启动后从存储区获得数据,然后为应用程序重启am,并在接收到NM心跳信息后将NM信息快速重构。RM从备份机到主机的切换由故障转移控制器处理,使用Zookeeper的leader选举机制保证同一时刻只有一个主RM

MapReduce工作机制_shuffle和排序

  1. MapReduce确保每个reducer的输入都是按键排序的,而系统执行排序、将map输出作为输入传给reducer的过程称为shuffle。(从map产生输出到reduce消化输入的过程)
  2. map端:map的输出利用缓冲的方式写到内存并处于效率的考虑进行预排序。每个map任务有一个环形内存缓冲区用于存储任务输出,缓冲达到阈值则有后台线程把内容溢写(spill)(轮询方式)到磁盘(溢写过程中,map输出会继续写入缓冲区,若此时缓冲区填满,则map会被阻塞)。写磁盘前,线程首先将数据按要传的reducer划分成相应分区(partition),每个分区中的后台线程把键key在内存中排序,此时运行combiner函数会使map的输出更紧凑,减少写入到磁盘的数据和传递给reducer的数据。溢写如磁盘的为溢写文件(spill file),任务完成前,溢写文件会被合并成一个已分区且已排序的输出文件
  3. reduce端:map输出文件位于运行map任务的tasktracker的本地磁盘,tasktracker为分区文件运行reduce任务。每个map任务的完成时间可能不同,每个任务完成时,reduce任务就开始复制其输出(reduce的复制阶段)。若map输出够小则复制到reduce任务的JVM内存中,否则复制到磁盘(同map的spill)。当磁盘副本增多,后台线程会把他们合并为更大的已排序文件。复制完所有map输出后,reduce任务进入排序(合并)阶段,合并map的输出维持排序,最后将数据直接输入reduce函数。
  4. 调优:(1) 在给shuffle过程提供尽可能多的内存空间的同时,保证map函数和reduce函数能够得到足够的内存来运行,故写函数时尽量少使用内存。(2) map端避免多次溢写,估算map输出大小合理设置 mapreduce.task.io.sort.* 的属性(mapreduce.task.io.sort.mb属性为map输出时的内存缓冲区大小)。 (3) reduce端将更多的中间数据留在内存中即可获得更高性能,若reduce函数的内存需求不大,那么可以减小 mapreduce.reduce.input.buffer.percent (shuffle复制阶段分配给map输出缓冲区占堆空间的百分比)来提升性能

MapReduce工作机制_任务执行

  1. Hadoop为map任务或reduce任务提供运行环境相关信息
  2. MapReduce模型将作业分解为任务,然后并行地运行任务以使作业的整体执行时间少于各个任务顺序执行的时间
  3. Hadoop不会尝试诊断或修复执行慢的任务,相反会尽量检测并启动另一个相同的任务作为备份,即推测执行。其中一个任务成功完成后,任何在运行的重复任务会被中止(即便是原任务)。推测执行只是优化措施,不能使作业运行更可靠,以牺牲集群效率来减少作业执行时间。对于reduce任务,关闭推测执行有益(reduce要取得map输出,重复的reduce任务会大幅占用集群的网络传输)。