在Yarn中,ResourceManager重启是可以实现正在运行中的任务不失败的,不过首先要进行配置,具体的原理和配置如下:
| 由于Hadoop不同版本的原因,RM重启有两种不同的实现,两种实现的配置是一样的,只是原理不一样,我们分别来介绍。
|
|
第一种是在Hadoop 2.4.0版本实现的,官网称为 Non-work-preserving RM restart 即在重启过程中任务不保留。它的原理是当Client提交一个application给RM时,RM会将该application的相关信息存储起来,具体存储的位置是可以在配置文件中指定的,可以存储到本地文件系统上,也可以存储到HDFS或者是Zookeeper上,此外RM也会保存application的最终状态信息(faild,killed,finished),如果是在安全环境下运行,RM还会保存相关证书文件。
当RM被关闭后,NodeManager(以下简称NM)和Client由于发现连接不上RM,会不断的向RM发送消息,以便于能及时确认RM是否已经恢复正常,当RM重新启动后,它会发送一条re-sync(重新同步)的命令给所有的NM和ApplicationMaster(以下简称AM),NM收到重新同步的命令后会杀死所有的正在运行的
containers并重新向RM注册,从RM的角度来看,每台重新注册的NM跟一台新加入到集群中NM是一样的。AM收到重新同步的命令后会自行将自己杀掉。接下来,RM会将存储的关于application的相关信息读取出来,将在RM关闭之前最终状态为正在运行中的application重新提交运行。
第二种是在Hadoop 2.6.0版本中实现的,官网称为 Work-preserving RM restart 即在重启过程中任务是保留的。它与第一种不同的地方在于,RM会记录下container的整个生命周期的数据,包括application运行的相关数据,资源申请状况,队列资源使用状况等数据。如此一来,当RM重启之后,会读取之前存储的关于application的运行状态的数据,同时发送re-sync的命令,与第一种方式不同的是,NM在接受到重新同步的命令后并不会杀死正在运行的containers,而是继续运行containers中的任务,同时将containers的运行状态发送给RM,之后,RM根据自己所掌握的数据重构container实例和相关的application运行状态,如此一来,就实现了在RM重启之后,紧接着RM关闭时任务的执行状态继续执行。
将两种方式对比,第一种只保存了application提交的信息和最终执行状态,并不保存运行过程中的相关数据,所以RM重启后,会先杀死正在执行的任务,再重新提交,从零开始执行任务。第二种方式保存了application运行中的状态数据,所以在RM重启之后,不需要杀死之前的任务,而是接着原来执行到的进度继续执行。
配置:
配置都是写在yarn-site.xml文件中,下面是官网给出的一个简单的示例:
首先配置第一个参数 yarn.resourcemanager.recovery.enabled ,将其值设置为true,表示开启RM重启的功能。
其次,设置 yarn.resourcemanager.store.class ,该参数指RM采用哪种方式存储数据,示例中采用的是ZooKeeper存储。
第三个参数 yarn.resourcemanager.zk-address 用于指定ZooKeeper的服务的地址。
此外还有一些可选的参数可以配置,如ZooKeeper的retry policy和ACLs等参数。
其他的存储方式,如HDFS或本地文件系统,可以参考官网进行配置。