文章目录

  • 概览
  • ResourceManager Restart
  • Non-work-preserving RM restart
  • Work-preserving RM restart
  • 配置Restart
  • 基于zk的配置
  • 配置NodeManager Restart


概览

在YANR的管理和调度下,任务的am与task失败均会重试,使其有很好的容错性。但是默认情况下,如果服务重启,正在运行的任务都会失败且无法恢复。HA可以使另一个在故障时接管服务,不影响调度,但是restart特性可以在两者同时重启时,也能够有容错性,并且可以不需要重新再提交作业。

ResourceManager Restart

有两种类型:

Non-work-preserving RM restart

当application提交时,RM会持久化application的信息、状态及其他认证信息到state-store中。当RM因为某种原因重启(包括切主)后,它将从中重新加载这些信息,并且重启开始运行之前正在运行的applications。这样用户不需要重新提交作业。

  1. RM持久化数据到state-store:客户端提交作业时的元数据、作业的最终状态信息(完成状态,failed、killed or finished)和诊断信息、有关安全的凭据信息。
  2. 当RM shut down(切主)时,NodeManagers和clients会在RM 挂掉的时间内一直轮询RM直到其服务正常。当RM 正常后,会加载上述存储在state-store中的元数据到内存中。
  3. RM通过心跳发送re-sync信息到NodeManagers和ApplicationMasters,ApplicationMasters收到信息后将kill掉,NodeManagers也将kill掉自己管理的容器并将自己重新注册到RM。
  4. 之后RM会为每个未完成的application创建一个attempt并重新运行它们。(这种方式并不会保留之前的完成的一部分工作,因为是被re-sync kill的)

Work-preserving RM restart

第二种会通过NodeManagers上的container状态以及来自ApplicationMasters的container请求来重建任务的状态。简单来说,相比较上一种,除了简单保存作业的状态及认证信息外,还会保存任务运行的信息与状态。这样当RM因为某种原因重启后,此时之前运行的applications并不会被kill,而是会继续接着运行。

  1. 持久化信息到state-store。但比第一种方式的信息更多,包括所有container的生命周期及状态,application的资源请求,队列资源使用等等。
  2. 当RM shut down(切主)时,NodeManagers和clients会在RM 挂掉的时间内一直轮询RM直到其服务正常。当RM 正常后,会加载上述存储在state-store中的元数据到内存中
  3. RM通过心跳发送re-sync信息到NodeManagers和ApplicationMasters,此时ApplicationMaster并不会kill。并且NodeManager也不会kill container,还会继续向RM发送container的信息。
  4. RM通过元数据及来自NodeManager的信息重建container和相关的application的调度状态。(同时,因为之前的请求可能因为RM挂掉而丢失,ApplicationMaster也将重新发送未完成的资源请求到RM。这一切都是透明自动的)
  5. application将从中断的地方开始恢复。

如果启用,containerid格式将改变

Container_{clusterTimestamp}{appId}{attemptId}_{containerId}

Container_e{epoch}{clusterTimestamp}{appId}{attemptId}{containerId}

(如Container_e17_1410901177871_0001_01_000005,RM每重启一次epoch单调递增)

配置Restart

启用特性:

  • yarn.resourcemanager.recovery.enabled true

state-store的实现有三种:

yarn.resourcemanager.store.class

  1. org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore:将信息存储在HDFS或本地FS。不支持Fencing机制。
  2. org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore:存储在zookeeper。在HA时必须使用此种实现,因为zk支持fencing机制来防止脑裂。
  3. org.apache.hadoop.yarn.server.resourcemanager.recovery.LeveldbRMStateStore:相比较zk和HDFS更轻量,存储在Leveldb。更好的原子性支持,更少的IO和文件。但是不支持fencing机制。

基于zk的配置

hadoop.zk.address 指定zk的地址

yarn.resourcemanager.zk-state-store.parent-path 指定存储的znode路径

hadoop.zk.num-retries 丢失连接时重试次数

hadoop.zk.retry-interval-ms 重试间隔时间

hadoop.zk.timeout-ms session超时时间

NodeManager Restart:

同样,NM也有类似的特性。可以通过本地存储的信息实现Restart后不丢失正在运行的container。

配置NodeManager Restart

  • 启用特性

yarn.nodemanager.recovery.enabled true

  • 配置路径

yarn.nodemanager.recovery.dir 自定义 默认是$hadoop.tmp.dir/yarn-nm-recovery

  • 启用监视

防止NM restart时 container被清理

yarn.nodemanager.recovery.supervised true

  • 配置RPC地址

yarn.nodemanager.address 0.0.0.0:45454 (默认是临时端口,每次重启会随机。建议端口自定义)