本文档介绍如何使用 YARN 服务框架在 YARN 上部署服务。
像往常一样启动 HDFS 和 YARN 的所有 Hadoop 组件。要启用 YARN 服务框架,请将此属性添加到 yarn-site.xml 并重新启动 ResourceManager 或在启动 ResourceManager 之前设置该属性。通过 CLI 或 REST API 使用 YARN 服务框架需要此属性。
<property>
<description>
Enable services rest api on ResourceManager.
</description>
<name>yarn.webapp.api-service.enable</name>
<value>true</value>
</property>
下面是一个简单的服务定义,它通过编写一个简单的规范文件并在不编写任何代码的情况下在 YARN 上启动睡眠容器。
{
"name": "sleeper-service",
"version": "1.0",
"components" :
[
{
"name": "sleeper",
"number_of_containers": 1,
"launch_command": "sleep 900000",
"resource": {
"cpus": 1,
"memory": "256"
}
}
]
}
用户可以使用以下命令在 YARN 上简单地运行预先构建的示例服务
yarn app -launch <service-name> <example-name>
例如,以下命令在 YARN 上启动名为 my-sleeper 的 sleeper 服务。
yarn app -launch my-sleeper sleeper
有关使用 YARN 服务框架启动基于 Docker 的服务,请参阅 API 文档。
以下步骤将指导你使用 CLI 在 YARN 上部署服务。有关命令和选项的完整列表,请参阅 Yarn 命令。
yarn app -launch ${SERVICE_NAME} ${PATH_TO_SERVICE_DEF_FILE}
参数
例如
yarn app -launch sleeper-service /path/to/local/sleeper.json
增加或减少组件的容器数量。
yarn app -flex ${SERVICE_NAME} -component ${COMPONENT_NAME} ${NUMBER_OF_CONTAINERS}
例如,对于名为 sleeper-service 的服务
将 sleeper 组件设置为 2 个容器(绝对数量)。
yarn app -flex sleeper-service -component sleeper 2
调整命令中的 ${NUMBER_OF_CONTAINERS} 也支持相对更改,例如 +2 或 -2。
停止服务将停止该服务的全部容器和 ApplicationMaster,但不会删除服务的 state,例如 hdfs 上的服务根文件夹。
yarn app -stop ${SERVICE_NAME}
重新启动已停止的服务很容易 - 只需调用 start!
yarn app -start ${SERVICE_NAME}
除了停止服务外,它还将删除 hdfs 上的服务根文件夹和 YARN 服务注册表中的记录。
yarn app -destroy ${SERVICE_NAME}
当 yarn.webapp.api-service.enable 设置为 true 时,YARN API 服务器 REST API 作为 ResourceManager 的一部分被激活。
服务可以通过 ResourceManager Web 端点在 YARN 上部署。
有关详细的 API 规范,请参阅 API 文档。
将上述示例服务定义 POST 到 ResourceManager api-server 端点
POST https://:8088/app/v1/services
GET https://:8088/app/v1/services/${SERVICE_NAME}
PUT https://:8088/app/v1/services/${SERVICE_NAME}/components/${COMPONENT_NAME}
PUT 请求正文
{
"name": "${COMPONENT_NAME}",
"number_of_containers": ${COUNT}
}
例如
{
"name": "sleeper",
"number_of_containers": 2
}
停止服务将停止该服务的全部容器和 ApplicationMaster,但不会删除服务的 state,例如 hdfs 上的服务根文件夹。
PUT https://:8088/app/v1/services/${SERVICE_NAME}
PUT 请求正文
{
"name": "${SERVICE_NAME}",
"state": "STOPPED"
}
重新启动已停止的服务非常容易。
PUT https://:8088/app/v1/services/${SERVICE_NAME}
PUT 请求正文
{
"name": "${SERVICE_NAME}",
"state": "STARTED"
}
除了停止服务外,它还将删除 hdfs 上的服务根文件夹和 YARN 服务注册表中的记录。
DELETE https://:8088/app/v1/services/${SERVICE_NAME}
YARN UI2 中添加了一个新的 service 选项卡,专门用于以一流的方式显示 YARN 服务。服务框架将数据发布到 TimelineService,而 service UI 从 TimelineService 读取数据以呈现其内容。
有关如何启用 Timeline Service v2,请参阅 TimeLineService v2 文档。
在 yarn-site.xml 中设置以下配置并启动 ResourceManager。如果您从源代码构建,请确保在 mvn 命令中使用 -Pyarn-ui - 这将为新的 YARN UI 生成 war 文件。
<property>
<description>To enable RM web ui2 application.</description>
<name>yarn.webapp.ui2.enable</name>
<value>true</value>
</property>
YARN 服务框架支持在安全(kerberized)环境中运行。用户在启动服务时需要指定 kerberos 主体名称和 keytab。例如,典型的配置如下所示
{
"name": "sample-service",
...
...
"kerberos_principal" : {
"principal_name" : "hdfs-demo/_HOST@EXAMPLE.COM",
"keytab" : "file:///etc/security/keytabs/hdfs.headless.keytab"
}
}
请注意,principal_name 字段中需要 _HOST,因为 Hadoop 客户端验证服务器(在本例中为 AM)的主体在与服务器通信时是否存在主机名。* principal_name:启动服务的用户的本机名称 * keytab:keytab 的 URI。目前仅支持存在于裸机主机上的文件。* URI 以 file:// 开头 - 存储 keytab 的本地主机上的路径。假设管理员在 AM 启动之前预先在本地主机上安装了 keytab。
上述示例仅适用于基于非 Docker 容器的服务。YARN 服务框架还提供了一流的支持来管理基于 Docker 的服务。管理基于 Docker 的服务的大多数步骤都是相同的,只是在 Docker 中组件的 Artifact 类型为 DOCKER,而 Artifact id 是 Docker 镜像的名称。有关如何在 YARN 上设置 Docker 的详细信息,请查看 YARN 上的 Docker。
有了 Docker 支持,它还开辟了一系列新的可能性来实现功能,例如使用 DNS 在 YARN 上发现服务容器。有关更多详细信息,请查看 ServiceDiscovery。