YARN 服務組態

本文檔說明如何設定要部署在 YARN 上的服務。

主要有三大類組態

以下說明每種類型設定的詳細資料。

客製化服務設定

以下是如何設定物件的典型外觀

"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
            }
        }
    ]
}
  • 屬性:服務 AM 的設定。以下有詳細資料。
  • env:容器啟動時要輸出的環境變數。
  • 檔案:要掛載在容器中的設定檔清單。
    • 類型:要掛載在容器中的設定檔 (dest_file) 的格式。如果指定了 src_file,它也是 src_filedest_file 的格式。
    • HADOOP_XML:Hadoop XML 格式。如果指定了 src_file,檔案內容會以 Hadoop XML 格式讀取並剖析。
    • XML:標準 XML 格式
    • JSON:標準 JSON 格式
    • YAML:YAML 格式
    • PROPERTIES:Java PROPERTIES 格式
    • TEMPLATE:純文字格式。如果指定了 src_filesrc_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: [選用] 設定檔在網路可存取位置(例如 HDFS)的來源位置。
    • src_filedest_file 的格式都由 type 定義。
    • 目前,它只適用於 HADOOP_XMLTEMPLATE 類型。
    • YARN NodeManager 會下載 src_file,並將其掛載在容器中,位置如 dest_file 所指定。
    • 如果在 properties 欄位中指定了任何屬性,它們會新增到 src_file 中 (或覆寫現有的屬性)。
    • 如果未指定 src_file,則只有 properties 欄位中的屬性會寫入 dest_file 檔案中。
    • dest_file:容器內掛載組態檔的位置。檔案格式由 type 定義。dest_file 可以是絕對路徑或相對路徑。如果是相對路徑,檔案將位於 $PWD/conf 目錄中(其中 $PWD 是由 YARN 啟動的所有 Docker 容器掛載到的容器本機目錄)
    • properties:以 type 中定義的格式寫入 dest_file 的鍵值對組態清單。如果指定了 src_file,這些屬性將新增到 src_file 中(或覆寫現有的屬性)。

YARN 服務 AM 組態

本節說明 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.thresholdyarn.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"
        }
      },

針對 docker 容器設定使用 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_NAMESERVICE_NAME 是由系統替換的常數。

假設 COMPONENT_INSTANCE_NAMEregionserver-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