服務升級(實驗性功能 - 技術預覽)

Yarn 服務提供了一種升級/降級長期執行應用程式的途徑,而無需關閉應用程式,以將此過程中的停機時間減至最短。這是一個實驗性功能,目前未預設啟用。

概觀

升級 Yarn 服務是一個 3 步驟(或在選擇自動完成升級時為 2 步驟)的過程

  1. 啟動服務升級。
    此步驟包括提供較新版本服務的服務規格。一旦啟動服務升級,服務的狀態將變更為 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 升級,使其休眠時間從 900000 變更為 1200000,使用者可以將服務升級至版本 1.0.1。以下是 sleeper-service 版本 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