Hadoop-2.4.1学习之ResourceManager重启,hadoop2.4.1


        ResourceManager是管理资源和调度运行在YARN上的应用程序的中央机构,因此在一个YARN集群中ResourceManager可能是单点故障的,即只存在一个ResourceManager,这样在该节点出现故障时,就需要尽快重启ResourceManager,以尽可能地减少损失。本文将学习ResourceManager重启的特性,该特性使ResourceManager在重启时可以继续运行,并且在ResourceManager处于故障时对最终用户不可见。

       ResourceManager重启可以划分为两个阶段。第一阶段,增强的ResourceManager(RM)将应用程序的状态和其它认证信息保存到一个插入式的状态存储中。RM重启时将从状态存储中重新加载这些信息,然后重新开始之前正在运行的应用程序,用户不需要重新提交应用程序。第二阶段,重启时通过从NodeManagers读取容器的状态和从ApplicationMasters读取容器的请求,集中重构RM的运行状态。与第一阶段不同的是,在第二阶段中,之前正在运行的应用程序将不会在RM重启后被杀死,所以应用程序不会因为RM中断而丢失工作。在Hadoop-2.4.0版本中实现了RM重启的第一阶段(第二阶段还未实现)。

        由于目前的版本中只实现了RM重启的第一阶段,因此只能对该阶段进行学习。通过上面的综述可知,RM在客户端提交应用时,将应用程序的元数据(如ApplicationSubmissionContext)保存到插入式的状态存储中,RM还保存应用程序的最终状态,如完成状态(失败, 被杀死, 执行成功),以及应用完成时的诊断。除此之外,RM还将在安全的环境中保存认证信息如安全密钥,令牌等。RM 任何时候关闭后,只要要求的信息(比如应用程序的元数据和运行在安全环境中的认证信息等)在状态存储中可用,在RM重启时,就可以从状态存储中获取应用程序的元数据然后重新提交应用。如果在RM关闭之前应用程序已经完成,不论是失败、被杀死还是执行成功,在RM重启后都不会再重新提交。

        NodeManagers和客户端在RM关闭期间将保持对RM的轮询,直到RM启动。当启动后,RM将通过心跳机制向正在与其会话的NodeManager和ApplicationMasters发送同步指令。目前NodeManager和ApplicationMaster处理该指令的方式为:NodeManager将杀死它管理的所有容器然后向RM重新注册,对于RM来说,这些重新注册的NodeManager与新加入的NodeManager相似。ApplicationMasters在接收到RM的同步指令后,将会关闭。在RM重启后,从状态存储中加载应用元数据和认证信息并放入内存后,RM将为每个还未完成的应用创建新的尝试。正如之前描述的,此种方式下之前正在运行的应用程序的工作将会丢失,因为它们已经被RM在重启后使用同步指令杀死了。

        在学习了RM重启的特性和机制后,接下来就是如何启用RM重启的特性,主要涉及了yarn-site.xml中的几个配置参数,如下:

  • yarn.resourcemanager.recovery.enabled:启用RM重启的功能,默认为false。
  • yarn.resourcemanager.store.class:用于状态存储的类,默认为org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore,基于Hadoop文件系统的实现。还可以为org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore,该类为基于ZooKeeper的实现。
  • yarn.resourcemanager.am.max-attempts:应用程序尝试的最大次数。该参数是对所有ApplicationMasters的全局设置,每个ApplicationMaster可以通过API指定自己的最大尝试次数,但不可以超过全局设置上限,如果超过了,RM将使用全局设置。默认值为2,允许AM至少尝试一次。

        当使用FileSystemRMStateStore做为状态存储时,还需要配置下面的参数:

  • yarn.resourcemanager.fs.state-store.uri:指向文件系统路径位置的URI,RM将存储状态到该路径中,默认为$hadoop.tmp.dir/yarn/system/rmstore,如果没有指定文件系统名称,将使用fs.defaultFS的值。
  • yarn.resourcemanager.fs.state-store.retry-policy-spec:Hadoop文件系统客户端重试策略规范,客户端重试总是启用的。规范以休眠时间和重试次数对的形式给出,如(t0, n0), (t1, n1), ...,第一个n0次重试平均休眠t0毫秒,接下来的n1次重试平均休眠t1毫秒,以此类推。默认值为(2000, 500)。

        当使用ZKRMStateStore做为状态存储时,需要配置下面这些参数:

  • yarn.resourcemanager.zk-address:被RM用于状态存储的ZooKeeper服务器的主机:端口号,多个ZooKeeper的话使用逗号分隔。
  • yarn.resourcemanager.zk-state-store.parent-path:存储RM状态的ZooKeeper Znode全路径。
  • yarn.resourcemanager.zk-num-retries:RM尝试连接ZooKeeper的次数,默认为500。
  • yarn.resourcemanager.zk-retry-interval-ms:重试连接ZooKeeper的间隔毫秒数,默认为2000毫秒。
  • yarn.resourcemanager.zk-timeout-ms:ZooKeeper会话超时的毫秒数,该参数被ZooKeeper使用以决定什么时候会话到期。当ZooKeeper在由该参数指定的会话超时时间内没有收到客户端的信息,那么会话到期。默认值为10000毫秒。
  • yarn.resourcemanager.zk-acl:用于在ZooKeeper znode上设置权限的ACL,默认值为world:anyone:rwcda。

相关内容