YARN 服務 API

簡介

今天在 YARN 上提供新服務並非簡單的體驗。現有架構的 API 都是太低階 (原生 YARN),需要撰寫新程式碼 (對於具有程式設計 API 的架構) 或撰寫複雜的規格 (對於宣告式架構)。

這個簡化的 REST API 可用於建立和管理 YARN 服務的生命週期。在大部分情況下,應用程式擁有者不必被迫對其應用程式進行任何變更。如果應用程式與 Docker 等容器化技術一起封裝,這主要是正確的。

本文件描述在 YARN 上部署/管理容器化服務的 API 規格 (又稱為 YarnFile)。相同的 JSON 規格可用於 REST API 和 CLI 來管理服務。

版本資訊

版本:1.0.0

授權資訊

授權:Apache 2.0 授權網址:http://www.apache.org/licenses/LICENSE-2.0.html

URI 架構

主機:host.mycompany.com

埠:8088 (預設 RM 埠)

架構:HTTP

消耗

  • application/json

產生

  • application/json

路徑

建立服務

POST /app/v1/services

說明

建立服務。要求 JSON 是服務物件,其中包含建立所需的詳細資料。如果要求成功,它會傳回 202 已接受。此 API 的成功僅確認服務建立要求已提交成功。無法保證服務實際上會到達執行中狀態。資源可用性和其他幾個因素會決定服務是否會部署在叢集中。預期客戶端會隨後呼叫 GET API 以取得服務的詳細資料並決定其狀態。

參數

類型 名稱 說明 必要 架構 預設值
BodyParameter 服務 服務要求物件 true 服務

回應

HTTP 程式碼 說明 架構
202 建立服務的要求已接受 無內容
400 要求主體中提供的服務定義無效 無內容
500 無法建立服務 無內容
預設 意外的錯誤 服務狀態

(待定) 集群中執行的服務清單。

GET /app/v1/services

說明

取得目前所有正在執行的服務清單 (回應包括服務資訊的最小投影)。如需更多詳細資料,請對特定服務名稱執行 GET。

回應

HTTP 程式碼 說明 架構
200 服務陣列 服務陣列
預設 意外的錯誤 服務狀態

取得 API 伺服器的目前版本。

GET /app/v1/services/version

說明

取得 API 伺服器的目前版本。

回應

HTTP 程式碼 說明 架構
200 要求成功 無內容

更新服務或升級正在執行的服務元件的二進位版本

PUT /app/v1/services/{service_name}

說明

更新服務的執行時期屬性。目前支援下列作業 - 更新生命週期、停止/啟動服務。PUT 作業也會用於協調服務容器升級至其人工製品的較新版本 (待定)。

參數

類型 名稱 說明 必要 架構 預設值
PathParameter service_name 服務名稱 true 字串
BodyParameter 服務 已更新的服務定義。它可以包含服務的已更新生命週期或服務的所需狀態 (已停止/已啟動),以針對指定的服務啟動/停止作業 true 服務

回應

HTTP 程式碼 說明 架構
204 更新或升級成功 無內容
404 服務不存在 無內容
預設 意外的錯誤 服務狀態

取得服務的詳細資料。

GET /app/v1/services/{service_name}

說明

傳回正在執行的服務的詳細資料 (包括容器)

參數

類型 名稱 說明 必要 架構 預設值
PathParameter service_name 服務名稱 true 字串

回應

HTTP 程式碼 說明 架構
200 服務物件 物件
404 服務不存在 無內容
預設 意外的錯誤 服務狀態

銷毀服務

DELETE /app/v1/services/{service_name}

說明

銷毀服務並釋放所有資源。此 API 可能必須傳回提供記錄位置的 JSON 資料 (待定) 等。

參數

類型 名稱 說明 必要 架構 預設值
PathParameter service_name 服務名稱 true 字串

回應

HTTP 程式碼 說明 架構
204 銷毀成功 無內容
404 服務不存在 無內容
預設 意外的錯誤 服務狀態

