Yarn 服務提供了一種升級/降級長期執行應用程式的途徑,而無需關閉應用程式,以將此過程中的停機時間減至最短。這是一個實驗性功能,目前未預設啟用。
升級 Yarn 服務是一個 3 步驟(或在選擇自動完成升級時為 2 步驟)的過程
啟動服務升級。
此步驟包括提供較新版本服務的服務規格。一旦啟動服務升級,服務的狀態將變更為 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
升級,使其休眠時間從 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-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