Container启动

YARN的Container启动涉及资源本地化、启动运行和资源回收三个阶段,由ResourceLocalizationService和ContainersLauncher等组件协作完成。资源本地化下载公共和私有资源,启动Container通过ContainersLauncher写入shell命令并由ContainerExecutor执行。资源回收则负责清理资源。YARN对内存和CPU使用不同的隔离方案,内存通过进程监控,CPU使用Cgroups。ApplicationMaster与NodeManager和ResourceManager通信,通过心跳提交和获取Container,心跳信息包含资源需求和容器状态。
摘要由CSDN通过智能技术生成

Container启动

  Container启动命令是由各个ApplicationMaster通过RPC函数ContainerManager.startContainer()向NodeManager发起的,Container启动过程主要经历三个阶段:资源本地化启动并运行container资源回收。其中,资源本地化指创建container工作目录,从HDFS下载运行container所需的各种资源(jar包、可执行文件等)等,而资源回收则是资源本地化的逆过程,它负责清理各种资源,它们均由ResourceLocalizationService服务完成的。启动container是由ContainersLauncher服务完成的,而运行container是由插拔式组件ContainerExecutor完成的,YARN提供了两种ContainerExecutor实现,一种是DefaultContainerExecutor,另一种是LinuxContainerExecutor。

资源本地化
  资源本地化是指准备container运行所需的环境,包括创建container工作目录,从HDFS下载运行container所需的各种资源(jar包、可执行文件等)等。
  YARN将资源分为两类,一类是public级别的资源,这类资源被放到一个公共目录下,由所有用户共享,另一类是private级别的资源,这类资源是用户私有的,只能在所属用户的各个作业间共享。资源本地化过程实际上就是准备public和private资源的过程,它由ResourceLocalizationService服务完成,其中,所有application的public资源由专门的线程PublicLocalizer下载完成,该线程内部维护了一个线程池以加快资源下载速度,每个application的private资源由一个专门的线程LocalizerRunner下载完成。

启动并运行Container
  启动Container是由ContainersLauncher完成的,该过程主要工作是将运行container对应的完整shell命令写到私有目录下的launch_container.sh中,并将token文件写到container_tokens中。之所以要将container运行命令写到launch_container.sh中,然后通过运行shell脚本的形式运行container,主要是因为直接执行命令可能会有些特殊符号不识别。
  而运行container是由插拔式组件ContainerExecutor完成的,YARN提供了两种ContainerExecutor实现,一种是DefaultContainerExecutor,另一种是LinuxContainerExecutor。DefaultContainerExecutor只是简单的以管理员身份运行launch_container.sh脚本,而LinuxContainerExecutor则是以container所属用户身份运行该脚本,它是Hadoop引入安全机制后加入的。

资源回收
  资源回收由ResourceLocalizationService服务完成的,该过程与资源本地化正好相反,它负责撤销container运行过程中使用的各种资源。

资源隔离方案
  YARN对内存资源和CPU资源采用了不同的资源隔离方案。对于内存资源,为了能够更灵活的控制内存使用量,YARN采用了进程监控的方案控制内存使用,即每个NodeManager会启动一个额外监控线程监控每个container内存资源使用量,一旦发现它超过约定的资源量,则会将其杀死。采用这种机制的另一个原因是java中创建子进程采用了fork()+exec()的方案,子进程启动瞬间,它使用的内存量与父进程一致,从外面看来,一个进程使用内存量可能瞬间翻倍,然后又降下来,采用线程监控的方法可防止这种情况下导致swap操作。对于CPU资源,则采用了Cgroups进行资源隔离。

源码分析

ApplicationMaster的主要逻辑:
ApplicationMaster与 NodeManager通信
  ApplicationMaster与 NodeManager通过 NMClientAsync 通信,后者需要调用方提供一个回调类,NodeManager会在合适的时机调用回调类中的方法来通知 ApplicationMaster。回调类被ApplicationMaster实现为 NMCallbackHandler ,其中最重要的两个函数是:

  • onContainerStarted() ,当 NodeManager新启动了 Containers 时,会调用该方法,把 Container 列表传给它
  • onContainerStopped() ,当 NodeManager停止了一些 Containers 时,会调用该方法,把 Container 列表传给它

ApplicationMaster与ResourceManager 通信
  Appli

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值