服务升级(实验性功能 - 技术预览)

Yarn 服务提供了一种方法,可以在不关闭应用程序的情况下对长时间运行的应用程序进行升级/降级,以最大程度地减少此过程中的停机时间。这是一个实验性功能,目前默认情况下未启用。

概述

升级 Yarn 服务是一个 3 步(或在选择自动完成升级时为 2 步)的过程

  1. 启动服务升级。

    此步骤涉及提供较新版本服务的服务规范。一旦启动服务升级,服务的 state 就会更改为 UPGRADING

  2. 升级组件实例。

    此步骤涉及触发单个组件实例的升级。通过提供在实例级别进行升级的 API,用户可以按与服务相关的任何顺序协调整个服务的升级。

    此外,还有用于升级多个实例、组件的所有实例和多个组件的所有实例的 API。

  3. 完成升级。

    此步骤涉及升级的最终完成。通过一个明确的步骤来完成升级,用户有机会取消当前正在进行的升级。当用户选择取消时,服务将尽最大努力恢复到以前的版本。



    升级最终确定后,旧服务定义将被新服务定义覆盖,服务状态将变为STABLE

    当使用-autoFinalize选项初始化升级时,服务可以自动最终确定。通过自动最终确定,当服务的组件实例全部升级后,服务框架将自动执行最终确定。

Hadoop 3.2.0 及更高版本还支持取消升级和快速升级。

  1. 取消升级。

    在服务升级最终确定之前,用户可以选择取消升级。此步骤将解决组件之间的依赖关系,然后按顺序回滚每个已升级的组件。

  2. 快速升级。

    这是一个升级服务所有组件的一步式过程。它涉及提供较新服务版本的服务规范。然后,服务主节点将自动执行以下步骤

    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-servicesleeper-0sleeper-1实例

yarn app -upgrade my-sleeper -instances sleeper-0,sleeper-1

升级组件

用户可以使用一个命令升级组件,即组件的所有实例

yarn app -upgrade ${service_name} -components ${comma_separated_list_of_component_names}

例如,以下命令升级my-servicesleeper组件的所有实例

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