彈性調整元件的執行個體數目。

PUT /app/v1/services/{service_name}/components/{component_name}

說明

設定元件的所需執行個體數目

參數

類型 名稱 說明 必要 架構 預設值
PathParameter service_name 服務名稱 true 字串
PathParameter component_name 元件名稱 true 字串
BodyParameter 元件 包含已更新執行個體數目的元件定義。 true 元件

回應

HTTP 程式碼 說明 架構
200 彈性調整成功 無內容
404 服務不存在 無內容
預設 意外的錯誤 服務狀態

定義

人工製品

服務元件的人工製品。如果未指定,元件只會執行裸啟動指令,且不會將任何人工製品本機化。

名稱 說明 必要 架構 預設值
id 人工製品 ID。範例包括基於 tarball 服務的套件位置 URI、docker 的影像名稱、服務名稱等。 true 字串
type 人工製品類型,例如 docker、tarball 等 (選用)。對於 TARBALL 類型,指定的 tarball 會本機化至容器本機工作目錄中的名為 lib 的資料夾下。對於 SERVICE 類型,會讀取指定的服務,並將其元件新增至此服務中。具有人工製品類型 SERVICE 的原始元件會被移除 (原始元件中指定的任何屬性都會被忽略)。 false 列舉 (DOCKER、TARBALL、SERVICE) DOCKER
uri 支援多個人工製品儲存庫的人工製品位置 (選用)。 false 字串

元件

服務的一個或多個元件。如果服務是 HBase,則元件可以是主控程式或區域伺服器等簡單角色。如果服務是複雜的商業 Web 應用程式,則元件可以是其他服務,例如 Kafka 或 Storm。因此,它開放了對複雜和巢狀服務的支援。

名稱 說明 必要 架構 預設值
名稱 服務元件名稱 (強制)。如果啟用登錄 DNS,最大長度為 44 個字元。 true 字串
狀態 元件狀態 false 元件狀態
相依性 在這個元件可以啟動之前,服務元件陣列應該處於 READY 狀態 (由準備檢查定義)。服務所有元件的相依性應該表示為 DAG。 false 字串陣列
準備檢查 這個元件的準備檢查。 false 準備就緒檢查
人工製品 元件人工製品 (選用)。如果未指定,服務層級全域人工製品會生效。 false 人工製品
啟動命令 這個元件的客製化啟動命令 (DOCKER 元件為選用,其他為強制)。當在元件層級指定時,會覆寫在全域層級 (如果有) 指定的值。如果 docker 映象支援 ENTRYPOINT,啟動命令會以逗號 (,) 分隔,而不是空格。 false 字串
資源 這個元件的資源 (選用)。如果未指定,服務層級全域資源會生效。 false 資源
容器數量 這個元件的容器數量 (選用)。如果未指定,服務層級全域容器數量會生效。 false 整數 (int64)
已停用的執行個體 已停用元件執行個體清單。 false 字串陣列
容器 已啟動元件的容器。為 POST 酬載指定這個屬性的值會產生驗證錯誤。這個 blob 僅在已啟動服務的 GET 回應中可用。 false 容器陣列
執行特權容器 以特權模式執行這個元件的所有容器 (YARN-4262)。 false 布林值
配置政策 這個元件所有容器的高階排程和配置政策。 false 配置政策
組態 這個元件的組態屬性。 false 組態
快速連結 在服務層級定義的快速連結金鑰清單,並由這個元件解析。 false 字串陣列
重新啟動政策 元件重新啟動政策。包括 ALWAYS (總是重新啟動
元件即使執行個體結束代碼 = 0);ON_FAILURE(僅在執行個體結束代碼!= 0 時重新啟動元件);NEVER(在任何情況下都不重新啟動)。對於重新啟動政策為 ON_FAILURE/NEVER 的元件,不支援彈性調整 false 字串 ALWAYS

元件狀態

元件狀態

名稱 說明 必要 架構 預設值
狀態 元件狀態列舉 false 列舉(INIT、FLEXING、STABLE、UPGRADING)

