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_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:[可选],配置文件在网络可访问位置(例如 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:要写入 dest_file 中的关键/值对配置列表,格式如 type 中所定义。如果指定了 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 套接字连接所需的端口
PORT timeout 套接字连接超时(默认值为 1000)

HTTP 就绪性检查示例

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

PORT 就绪性检查示例

      "readiness_check": {
        "type": "PORT",
        "properties": {
          "port": "8080"
        }
      },

针对 Docker 容器使用 host 网络配置就绪性检查的警告

如果为具有多个容器的组件配置了 host Docker 网络,并且容器绑定到特定端口,则如果容器恰好分配在同一主机上,就会发生端口冲突。在这种情况下,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 集群的域名
COMPONENT_NAME 给定组件的名称
COMPONENT_INSTANCE_NAME 给定组件实例(即容器)的名称
COMPONENT_ID 给定组件的单调递增整数
CONTAINER_ID 给定容器的 YARN 容器 ID
${COMPONENT_INSTANCE_NAME}_HOST 组件实例(即容器)的主机名,例如 REGIONSERVER-0_HOST 将被替换为组件实例的实际主机名。请注意,所有字符必须大写。
${COMPONENT_INSTANCE_NAME}_IP 组件实例(即容器)的 IP,例如 REGIONSERVER-0_IP 将被替换为组件实例的实际 IP 地址。请注意,所有字符必须大写。
CLUSTER_FS_URI 集群 hdfs 的 URI