YARN 服務範例

本文說明一些範例服務定義 (Yarnfile)。

Apache 網路伺服器 - httpd (含登錄 DNS)

要讓此範例運作,centos/httpd-24-centos7 映像必須包含在 docker.trusted.registries 中。有關伺服器端設定,請參閱 在 Docker 容器中執行應用程式 文件。

以下是具有兩個 httpd 實例的名為 httpd-service 服務的 Yarnfile。還有一個 httpd 代理實例 (httpd-proxy-0),在其他兩個 httpd 實例 (httpd-0 和 httpd-1) 之間進行代理。

請注意,此範例需要登錄 DNS。

{
  "name": "httpd-service",
  "version": "1.0",
  "lifetime": "3600",
  "components": [
    {
      "name": "httpd",
      "number_of_containers": 2,
      "artifact": {
        "id": "centos/httpd-24-centos7:latest",
        "type": "DOCKER"
      },
      "launch_command": "/usr/bin/run-httpd",
      "resource": {
        "cpus": 1,
        "memory": "1024"
      },
      "configuration": {
        "files": [
          {
            "type": "TEMPLATE",
            "dest_file": "/var/www/html/index.html",
            "properties": {
              "content": "<html><header><title>Title</title></header><body>Hello from ${COMPONENT_INSTANCE_NAME}!</body></html>"
            }
          }
        ]
      }
    },
    {
      "name": "httpd-proxy",
      "number_of_containers": 1,
      "artifact": {
        "id": "centos/httpd-24-centos7:latest",
        "type": "DOCKER"
      },
      "launch_command": "/usr/bin/run-httpd",
      "resource": {
        "cpus": 1,
        "memory": "1024"
      },
      "configuration": {
        "files": [
          {
            "type": "TEMPLATE",
            "dest_file": "/etc/httpd/conf.d/httpd-proxy.conf",
            "src_file": "httpd-proxy.conf"
          }
        ]
      }
    }
  ],
  "quicklinks": {
    "Apache HTTP Server": "http://httpd-proxy-0.${SERVICE_NAME}.${USER}.${DOMAIN}:8080"
  }
}

Yarnfile 已包含在 Hadoop 發行版中,以及必要的設定範本 httpd-proxy.conf。首先將設定範本檔案上傳至 HDFS

hdfs dfs -copyFromLocal ${HADOOP_YARN_HOME}/share/hadoop/yarn/yarn-service-examples/httpd/httpd-proxy.conf .

代理設定範本如下所示,將設定 httpd-proxy-0 容器在 httpd-0 和 httpd-1 容器之間平均負載平衡

<Proxy balancer://test>
  BalancerMember http://httpd-0.${SERVICE_NAME}.${USER}.${DOMAIN}:8080
  BalancerMember http://httpd-1.${SERVICE_NAME}.${USER}.${DOMAIN}:8080
  ProxySet lbmethod=bytraffic
</Proxy>

ProxyPass "/"  "balancer://test/"
ProxyPassReverse "/"  "balancer://test/"

然後使用下列指令執行服務

yarn app -launch <service-name> httpd

最後一個引數是服務的 JSON 規格路徑,或在此情況下,範例服務的名稱。可以透過設定 YARN_EXAMPLES_DIR 環境變數來設定範例所在目錄。

服務執行後,導覽至 http://httpd-proxy-0.${SERVICE_NAME}.${USER}.${DOMAIN}:8080 查看根頁面。頁面應會交替顯示「Hello from httpd-0!」或「Hello from httpd-1!」

個別 httpd URL 也可瀏覽,http://httpd-0.${SERVICE_NAME}.${USER}.${DOMAIN}:8080http://httpd-1.${SERVICE_NAME}.${USER}.${DOMAIN}:8080

如果您不確定您的主機名稱,請瀏覽 RM REST 端點 http://<RM 主機>:8088/app/v1/services/httpd-service

