Hadoop(25)yarn工作机制

yarn工作机制

大致过程

image-20200216050627615

  1. MR程序提交到客户端所在的节点。
  2. YarnRunner向ResourceManager申请一个Application。
  3. RM将该应用程序的资源路径返回给YarnRunner。
  4. 该程序将运行所需资源提交到HDFS上。
  5. 程序资源提交完毕后,申请运行mrAppMaster。
  6. RM将用户的请求初始化成一个Task。
  7. 其中一个NodeManager领取到Task任务。
  8. 该NodeManager创建容器Container,并产生MRAppmaster。
  9. Container从HDFS上拷贝资源到本地。
  10. MRAppmaster向RM 申请运行MapTask资源。
  11. RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
  12. MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
  13. MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
  14. ReduceTask向MapTask获取相应分区的数据。
  15. 程序运行完毕后,MR会向RM申请注销自己。

详细过程

image-20200216051015959

  1. MR程序(可以理解成jar包)提交到客户端所在的节点,MR程序里面有一个Job.waitforcompletion()方法,这个方法会生成一个jobsummiter实例对象,然后这个过程还会通过jobsummiter调用runJob()方法。
  2. 客户端与ResourceManager进行通信,调用getApplication()方法申请一个应用,RM收到申请后,返回分配给客户端一个applicaion id
  3. 客户端判断MR程序的输入路径是否存在,若不存在则报错。然后客户端会计算分片信息,比如根据文件大小得到要多少个分片。
    4. 上述操作无误后,客户端把Job资源提交到hdfsJob资源包括jar包、job的配置信息(job.xml)、分片信息。
  4. 客户端summit提交 jobRM收到提交后,根据各个NodeManager上运行的资源状况向某个NM节点发送启动容器的请求,该NM收到RM的请求会启动一个容器Container。然后在该容器上启动一个MRAppMaster进程(进程运行在JVM虚拟机里)。
  5. MRAppMaster进行初始化,生成一些对象,用于记录task的完成情况。
  6. MRAppMasterhdfs获取分片信息(得知maptask个数)以及reducetask个数。
  7. MRAppMasterRM申请资源,启动容器,用于运行taskMRAppMaster会优先为Maptask申请资源。RM会返回要在哪几个Nodemanager开启容器、这个容器有多少资源等信息。
  8. MRAppMasterRM返回的所有NM节点,进行通信。NM收到信息后,就会在本地启动容器。
  9. 在容器内启用YarnChild类,从hdfs拉取job.jar包、配置信息等一些运行task的资源。然后每个容器就可以启动一个maptask了。
  10. 接下来maptask运行的过程,就跟我们前面的学的maptask工作机制一样了。
  11. 当整个job中的maptask的进程达到5%的时候,MRAppMaster就开始向RMreducetask申请资源,启动容器。(每个Maptask运行过程都会向MRAppMaster上报进度信息,进度信息可看成是已经输入的数据占所有数据的百分比)
  12. 然后RM再次返回要开启容器的NM节点信息,MRAppMaster再跟这些NM通信,NM启动容器,启用YarnChild,最后开启reducetask
  13. reducetask要从完成100%进度的maptask的所在节点拷贝数据过来自身所在节点。(maptask会向MRAppMaster上报进度信息,这些信息保存在MRAppMaster初始化生成的对象里,reducetask会不定期跟MRAppMaster通信,询问哪个maptask完成了)
  14. 接下来reducetask的过程就跟我们前面学的reducetask工作机制一样了,最终会把输出结果保存到hdfs里。

补充:

  • 每个task完成后,容器都会被释放掉。
  • 每个maptask完成后,maptask在本地磁盘产生的临时文件都会被删除掉
  • 程序运行完毕后,MR会向RM申请注销自己,MRAppMaster所在容器也会释放掉。
  • 我们在运行MR程序的时候可以发现,会打印一些进度、计数器等信息出来,这是因为每个task在运行过程都会向MRAppMaster上报,如果在编写MR程序的时候,为job.waitForCompletion();传入参数true,客户端就会每隔几秒向MRAppMaster获取最新进度信息,取到就打印出来。
  • MRAppMastermaptask申请资源时,会把maptask的要使用的数据分片的所在节点信息一带发送给RM,如果分片所在的节点的资源是足够使用的话,RM会优先考虑这些NM节点,这样maptask运行直接从本地磁盘读数据就可以了,更高效点,这是移动计算不移动数据的思想。
  • 企业生产当中,一般是一个节点(机器)同时运行datanode+namanode。效率更高点。
  • 如果task运行失败,MRAppMaster会知道,并会为task重新申请资源容器,且优先考虑其它的NM节点,每个task4次重试机会,如果超过4次,整个job失败。
  • MRAppMaster会向RM发送心跳,如果超过一定时间,RM没有收到心跳,会判断MRAppMaster挂掉了。如果MRAppMaster运行失败,会启动一个新容器,运行MRAppMaster。新的MRAppMaster可以得知之前的task完成情况,因为启用了历史日志服务,任务完成情况会记录在内。
  • maptaskreducetask的进度等信息都会保存在MRAppMaster初始化产生的对象里。
  • 每个job对应一个MRAppMaster
posted @ 2020-08-26 23:27  Whatever_It_Takes  阅读(312)  评论(0编辑  收藏  举报