文章目录
- 概览
- 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。这样用户不需要重新提交作业。
- RM持久化数据到state-store:客户端提交作业时的元数据、作业的最终状态信息(完成状态,failed、killed or finished)和诊断信息、有关安全的凭据信息。
- 当RM shut down(切主)时,NodeManagers和clients会在RM 挂掉的时间内一直轮询RM直到其服务正常。当RM 正常后,会加载上述存储在state-store中的元数据到内存中。
- RM通过心跳发送re-sync信息到NodeManagers和ApplicationMasters,ApplicationMasters收到信息后将kill掉,NodeManagers也将kill掉自己管理的容器并将自己重新注册到RM。
- 之后RM会为每个未完成的application创建一个attempt并重新运行它们。(这种方式并不会保留之前的完成的一部分工作,因为是被re-sync kill的)
Work-preserving RM restart
第二种会通过NodeManagers上的container状态以及来自ApplicationMasters的container请求来重建任务的状态。简单来说,相比较上一种,除了简单保存作业的状态及认证信息外,还会保存任务运行的信息与状态。这样当RM因为某种原因重启后,此时之前运行的applications并不会被kill,而是会继续接着运行。
- 持久化信息到state-store。但比第一种方式的信息更多,包括所有container的生命周期及状态,application的资源请求,队列资源使用等等。
- 当RM shut down(切主)时,NodeManagers和clients会在RM 挂掉的时间内一直轮询RM直到其服务正常。当RM 正常后,会加载上述存储在state-store中的元数据到内存中
- RM通过心跳发送re-sync信息到NodeManagers和ApplicationMasters,此时ApplicationMaster并不会kill。并且NodeManager也不会kill container,还会继续向RM发送container的信息。
- RM通过元数据及来自NodeManager的信息重建container和相关的application的调度状态。(同时,因为之前的请求可能因为RM挂掉而丢失,ApplicationMaster也将重新发送未完成的资源请求到RM。这一切都是透明自动的)
- 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
- org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore:将信息存储在HDFS或本地FS。不支持Fencing机制。
- org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore:存储在zookeeper。在HA时必须使用此种实现,因为zk支持fencing机制来防止脑裂。
- 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 (默认是临时端口,每次重启会随机。建议端口自定义)