組態檔

需要建立並在服務元件容器中提供為磁碟區的組態檔。

名稱 說明 必要 架構 預設值
type 標準格式的組態檔,例如 xml、屬性、json、yaml、範本或靜態/封存資源檔。如果指定靜態/封存類型,則必須在啟動作業前將檔案上傳至遠端檔案系統,而 YARN 服務架構會在啟動容器前將檔案在地化。封存檔案會在在地化期間解開 false 列舉(XML、屬性、JSON、YAML、範本、HADOOP_XML、靜態、封存)
dest_file 此組態檔應建立為的路徑。如果它是絕對路徑,它將會掛載到 DOCKER 容器中。絕對路徑僅允許用於 DOCKER 容器。如果它是相對路徑,則僅應提供檔名,且檔案將會在容器本機工作目錄中建立,在 conf 資料夾下,適用於靜態/封存以外的所有類型。對於靜態/封存資源類型,檔案會在資源目錄下提供。 false 字串
src_file 這會提供組態檔的來源位置,其內容會在屬性替換後傾印至 dest_file,格式如類型中所指定。通常,src_file 會指向由 puppet、chef 或 hdfs 等工具維護的來源控制網路存取檔案。目前,僅支援 hdfs。 false 字串
屬性 一組會以類型中所指定格式傾印至 dest_file 的金鑰值對。如果指定了 src_file,則會將 src_file 內容傾印至 dest_file,且這些屬性會覆寫 src_file 中的任何現有屬性(如果有),或新增為 src_file 中的新屬性。 false 物件

組態

組態屬性集,可透過環境、檔案和自訂可插入的輔助 docker 容器注入服務元件。將會支援多種標準格式的檔案,例如 xml、屬性、json、yaml 和範本。

名稱 說明 必要 架構 預設值
屬性 一組用於組態 YARN 服務 AM 的金鑰值對。 false 物件
env 一組金鑰值對,會附加至預設系統屬性,並在啟動時傳遞給服務。所有屬性的佔位符參照都會在注入前替換。 false 物件
files 需要建立並在服務元件容器中提供為磁碟區的檔案清單陣列。 false ConfigFile 陣列

容器

執行中服務容器的執行個體。

名稱 說明 必要 架構 預設值
id 執行中服務的唯一容器識別碼,例如 container_e3751_1458061340047_0008_01_000002。 false 字串
launch_time 建立容器的時間,例如 2016-03-16T01:01:49.000Z。這很可能與叢集啟動時間不同。 false 字串 (日期)
ip 執行中容器的 IP 位址,例如 172.31.42.141。IP 位址和主機名稱屬性值取決於叢集/docker 網路設定,如 YARN-4007 所述。 false 字串
hostname 執行中容器的完整合格主機名稱,例如 ctr-e3751-1458061340047-0008-01-000002.examplestg.site。IP 位址和主機名稱屬性值取決於叢集/docker 網路設定,如 YARN-4007 所述。 false 字串
bare_host 執行容器的裸節點或主機,例如 cn008.example.com。 false 字串
狀態 服務容器的狀態。 false 容器狀態
component_instance_name 此容器執行個體所屬的元件執行個體名稱。元件執行個體名稱命名為 $COMPONENT_NAME-i,其中 i 是單調遞增的整數。例如,稱為 nginx 的元件可以有多個元件執行個體,命名為 nginx-0、nginx-1 等。每個元件執行個體都由容器執行個體支援。 false 字串
資源 此容器使用的資源。 false 資源
人工製品 此容器使用的成品。 false 人工製品
privileged_container 在特權模式下執行容器或不執行。 false 布林值

ContainerState

服務容器的目前狀態。

名稱 說明 必要 架構 預設值
狀態 容器狀態的列舉 false 列舉 (INIT、STARTED、READY)

KerberosPrincipal

啟動服務的使用者之 Kerberos 主體資訊。

