Yarn 服务提供了一种方法,可以在不关闭应用程序的情况下对长时间运行的应用程序进行升级/降级,以最大程度地减少此过程中的停机时间。这是一个实验性功能,目前默认情况下未启用。
升级 Yarn 服务是一个 3 步(或在选择自动完成升级时为 2 步)的过程
启动服务升级。
此步骤涉及提供较新版本服务的服务规范。一旦启动服务升级,服务的 state 就会更改为 UPGRADING
。
升级组件实例。
此步骤涉及触发单个组件实例的升级。通过提供在实例级别进行升级的 API,用户可以按与服务相关的任何顺序协调整个服务的升级。
此外,还有用于升级多个实例、组件的所有实例和多个组件的所有实例的 API。
完成升级。
此步骤涉及升级的最终完成。通过一个明确的步骤来完成升级,用户有机会取消当前正在进行的升级。当用户选择取消时,服务将尽最大努力恢复到以前的版本。
升级最终确定后,旧服务定义将被新服务定义覆盖,服务状态将变为STABLE
。
当使用-autoFinalize
选项初始化升级时,服务可以自动最终确定。通过自动最终确定,当服务的组件实例全部升级后,服务框架将自动执行最终确定。
Hadoop 3.2.0 及更高版本还支持取消升级和快速升级。
取消升级。
在服务升级最终确定之前,用户可以选择取消升级。此步骤将解决组件之间的依赖关系,然后按顺序回滚每个已升级的组件。
快速升级。
这是一个升级服务所有组件的一步式过程。它涉及提供较新服务版本的服务规范。然后,服务主节点将自动执行以下步骤
a. 发现所有需要升级的组件。
b. 解决这些组件之间的依赖关系。
c. 按顺序触发组件升级。
此示例显示了 Sleeper 服务的升级。以下是 Sleeper 服务定义
{ "name": "sleeper-service", "components" : [ { "name": "sleeper", "version": "1.0.0", "number_of_containers": 1, "launch_command": "sleep 900000", "resource": { "cpus": 1, "memory": "256" } } ] }
假设用户启动了一个名为my-sleeper
的 Sleeper 服务实例
{ "components": [ { "configuration": {...}, "containers": [ { "bare_host": "0.0.0.0", "component_instance_name": "sleeper-0", "hostname": "example.local", "id": "container_1531508836237_0002_01_000002", "ip": "0.0.0.0", "launch_time": 1531941023675, "state": "READY" }, { "bare_host": "0.0.0.0", "component_instance_name": "sleeper-1", "hostname": "example.local", "id": "container_1531508836237_0002_01_000003", "ip": "0.0.0.0", "launch_time": 1531941024680, "state": "READY" } ], "dependencies": [], "launch_command": "sleep 900000", "name": "sleeper", "number_of_containers": 2, "quicklinks": [], "resource": {...}, "restart_policy": "ALWAYS", "run_privileged_container": false, "state": "STABLE" } ], "configuration": {...}, "id": "application_1531508836237_0002", "kerberos_principal": {}, "lifetime": -1, "name": "my-sleeper", "quicklinks": {}, "state": "STABLE", "version": "1.0.0" }
以下是启用服务升级所需的yarn-site.xml
中的配置。
<property> <name>yarn.service.upgrade.enabled</name> <value>true</value> </property>
用户可以使用以下命令启动升级
yarn app -upgrade ${service_name} -initate ${path_to_new_service_def_file} [-autoFinalize]
例如,要将my-sleeper
升级为休眠时间为1200000而不是900000,用户可以将服务升级到版本 1.0.1。以下是 Sleeper 服务 1.0.1 版本的服务定义
{ "components" : [ { "name": "sleeper", "version": "1.0.1", "number_of_containers": 1, "launch_command": "sleep 1200000", "resource": { "cpus": 1, "memory": "256" } } ] }
以下命令启动升级到版本 1.0.1。
yarn app -upgrade my-sleeper -initiate sleeper_v101.json
用户可以使用以下命令升级组件实例
yarn app -upgrade ${service_name} -instances ${comma_separated_list_of_instance_names}
例如,以下命令升级my-service
的sleeper-0
和sleeper-1
实例
yarn app -upgrade my-sleeper -instances sleeper-0,sleeper-1
用户可以使用一个命令升级组件,即组件的所有实例
yarn app -upgrade ${service_name} -components ${comma_separated_list_of_component_names}
例如,以下命令升级my-service
的sleeper
组件的所有实例
yarn app -ugrade my-sleeper -components sleeper
用户必须使用以下命令最终确定升级(因为在启动时未指定 autoFinalize)
yarn app -upgrade ${service_name} -finalize
例如,以下命令最终确定my-sleeper
的升级
yarn app -upgrade my-sleeper -finalize
用户可以在最终确定之前使用以下命令取消升级
yarn app -upgrade ${service_name} -cancel
例如:在升级完成之前,以下命令可取消升级my-sleeper
yarn app -upgrade my-sleeper -cancel
用户可以使用以下命令一次升级一项服务
yarn app -upgrade ${service_name} -express ${path_to_new_service_def_file}
例如:以下命令快速升级my-sleeper
yarn app -upgrade my-sleeper -express sleeper_v101.json