Apache 網頁伺服器 - httpd(不含註冊 DNS)

針對未設定註冊 DNS 的環境,提供類似的基於 IP 的範例。此範例的服務名稱為 httpd-service-no-dns。針對上述的 httpd-serviceYarnfile 中新增了幾項內容。針對 httpd 元件新增了準備就緒檢查

      "readiness_check": {
        "type": "HTTP",
        "properties": {
          "url": "http://${THIS_HOST}:8080"
        }
      },

並將 httpd 新增為 httpd-proxy 元件的相依性

      "dependencies": [ "httpd" ],

這表示 httpd-proxy-0 執行個體在針對 httpd-0 和 httpd-1 容器執行 HTTP 偵測成功後才會啟動。這有其必要性,才能在 httpd-proxy-0 的組態中使用容器的 IP。代理程式組態與前一個範例類似,其中 BalancerMember 行已變更如下

  BalancerMember http://${HTTPD-0_IP}:8080
  BalancerMember http://${HTTPD-1_IP}:8080

請注意,只有相依於命名元件(此案例中為 httpd)的元件才能使用 IP 和 HOST 變數,例如 ${HTTPD-0_IP}${HTTPD-0_HOST},而且只有當命名元件指定準備就緒檢查時才能使用。在此,httpd-proxy 相依於 httpd,而 httpd 有 HTTP 準備就緒檢查。若無相依性和準備就緒檢查,httpd-proxy-0 容器會與 httpd-0 和 http-1 容器並行啟動,而 httpd-0 和 httpd-1 的 IP 和主機尚未指派。

其他變數可供任何元件使用。

在建立服務之前,請將代理程式組態上傳至 HDFS

hdfs dfs -copyFromLocal ${HADOOP_YARN_HOME}/share/hadoop/yarn/yarn-service-examples/httpd-no-dns/httpd-proxy-no-dns.conf .

然後使用下列指令執行服務

yarn app -launch <service-name> httpd-no-dns

其中 service-name 為選用。若省略,則使用 Yarnfile 中定義的名稱。

在 RM REST 端點 http://<RM 主機>:8088/app/v1/services/httpd-service 中查詢您的 IP。然後瀏覽每個 IP 的 8080 埠,以檢視網頁。

應用程式目錄 - appcatalog

應用程式目錄為 Hadoop 軟體部署引入了許多令人興奮的新功能,這些功能對管理員和最終使用者都有利。有了應用程式目錄,使用者就能針對 Hadoop 中的軟體狀態取得個人化檢視。此外,使用者可以使用網頁使用者介面來安裝或註冊應用程式。

使用指令啟動應用程式目錄服務

yarn app -launch <service-name> appcatalog

其中 service-name 為使用者定義的名稱。

應用程式目錄的部署進度位於資源管理員 UI 中。當服務達到 STABLE 狀態時,應用程式目錄 UI 可於下列位置取得:http://appcatalog.${SERVICE_NAME}.${USER}.${DOMAIN}:8080/

對於安全叢集,應用程式目錄的 Kerberos 設定可以使用環境變數設定在 Yarn 服務 JSON 中進行設定

環境變數 範例 說明
YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS /etc/hadoop/conf:/etc/hadoop/conf:ro,/etc/krb5.conf:/etc/krb5.conf:ro,/etc/security/keytabs/yarn.service.keytab:/etc/security/keytabs/yarn.service.keytab:ro,/etc/security/keytabs/spnego.service.keytab:/etc/security/keytabs/spnego.service.keytab:ro Hadoop 組態、Kerberos krb5.conf 和 Kerberos keytab 檔案清單的容器掛載路徑。
SPNEGO_KEYTAB /etc/security/keytabs/spnego.service.keytab 應用程式目錄的服務主體。
SPNEGO_PRINCIPAL HTTP/appcatalog.catalog.yarn.example.com@EXAMPLE.COM 應用程式目錄的服務主體。
KEYTAB /etc/security/keytabs/yarn.service.ketab YARN 服務應用程式主控程式使用的 keytab 檔案路徑。
PRINCIPAL yarn/_HOST@EXAMPLE.COM YARN 服務應用程式主控程式使用的服務主體。