名稱 說明 必要 架構 預設值
principal_name 啟動服務的使用者之主體名稱。請注意,principal_name 欄位中需要 _HOST,例如 testuser/_HOST@EXAMPLE.COM,因為 Hadoop 客戶端會驗證伺服器(在本例中為 AM)的主體在與伺服器通訊時是否有主機名稱。 false 字串
keytab Kerberos keytab 的 URI。目前僅支援裸主機上存在的檔案。URI 以「file://」開頭 - 儲存 keytab 的本機主機上的路徑。假設管理員在 AM 啟動之前已預先在本地主機上安裝 keytab。 false 字串

PlacementConstraint

配置限制詳細資料。

名稱 說明 必要 架構 預設值
名稱 與此約束相關聯的選用名稱。 false 字串
type 配置類型。 true 配置類型
範圍 配置範圍。 true 配置範圍
目標標籤 此元件配置原則所依賴的元件名稱會新增為目標標籤。因此,對於親和性來說,此元件的容器會要求配置在執行目標標籤元件容器的主機上。目標標籤也可以包含此元件的名稱,這種情況表示對於反親和性來說,此元件不會超過一個容器可以配置在主機上。類似地,對於基數來說,這表示此元件的容器會要求配置在執行至少 minCardinality 但不超過 maxCardinality 個目標標籤元件容器的主機上。 false 字串陣列
節點屬性 節點屬性是一組與節點相關聯的 key:value(s) 配對。 false 物件
節點分割 此元件的容器可以執行的節點分割。 false 字串陣列
最小基數 當配置類型為基數時,主機應具有的依賴元件容器的最小數目,此元件的容器可以配置在該主機上。 false 整數 (int64)
最大基數 當配置類型為基數時,主機應具有的依賴元件容器的最大數目,此元件的容器可以配置在該主機上。 false 整數 (int64)

配置原則

服務元件的高階配置原則。

名稱 說明 必要 架構 預設值
約束 配置限制詳細資料。 true 配置約束陣列

配置範圍

元件容器的配置範圍。

名稱 說明 必要 架構 預設值
type false 列舉 (節點、機架)

配置類型

配置類型 - 與其他元件的容器或相同元件 (自我) 的容器的親和性/反親和性/基數親和性。

名稱 說明 必要 架構 預設值
type false 列舉 (親和性、反親和性、基數親和性)

準備就緒檢查

執行檢查以確定元件執行個體 (容器) 的準備就緒狀態。如果未指定準備就緒檢查,將使用預設準備就緒檢查,除非在元件或全域層級將 yarn.service.default-readiness-check.enabled 組態屬性設定為 false。目前不支援 artifact 欄位,但可能會在未來實作,讓可插入的輔助容器支援進階使用案例。

名稱 說明 必要 架構 預設值
type 預設 (AM 檢查容器是否有 IP,並選擇性地為容器主機名稱執行 DNS 查詢)、HTTP (AM 執行預設檢查,並將 REST 呼叫傳送至容器,並預期回應代碼介於 200 至 299 之間) 或 PORT (AM 執行預設檢查,並嘗試在指定埠上開啟與容器的 socket 連線)。 true 列舉(DEFAULT、HTTP、PORT)
屬性 將用於設定檢查的鍵值對 blob。 false 物件
人工製品 可插入式準備檢查輔助容器的成品(選用)。如果指定,此輔助容器通常會主機 http uri,並封裝執行實際容器準備檢查所需的複雜指令碼。最後,預期會回應 204 無內容,就像簡化的使用案例一樣。此可插入式架構讓服務擁有者受益,他們可以在不修改封裝的情況下執行服務。請注意,目前僅支援 docker 類型的成品。尚未實作 false 人工製品

資源

資源決定容器可使用的資源數量(vcore、記憶體、網路等)。此欄位決定要套用至組件或服務所有容器的資源。在服務(或全域)層級指定的資源可以在組件層級覆寫。預期只會有一個設定檔或 CPU 和記憶體。否則會引發驗證例外狀況。

