YARN 服务示例

本文档描述了一些示例服务定义 (Yarnfile)。

Apache Web 服务器 - httpd(带注册表 DNS)

要使此示例正常工作,centos/httpd-24-centos7 镜像必须包含在 docker.trusted.registries 中。有关服务器端配置,请参阅 在 Docker 容器中运行应用程序 文档。

以下是名为 httpd-service 的服务的 Yarnfile,其中包含两个 httpd 实例。还有一个 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 host>:8088/app/v1/services/httpd-service

Apache Web 服务器 - 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-0 和 httpd-1 容器执行 HTTP 探测成功后,httpd-proxy-0 实例才会启动。这是必需的,以便可以在 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 host>:8088/app/v1/services/httpd-service查找你的 IP。然后访问每个 IP 的端口 8080 来查看页面。

应用程序目录 - appcatalog

应用程序目录为部署 Hadoop 软件引入了许多令人兴奋的新功能,这些功能对管理员和最终用户都有好处。借助应用程序目录,用户可以获得 Hadoop 中软件状态的个性化视图。此外,用户可以使用基于 Web 的用户界面安装或注册应用程序。

使用命令启动应用程序目录服务

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 密钥表文件的容器挂载路径。
SPNEGO_KEYTAB /etc/security/keytabs/spnego.service.keytab 应用程序目录的服务主体。
SPNEGO_PRINCIPAL HTTP/[email protected] 应用程序目录的服务主体。
KEYTAB /etc/security/keytabs/yarn.service.ketab YARN 服务应用程序主控程序使用的密钥表文件路径。
PRINCIPAL yarn/[email protected] YARN 服务应用程序主控程序使用的服务主体。

应用程序目录环境选项

| 环境变量 | 说明 | | KEYTAB | 用于访问 HDFS 的服务用户密钥表文件。 | | PRINCIPAL | 服务用户 Kerboers 主体。 | | SOLR_DATA_DIR | 存储 Solr 数据的位置。 | | SOLR_STORAGE_TYPE | Solr 数据的存储类型,支持的类型有:hdfs、local | | SPNEGO_KEYTAB | 用于对 HTTP 端点进行身份验证的密钥表文件的位置。 | | SPNEGO_PRINCIPAL | 用于 HTTP 端点的 Kerberos 主体。根据 Kerberos HTTP SPNEGO 规范,主体必须以“HTTP”/开头。 |

安全的应用程序目录 Yarnfile 示例

{
  "name": "catalog",
  "kerberos_principal" : {
    "principal_name" : "catalog/[email protected]",
    "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/[email protected]",
          "KEYTAB":"/etc/security/keytabs/catalog.service.keytab",
          "PRINCIPAL":"catalog/[email protected]",
          "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"
        }
      }
    }
  ]
}