本文檔說明如何設定要部署在 YARN 上的服務。
主要有三大類組態
Service#configuration
) 或元件層級 (Component#configuration
) 指定。Configuration#properties
)。
yarn.service.am-restart.max-attempts
。這些設定主要是用於控制框架 AM 的行為,而不是框架啟動的客製化服務。SERVICE_NAME
。
以下說明每種類型設定的詳細資料。
以下是如何設定物件的典型外觀
"configuration" : { "properties" : { "yarn.service.am-restart.max-attempts" : 10 // config for the service AM }, "env" : { // The environment variables to be exported when container gets launched "env1" : "val1" }, "files" : [ // The list of configuration files to be mounted for the container { "type": "HADOOP_XML", // The format of the config file into which the "properties" are dumped "dest_file": "/etc/hadoop/conf/core-site.xml", // The location where the config file is mounted inside the container "properties" : { // The list of key/value pairs to be dumped into the config file "fs.defaultFS" : "hdfs://myhdfs" // This property will be written into core-site.xml } }, { "type": "HADOOP_XML", // The format of the config file. "src_file" : ""hdfs://mycluster/tmp/conf/yarn-site.xml"" // The location of the source config file to be downloaded "dest_file": "/etc/hadoop/conf/yarn-site.xml", // The location where the config file will be mounted inside the container/ "properties" : { "yarn.resourcemanager.webapp.address" : "${COMPONENT_INSTANCE_NAME}.${SERVICE_NAME}.${USER}.${DOMAIN}" // Merge into (or override existing property in) yarn-site.xml } } ] }
dest_file
) 的格式。如果指定了 src_file
,它也是 src_file
和 dest_file
的格式。src_file
,檔案內容會以 Hadoop XML 格式讀取並剖析。src_file
,src_file
的內容會在常數替換後寫入 dest_file
。如果未指定 src_file
,請使用 properties
欄位中的 content
作為金鑰,而值會是常數替換後要寫入 dest_file
的實際內容。例如
{ "type": "TEMPLATE" "dest_file": "/etc/conf/hello" "properties" : { "content" : "Hello world" } }
字串 Hello world
會寫入位於容器內 /etc/conf/hello
的檔案中。
src_file
和 dest_file
的格式都由 type
定義。HADOOP_XML
和 TEMPLATE
類型。src_file
,並將其掛載在容器中,位置如 dest_file
所指定。properties
欄位中指定了任何屬性,它們會新增到 src_file
中 (或覆寫現有的屬性)。src_file
,則只有 properties
欄位中的屬性會寫入 dest_file
檔案中。type
定義。dest_file 可以是絕對路徑或相對路徑。如果是相對路徑,檔案將位於 $PWD/conf
目錄中(其中 $PWD
是由 YARN 啟動的所有 Docker 容器掛載到的容器本機目錄)type
中定義的格式寫入 dest_file
的鍵值對組態清單。如果指定了 src_file
,這些屬性將新增到 src_file
中(或覆寫現有的屬性)。本節說明 YARN 服務 AM 的組態設定。
系統範圍服務 AM 屬性只能在叢集 yarn-site.xml
檔案中組態。
系統層級組態名稱 | 說明 |
---|---|
yarn.service.framework.path | 服務 AM 相依性 tarball 的 HDFS 路徑。如果此位置不存在任何檔案,AM 相依性將在第一次啟動或執行服務時由 RM 上傳。如果 RM 使用者沒有權限將檔案上傳至這個位置,或該位置無法由全世界讀取,每次啟動或執行服務時,AM 相依性 jar 檔將會上傳。如果未指定,假設值為 /yarn-services/${hadoop.version}/service-dep.tar.gz。 |
yarn.service.base.path | 服務成品將儲存的 HDFS 父目錄(預設為 ${user_home_dir}/.yarn/)。 |
yarn.service.client-am.retry.max-wait-ms | 服務用戶端與服務 AM 通訊的最大重試時間(毫秒)(預設為 900000,即 15 分鐘)。 |
yarn.service.client-am.retry-interval-ms | 服務用戶端與服務 AM 通訊的重試間隔(毫秒)(預設為 2000,即 2 秒)。 |
yarn.service.queue | 服務將提交到的預設佇列(預設提交至 default 佇列)。請注意,佇列可以透過佇列欄位指定每個服務,而不是透過服務層級組態屬性。 |
服務層級服務 AM 組態屬性可以在叢集 yarn-site.xml
中的全球層級指定(實際上覆寫系統範圍的預設值),或在 Configuration
物件的 properties
欄位中指定每個服務,如下面的範例所示
{ "configuration" : { "properties" : { "yarn.service.am-restart.max-attempts" : 10 } } }
上述組態允許服務 AM 最多重試 10 次。
服務層級設定名稱 | 說明 |
---|---|
yarn.service.am-restart.max-attempts | 啟動服務 AM 的最大次數,超過此值後服務將會終止 (預設 20)。 |
yarn.service.am-resource.memory | 服務 AM 的記憶體大小 (MB) (預設 1024)。 |
yarn.service.am.java.opts | 服務 AM 的額外 JVM 選項 (預設為「 -Xmx768m」,將附加到未指定 -Xmx 的任何 JVM 選項)。 |
yarn.service.container-recovery.timeout.ms | 逾時時間 (毫秒),超過此時間後,新啟動的服務 AM 會釋放所有尚未從 RM 復原的先前 AM 嘗試的容器 (預設 120000,即 2 分鐘)。 |
yarn.service.failure-count-reset.window | 間隔時間 (秒),超過此時間後,將會重設容器失敗次數,這些次數將會評估每個元件的 yarn.service.container-failure-per-component.threshold 和 yarn.service.node-blacklist.threshold (預設 21600,即 6 小時)。 |
yarn.service.readiness-check-interval.seconds | 執行準備檢查的間隔時間 (秒) (預設 30 秒)。 |
yarn.service.log.include-pattern | 應用程式完成後,根據名稱包含日誌檔的正規表示式,以彙總日誌 (預設包含所有檔案)。 |
yarn.service.log.exclude-pattern | 應用程式完成後,根據名稱排除日誌檔的正規表示式,以彙總日誌。如果日誌檔名稱同時符合包含和排除模式,則會排除此檔案 (預設不排除任何檔案)。 |
yarn.service.rolling-log.include-pattern | 應用程式執行期間,根據名稱包含日誌檔的正規表示式,以彙總日誌。 |
yarn.service.rolling-log.exclude-pattern | 應用程式執行期間,根據名稱排除日誌檔的正規表示式,以彙總日誌。如果日誌檔名稱同時符合包含和排除模式,則會排除此檔案。 |
yarn.service.classpath | Yarn 服務 AM 的逗號分隔額外類別路徑參數。這些路徑元素將附加到 YARN 服務 AM 類別路徑的結尾。 |
yarn.service.am.client.port-range | Yarn 服務 AM 繫結時可使用的埠範圍。如果您要使用所有可能的埠,請留空。例如 50000-50050,50100-50200。 |
元件層級服務 AM 設定屬性可以在群集 yarn-site.xml
中的全球層級指定 (有效覆寫系統範圍的預設值),在 Configuration
物件的 properties
欄位中針對每個服務指定,或在元件 Configuration
物件的 properties
欄位中針對每個元件指定。
元件層級設定名稱 | 說明 |
---|---|
yarn.service.container-failure.retry.max | 如果容器失敗,自動重新啟動容器的最大重試次數 (預設 -1,表示永遠)。 |
yarn.service.container-failure.retry-interval-ms | 重新啟動容器的重試間隔時間 (毫秒) (預設 30000,即 30 秒)。 |
yarn.service.container-failure.validity-interval-ms | 失敗有效性間隔(以毫秒為單位)。當設定為大於 0 的值時,容器重試原則不會將發生在此間隔之外的失敗計入失敗次數(預設為 -1,表示目前為止的所有失敗都會計入失敗次數)。 |
yarn.service.container-failure-per-component.threshold | 在 AM 停止服務之前,特定組件的容器失敗最大絕對次數(不包括重試,預設為 10)。 |
yarn.service.node-blacklist.threshold | 在 AM 將節點列入黑名單之前,節點上容器失敗的最大次數(不包括重試,預設為 3)。 |
yarn.service.default-readiness-check.enabled | 是否啟用預設就緒檢查(預設為 true)。 |
yarn.service.container-health-threshold.percent | 當明確設定為特定組件或所有組件的整體時,容器健康閾值百分比會排程健康檢查監視器,以定期檢查健康容器的百分比。如果容器處於 READY 狀態,則表示容器是健康的。它會以指定的/預設輪詢頻率執行檢查。它允許組件低於指定的/預設時間窗格內的健康閾值,之後它會將服務視為不健康並觸發服務停止。當啟用健康閾值百分比時,將忽略 yarn.service.container-failure-per-component.threshold。 |
yarn.service.container-health-threshold.poll-frequency-secs | 健康檢查監視器輪詢頻率。這是一個進階設定,除非服務擁有者了解其含義且不想要預設值,否則不需要設定。預設值為 10 秒。 |
yarn.service.container-health-threshold.window-secs | 健康檢查監視器允許特定組件低於健康閾值的時間量,之後它會將服務視為不健康。預設值為 600 秒(10 分鐘)。 |
yarn.service.container-health-threshold.init-delay-secs | 健康檢查監視器在第一次檢查啟動之前等待的初始時間量。它會給服務容器一段時間,讓它們第一次啟動。預設值為 600 秒(10 分鐘)。 |
yarn.service.container-state-report-as-service-state | 布林旗標表示如果此元件已完成,服務也會終止。預設為 false。 |
有一個元件層級組態屬性在 yarn-site.xml
檔案中設定的方式與服務規格中不同。若要選取將用於 Docker 容器的 Docker 網路類型,可以在服務的 Configuration
properties
或元件的 Configuration
properties
中設定 docker.network
。Docker 網路類型的系統範圍預設值(針對 YARN 服務容器和所有其他應用程式容器)會透過 yarn-site.xml
檔案中的 yarn.nodemanager.runtime.linux.docker.default-container-network
屬性設定。
AM 可以透過 Component
欄位 readiness_check
設定為對容器執行準備檢查。容器在準備檢查成功之前不會達到 READY
狀態。如果未指定準備檢查,則會執行預設準備檢查,除非透過 yarn.service.default-readiness-check.enabled
元件層級組態屬性停用它。
當容器的 IP 可用時,預設準備檢查會成功。還有一些選用屬性會在 IP 檢查之外組態 DNS 檢查。DNS 檢查會確保在容器被視為準備就緒之前,容器主機名稱的 DNS 查詢會成功。例如,可以針對預設準備檢查啟用 DNS 檢查,如下所示
"readiness_check": { "type": "DEFAULT", "properties": { "dns.check.enabled": "true" } },
以下是 AM 可以執行的準備檢查的可組態屬性完整清單。
準備檢查 | 可組態屬性 | 說明 |
---|---|---|
DEFAULT、HTTP、PORT | dns.check.enabled | 如果應執行 DNS 檢查,則為 true(預設為 false) |
DEFAULT、HTTP、PORT | dns.address | 用於 DNS 檢查的 DNS 伺服器的選用 IP:port 位址 |
HTTP | url | HTTP 回應檢查所需的 URL,例如 http://${THIS_HOST}:8080 |
HTTP | timeout | 連線逾時(預設為 1000) |
HTTP | min.success | 視為成功的最小回應碼(預設為 200) |
HTTP | max.success | 視為成功的最大回應碼(預設為 299) |
PORT | port | Socket 連線所需的埠 |
PORT | timeout | socket 連線逾時(預設 1000) |
HTTP 準備檢查範例
"readiness_check": { "type": "HTTP", "properties": { "url": "http://${THIS_HOST}:8080" } },
PORT 準備檢查範例
"readiness_check": { "type": "PORT", "properties": { "port": "8080" } },
host
網路的準備檢查的警告當 docker 網路 host
設定為容器多於一個的元件,且容器繫結到特定埠時,如果容器碰巧配置在同一主機上,就會發生埠衝突。在此情況下,HTTP 和 PORT 準備檢查將無效。特別是,兩個容器(成功繫結到埠的容器和未繫結到埠的容器)的 HTTP 或 PORT 準備檢查都可能會成功,因為檢查是針對同一 IP(主機的 IP)執行。此類服務的有效設定可以使用反親和性配置原則,確保容器會配置在不同主機上,以避免發生埠衝突。
服務架構提供一些常數變數,供使用者設定其服務。這些變數是由系統動態產生,或是非動態變數,例如使用者定義的服務名稱。使用者可以在其設定中使用這些常數,由服務 AM 動態替換。例如:
{ "type" : "HADOOP_XML", "dest_file" : "/etc/hadoop/hbase-site.xml", "properties" : { "hbase.regionserver.hostname": "${COMPONENT_INSTANCE_NAME}.${SERVICE_NAME}.${USER}.${DOMAIN}" } }
在此,COMPONENT_INSTANCE_NAME
和 SERVICE_NAME
是由系統替換的常數。
假設 COMPONENT_INSTANCE_NAME
是 regionserver-0
,而 SERVICE_NAME
由使用者定義為 hbase
,使用者名稱是 devuser
,網域名稱是 dev.test
。然後,設定會由服務 AM 替換,並寫入容器內的設定檔 /etc/hadoop/hbase-site.xml
,如下所示
<property> <name>hbase.regionserver.hostname</name> <value>regionserver-0.hbase.devuser.dev.test</value> </property>
其中 regionserver-0
是系統為此容器配置的實際元件執行個體名稱。
名稱 | 說明 |
---|---|
SERVICE_NAME | 使用者定義的服務名稱 |
USER | 提交服務的使用者。請注意,包含「_」的使用者名稱將轉換為使用「-」,以符合不允許「_」的 DNS 主機名稱 RFC 格式,且所有字元都將轉換為小寫。例如:「Bob_dev」將轉換為「bob-dev」 |
DOMAIN | 叢集的網域名稱 |
元件名稱 | 指定元件的名稱 |
元件執行個體名稱 | 指定元件執行個體 (例如容器) 的名稱 |
元件 ID | 指定元件的單調遞增整數 |
容器 ID | 指定容器的 YARN 容器 ID |
${元件執行個體名稱}_HOST | 元件執行個體 (例如容器) 的主機名稱,例如 REGIONSERVER-0_HOST 將會替換為元件執行個體的實際主機名稱。請注意,所有字元都必須使用大寫。 |
${元件執行個體名稱}_IP | 元件執行個體 (例如容器) 的 IP,例如 REGIONSERVER-0_IP 將會替換為元件執行個體的實際 IP 位址。請注意,所有字元都必須使用大寫。 |
叢集檔案系統 URI | 叢集 HDFS 的 URI |