名稱 說明 必要 架構 預設值
設定檔 每個資源設定檔都有唯一的 ID,與群集層級預先定義的記憶體、CPU 等相關聯。 false 字串
CPU 分配給每個容器的 vcore 數量(選用,但如果指定,會覆寫設定檔中的 CPU)。 false 整數 (int32)
記憶體 分配給每個容器的記憶體數量(選用,但如果指定,會覆寫設定檔中的記憶體)。目前僅接受整數值,預設單位為 MB。 false 字串
其他 資源類型名稱對應資源類型資訊的對應。包含值(整數)、單位(字串)和選用屬性(對應)。這將用於指定 CPU 和記憶體以外的資源。請參閱以下範例。 false 物件

資源資訊

資源資訊決定記憶體和 vcore 以外的資源類型的單位/值。它會是資源物件的一部分。

名稱 說明 必要 架構 預設值
資源的整數值。 false 整數 (int64)
單位 資源的單位,可接受的值為 - p/n/u/m/k/M/G/T/P/Ki/Mi/Gi/Ti/Pi。預設為空表示沒有單位。 false 字串

服務

服務資源具有下列屬性。

名稱 說明 必要 架構 預設值
名稱 唯一的服務名稱。如果啟用登錄 DNS,最大長度為 63 個字元。 true 字串
版本 服務的版本。 true 字串
說明 服務的說明。 false 字串
id 一個唯一的服務 ID。 false 字串
人工製品 服務中所有組件的預設人工製品,除了人工製品類型設定為服務 (SERVICE) 的組件 (選用)。 false 人工製品
資源 服務中所有組件的預設資源 (選用)。 false 資源
launch_time 服務建立的時間,例如 2016-03-16T01:01:49.000Z。 false 字串 (日期)
number_of_running_containers 在取得回應時,提供此服務在要求時間點的執行中容器總數 (跨所有組件)。請注意,後續要求可能會傳回不同的數字,因為在達到容器總數或在兩個要求之間已提出彈性要求時,會配置更多容器。 false 整數 (int64)
lifetime 服務從達到已啟動狀態 (之後會由 YARN 自動銷毀) 的時間 (以秒為單位)。對於無限期使用時間,請勿設定使用時間值。 false 整數 (int64)
components 服務的組件。 false 組件陣列
組態 服務的設定屬性。在服務/全域層級提供的設定可供所有組件使用。特定屬性可以在組件層級覆寫。 false 組態
狀態 服務狀態。為 PUT 負載指定此屬性的值表示將服務更新為此所需狀態。 false 服務狀態
快速連結 要為服務匯出的快速連結金鑰值對 blob。 false 物件
queue 此服務應提交到的 YARN 佇列。 false 字串
kerberos_principal 啟動服務使用者的主要資訊 false Kerberos 主體
docker_client_config 包含 Docker 用戶端設定的檔案 URI (例如 hdfs:///tmp/config.json) false 字串
相依性 此服務所依賴的服務名稱清單。 false 字串陣列

ServiceState

服務的目前狀態。

名稱 說明 必要 架構 預設值
狀態 服務狀態的列舉 false 列舉 (ACCEPTED、STARTED、STABLE、STOPPED、FAILED、FLEX、UPGRADING)

ServiceStatus

已提交服務的目前狀態,以 GET API 回應的形式傳回。

名稱 說明 必要 架構 預設值
diagnostics 服務目前狀態原因的診斷資訊 (如果有)。如果服務處於非執行中狀態,通常會有非空值。 false 字串
狀態 服務狀態。 false 服務狀態
code 特定於情境的錯誤碼,服務擁有者應能使用它來了解失敗,以及診斷資訊。 false 整數 (int32)

範例

建立一個簡單的單一組件服務,其中大部分屬性值為預設值

POST URL - https://127.0.0.1:8088/app/v1/services

POST 要求 JSON

{
  "name": "hello-world",
  "version": "1.0.0",
  "description": "hello world example",
  "components" :
    [
      {
        "name": "hello",
        "number_of_containers": 2,
        "artifact": {
          "id": "nginx:latest",
          "type": "DOCKER"
        },
        "launch_command": "./start_nginx.sh",
        "resource": {
          "cpus": 1,
          "memory": "256"
        }
      }
    ]
}

GET 回應 JSON

GET URL - https://127.0.0.1:8088/app/v1/services/hello-world

請注意,-1 的生命週期值表示無限生命週期。

{
    "name": "hello-world",
    "version": "1.0.0",
    "description": "hello world example",
    "id": "application_1503963985568_0002",
    "lifetime": -1,
    "state": "STABLE",
    "components": [
        {
            "name": "hello",
            "state": "STABLE",
            "resource": {
                "cpus": 1,
                "memory": "256"
            },
            "configuration": {
                "properties": {},
                "env": {},
                "files": []
            },
            "quicklinks": [],
            "containers": [
                {
                    "id": "container_e03_1503963985568_0002_01_000002",
                    "ip": "10.22.8.143",
                    "hostname": "ctr-e03-1503963985568-0002-01-000002.example.site",
                    "state": "READY",
                    "launch_time": 1504051512412,
                    "bare_host": "host100.cloud.com",
                    "component_instance_name": "hello-0"
                },
                {
                    "id": "container_e03_1503963985568_0002_01_000003",
                    "ip": "10.22.8.144",
                    "hostname": "ctr-e03-1503963985568-0002-01-000003.example.site",
                    "state": "READY",
                    "launch_time": 1504051536450,
                    "bare_host": "host100.cloud.com",
                    "component_instance_name": "hello-1"
                }
            ],
            "launch_command": "./start_nginx.sh",
            "number_of_containers": 1,
            "run_privileged_container": false
        }
    ],
    "configuration": {
        "properties": {},
        "env": {},
        "files": []
    },
    "quicklinks": {}
}

更新以修改服務的生命週期

PUT URL - https://127.0.0.1:8088/app/v1/services/hello-world

PUT 要求 JSON

請注意,無論目前的生命週期值為何,此更新要求都會將服務的生命週期設定為從提交要求的時間起 3600 秒(1 小時)。因此,如果服務剩餘生命週期為 5 分鐘(假設),並且想要將其延長到一小時,或者如果應用程式剩餘生命週期為 5 小時(假設),並且想要將其縮短到一小時,則對於這兩種情況,您都需要提交以下相同的請求。

{
  "lifetime": 3600
}

停止服務

PUT URL - https://127.0.0.1:8088/app/v1/services/hello-world

PUT 要求 JSON

{
  "state": "STOPPED"
}

啟動服務

PUT URL - https://127.0.0.1:8088/app/v1/services/hello-world

PUT 要求 JSON

{
  "state": "STARTED"
}

更新以調整服務組成中容器(執行個體)的數量

PUT URL - https://127.0.0.1:8088/app/v1/services/hello-world/components/hello

PUT 要求 JSON

{
  "number_of_containers": 3
}

或者,您可以指定整個「組成」區段。

PUT URL - https://127.0.0.1:8088/app/v1/services/hello-world

PUT 要求 JSON

{
  "state": "FLEX",
  "components" :
    [
      {
        "name": "hello",
        "number_of_containers": 3
      }
    ]
}

銷毀服務

DELETE URL - https://127.0.0.1:8088/app/v1/services/hello-world

建立複雜的服務 - HBase

POST URL - https://127.0.0.1:8088:/app/v1/services/hbase-app-1

POST 要求 JSON

{
  "name": "hbase-app-1",
  "version": "1.0.0",
  "description": "hbase service",
  "lifetime": "3600",
  "components": [
    {
      "name": "hbasemaster",
      "number_of_containers": 1,
      "artifact": {
        "id": "hbase:latest",
        "type": "DOCKER"
      },
      "launch_command": "/usr/hdp/current/hbase-master/bin/hbase master start",
      "resource": {
        "cpus": 1,
        "memory": "2048"
      },
      "configuration": {
        "env": {
          "HBASE_LOG_DIR": "<LOG_DIR>"
        },
        "files": [
          {
            "type": "XML",
            "dest_file": "/etc/hadoop/conf/core-site.xml",
            "properties": {
              "fs.defaultFS": "${CLUSTER_FS_URI}"
            }
          },
          {
            "type": "XML",
            "dest_file": "/etc/hbase/conf/hbase-site.xml",
            "properties": {
              "hbase.cluster.distributed": "true",
              "hbase.zookeeper.quorum": "${CLUSTER_ZK_QUORUM}",
              "hbase.rootdir": "${SERVICE_HDFS_DIR}/hbase",
              "zookeeper.znode.parent": "${SERVICE_ZK_PATH}",
              "hbase.master.hostname": "hbasemaster.${SERVICE_NAME}.${USER}.${DOMAIN}",
              "hbase.master.info.port": "16010"
            }
          }
        ]
      }
    },
    {
      "name": "regionserver",
      "number_of_containers": 3,
      "artifact": {
        "id": "hbase:latest",
        "type": "DOCKER"
      },
      "launch_command": "/usr/hdp/current/hbase-regionserver/bin/hbase regionserver start",
      "resource": {
        "cpus": 1,
        "memory": "2048"
      },
      "configuration": {
        "env": {
          "HBASE_LOG_DIR": "<LOG_DIR>"
        },
        "files": [
          {
            "type": "XML",
            "dest_file": "/etc/hadoop/conf/core-site.xml",
            "properties": {
              "fs.defaultFS": "${CLUSTER_FS_URI}"
            }
          },
          {
            "type": "XML",
            "dest_file": "/etc/hbase/conf/hbase-site.xml",
            "properties": {
              "hbase.cluster.distributed": "true",
              "hbase.zookeeper.quorum": "${CLUSTER_ZK_QUORUM}",
              "hbase.rootdir": "${SERVICE_HDFS_DIR}/hbase",
              "zookeeper.znode.parent": "${SERVICE_ZK_PATH}",
              "hbase.master.hostname": "hbasemaster.${SERVICE_NAME}.${USER}.${DOMAIN}",
              "hbase.master.info.port": "16010",
              "hbase.regionserver.hostname": "${COMPONENT_INSTANCE_NAME}.${SERVICE_NAME}.${USER}.${DOMAIN}"
            }
          }
        ]
      }
    }
  ],
  "quicklinks": {
    "HBase Master Status UI": "http://hbasemaster0.${SERVICE_NAME}.${USER}.${DOMAIN}:16010/master-status",
    "Proxied HBase Master Status UI": "http://app-proxy/${DOMAIN}/${USER}/${SERVICE_NAME}/hbasemaster/16010/"
  }
}

建立服務,除了 CPU 和 RAM 之外,還要求 GPU

POST URL - https://127.0.0.1:8088/app/v1/services

POST 要求 JSON

{
  "name": "hello-world",
  "version": "1.0.0",
  "description": "hello world example with GPUs",
  "components" :
    [
      {
        "name": "hello",
        "number_of_containers": 2,
        "artifact": {
          "id": "nginx:latest",
          "type": "DOCKER"
        },
        "launch_command": "./start_nginx.sh",
        "resource": {
          "cpus": 1,
          "memory": "256",
          "additional" : {
            "yarn.io/gpu" : {
              "value" : 4,
              "unit" : ""
            }
          }
        }
      }
    ]
}

建立服務,其中一個組成要求反親和性配置政策

POST URL - https://127.0.0.1:8088/app/v1/services

POST 要求 JSON

{
  "name": "hello-world",
  "version": "1.0.0",
  "description": "hello world example with anti-affinity",
  "components" :
    [
      {
        "name": "hello",
        "number_of_containers": 3,
        "artifact": {
          "id": "nginx:latest",
          "type": "DOCKER"
        },
        "launch_command": "./start_nginx.sh",
        "resource": {
          "cpus": 1,
          "memory": "256"
        },
        "placement_policy": {
          "constraints": [
            {
              "type": "ANTI_AFFINITY",
              "scope": "NODE",
              "node_attributes": {
                "os": ["centos6", "centos7"],
                "fault_domain": ["fd1", "fd2"]
              },
              "node_partitions": [
                "gpu",
                "fast-disk"
              ],
              "target_tags": [
                "hello"
              ]
            }
          ]
        }
      }
    ]
}

GET 回應 JSON

GET URL - https://127.0.0.1:8088/app/v1/services/hello-world

請注意,對於反親和性組成,在特定節點中最多只會配置 1 個容器。在此範例中,組成「hello」要求 3 個容器。由於叢集有 3 個或以上的 NM,因此配置了全部 3 個容器。如果叢集的 NM 少於 3 個,則會配置少於 3 個容器。在配置的容器數量少於要求的容器數量時,組成和服務將處於非穩定狀態。

{
    "name": "hello-world",
    "version": "1.0.0",
    "description": "hello world example with anti-affinity",
    "id": "application_1503963985568_0003",
    "lifetime": -1,
    "state": "STABLE",
    "components": [
        {
            "name": "hello",
            "state": "STABLE",
            "resource": {
                "cpus": 1,
                "memory": "256"
            },
            "placement_policy": {
              "constraints": [
                {
                  "type": "ANTI_AFFINITY",
                  "scope": "NODE",
                  "node_attributes": {
                    "os": ["centos6", "centos7"],
                    "fault_domain": ["fd1", "fd2"]
                  },
                  "node_partitions": [
                    "gpu",
                    "fast-disk"
                  ],
                  "target_tags": [
                    "hello"
                  ]
                }
              ]
            },
            "configuration": {
                "properties": {},
                "env": {},
                "files": []
            },
            "quicklinks": [],
            "containers": [
                {
                    "id": "container_e03_1503963985568_0003_01_000002",
                    "ip": "10.22.8.143",
                    "hostname": "ctr-e03-1503963985568-0003-01-000002.example.site",
                    "state": "READY",
                    "launch_time": 1504051512412,
                    "bare_host": "host100.cloud.com",
                    "component_instance_name": "hello-0"
                },
                {
                    "id": "container_e03_1503963985568_0003_01_000003",
                    "ip": "10.22.8.144",
                    "hostname": "ctr-e03-1503963985568-0003-01-000003.example.site",
                    "state": "READY",
                    "launch_time": 1504051536450,
                    "bare_host": "host101.cloud.com",
                    "component_instance_name": "hello-1"
                },
                {
                    "id": "container_e03_1503963985568_0003_01_000004",
                    "ip": "10.22.8.145",
                    "hostname": "ctr-e03-1503963985568-0003-01-000004.example.site",
                    "state": "READY",
                    "launch_time": 1504051536450,
                    "bare_host": "host102.cloud.com",
                    "component_instance_name": "hello-2"
                }
            ],
            "launch_command": "./start_nginx.sh",
            "number_of_containers": 1,
            "run_privileged_container": false
        }
    ],
    "configuration": {
        "properties": {},
        "env": {},
        "files": []
    },
    "quicklinks": {}
}

建立服務,其中一個組成啟用健康閾值監視器

POST URL - https://127.0.0.1:8088/app/v1/services

POST 要求 JSON

{
  "name": "hello-world",
  "version": "1.0.0",
  "description": "hello world example with health threshold monitor",
  "components" :
    [
      {
        "name": "hello",
        "number_of_containers": 100,
        "artifact": {
          "id": "nginx:latest",
          "type": "DOCKER"
        },
        "launch_command": "./start_nginx.sh",
        "resource": {
          "cpus": 1,
          "memory": "256"
        },
        "configuration": {
          "properties": {
            "yarn.service.container-health-threshold.percent": "90",
            "yarn.service.container-health-threshold.window-secs": "400",
            "yarn.service.container-health-threshold.init-delay-secs": "800"
          }
        }
      }
    ]
}