應用程式目錄環境選項

| 環境變數 | 說明 | | KEYTAB | 服務使用者 keytab 檔案,用於存取 HDFS。 | | PRINCIPAL | 服務使用者 Kerboers 主體。 | | SOLR_DATA_DIR | 儲存 Solr 資料的位置。 | | SOLR_STORAGE_TYPE | Solr 資料的儲存類型,支援的類型有:hdfs、local | | SPNEGO_KEYTAB | 用於驗證 HTTP 端點的 keytab 檔案位置。 | | SPNEGO_PRINCIPAL | 要用於 HTTP 端點的 Kerberos 主體。主體必須以「HTTP」/ 開頭,根據 Kerberos HTTP SPNEGO 規範。 |

安全應用程式目錄 Yarnfile 範例

{
  "name": "catalog",
  "kerberos_principal" : {
    "principal_name" : "catalog/_HOST@EXAMPLE.COM",
    "keytab" : "file:///etc/security/keytabs/catalog.service.keytab"
  },
  "version": "1",
  "components" :
  [
    {
      "name": "appcatalog",
      "number_of_containers": 1,
      "artifact": {
        "id": "apache/hadoop-yarn-applications-catalog-docker:3.3.0-SNAPSHOT",
        "type": "DOCKER"
      },
      "resource": {
        "cpus": 1,
        "memory": "256"
      },
      "configuration": {
        "env": {
          "YARN_CONTAINER_RUNTIME_DOCKER_RUN_OVERRIDE_DISABLE":"true",
          "YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS":"/etc/hadoop/conf:/etc/hadoop/conf:ro,/etc/krb5.conf:/etc/krb5.conf:ro,/etc/security/keytabs/catalog.service.keytab:/etc/security/keytabs/hbase.service.keytab:ro,/etc/security/keytabs/spnego.service.keytab:/etc/security/keytabs/spnego.service.keytab:ro",
          "SPNEGO_KEYTAB":"/etc/security/keytabs/spnego.service.keytab",
          "SPNEGO_PRINCIPAL":"HTTP/host-3.example.com@EXAMPLE.COM",
          "KEYTAB":"/etc/security/keytabs/catalog.service.keytab",
          "PRINCIPAL":"catalog/host3.example.com@EXAMPLE.COM",
          "SOLR_DATA_DIR":"hdfs://host-1.example.com:9000/tmp/solr",
          "SOLR_UPDATE_LOG":"hdfs://host-1.example.com:9000/tmp/solr",
          "SOLR_STORAGE_TYPE":"hdfs"
        },
        "properties": {
          "docker.network": "host"
        }
      }
    }
  ]
}

Docker 映像檔 ENTRYPOINT 支援

Docker 映像檔可能已使用 ENTRYPOINT 建置,以在沒有任何參數的情況下啟用 Docker 映像檔啟動。傳遞參數至啟用 ENTRYPOINT 的映像檔時,launch_command 會以逗號 (,) 區隔。

{
  "name": "sleeper-service",
  "version": "1.0",
  "components" :
  [
    {
      "name": "sleeper",
      "number_of_containers": 2,
      "artifact": {
        "id": "hadoop/centos:latest",
        "type": "DOCKER"
      },
      "launch_command": "sleep,90000",
      "resource": {
        "cpus": 1,
        "memory": "256"
      },
      "restart_policy": "ON_FAILURE",
      "configuration": {
        "env": {
          "YARN_CONTAINER_RUNTIME_DOCKER_RUN_OVERRIDE_DISABLE":"true"
        },
        "properties": {
          "docker.network": "host"
        }
      }
    }
  ]
}