今天在 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
主機:host.mycompany.com
埠:8088 (預設 RM 埠)
架構:HTTP
POST /app/v1/services
建立服務。要求 JSON 是服務物件,其中包含建立所需的詳細資料。如果要求成功,它會傳回 202 已接受。此 API 的成功僅確認服務建立要求已提交成功。無法保證服務實際上會到達執行中狀態。資源可用性和其他幾個因素會決定服務是否會部署在叢集中。預期客戶端會隨後呼叫 GET API 以取得服務的詳細資料並決定其狀態。
類型 | 名稱 | 說明 | 必要 | 架構 | 預設值 |
---|---|---|---|---|---|
BodyParameter | 服務 | 服務要求物件 | true | 服務 |
HTTP 程式碼 | 說明 | 架構 |
---|---|---|
202 | 建立服務的要求已接受 | 無內容 |
400 | 要求主體中提供的服務定義無效 | 無內容 |
500 | 無法建立服務 | 無內容 |
預設 | 意外的錯誤 | 服務狀態 |
GET /app/v1/services
取得目前所有正在執行的服務清單 (回應包括服務資訊的最小投影)。如需更多詳細資料,請對特定服務名稱執行 GET。
HTTP 程式碼 | 說明 | 架構 |
---|---|---|
200 | 服務陣列 | 服務陣列 |
預設 | 意外的錯誤 | 服務狀態 |
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 | 布林值 |
服務容器的目前狀態。
名稱 | 說明 | 必要 | 架構 | 預設值 |
---|---|---|---|---|
狀態 | 容器狀態的列舉 | false | 列舉 (INIT、STARTED、READY) |
啟動服務的使用者之 Kerberos 主體資訊。
名稱 | 說明 | 必要 | 架構 | 預設值 |
---|---|---|---|---|
principal_name | 啟動服務的使用者之主體名稱。請注意,principal_name 欄位中需要 _HOST ,例如 testuser/_HOST@EXAMPLE.COM ,因為 Hadoop 客戶端會驗證伺服器(在本例中為 AM)的主體在與伺服器通訊時是否有主機名稱。 |
false | 字串 | |
keytab | Kerberos keytab 的 URI。目前僅支援裸主機上存在的檔案。URI 以「file://」開頭 - 儲存 keytab 的本機主機上的路徑。假設管理員在 AM 啟動之前已預先在本地主機上安裝 keytab。 | false | 字串 |
配置限制詳細資料。
名稱 | 說明 | 必要 | 架構 | 預設值 |
---|---|---|---|---|
名稱 | 與此約束相關聯的選用名稱。 | 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 | 字串陣列 |
服務的目前狀態。
名稱 | 說明 | 必要 | 架構 | 預設值 |
---|---|---|---|---|
狀態 | 服務狀態的列舉 | false | 列舉 (ACCEPTED、STARTED、STABLE、STOPPED、FAILED、FLEX、UPGRADING) |
已提交服務的目前狀態,以 GET API 回應的形式傳回。
名稱 | 說明 | 必要 | 架構 | 預設值 |
---|---|---|---|---|
diagnostics | 服務目前狀態原因的診斷資訊 (如果有)。如果服務處於非執行中狀態,通常會有非空值。 | false | 字串 | |
狀態 | 服務狀態。 | false | 服務狀態 | |
code | 特定於情境的錯誤碼,服務擁有者應能使用它來了解失敗,以及診斷資訊。 | false | 整數 (int32) |
POST URL - https://127.0.0.1:8088/app/v1/services
{ "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 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
請注意,無論目前的生命週期值為何,此更新要求都會將服務的生命週期設定為從提交要求的時間起 3600 秒(1 小時)。因此,如果服務剩餘生命週期為 5 分鐘(假設),並且想要將其延長到一小時,或者如果應用程式剩餘生命週期為 5 小時(假設),並且想要將其縮短到一小時,則對於這兩種情況,您都需要提交以下相同的請求。
{ "lifetime": 3600 }
PUT URL - https://127.0.0.1:8088/app/v1/services/hello-world
{ "state": "STOPPED" }
PUT URL - https://127.0.0.1:8088/app/v1/services/hello-world
{ "state": "STARTED" }
PUT URL - https://127.0.0.1:8088/app/v1/services/hello-world/components/hello
{ "number_of_containers": 3 }
或者,您可以指定整個「組成」區段。
PUT URL - https://127.0.0.1:8088/app/v1/services/hello-world
{ "state": "FLEX", "components" : [ { "name": "hello", "number_of_containers": 3 } ] }
DELETE URL - https://127.0.0.1:8088/app/v1/services/hello-world
POST URL - https://127.0.0.1:8088:/app/v1/services/hbase-app-1
{ "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/" } }
POST URL - https://127.0.0.1:8088/app/v1/services
{ "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
{ "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 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
{ "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" } } } ] }