本文档介绍如何使用 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 http://localhost:8088/app/v1/services
GET http://localhost:8088/app/v1/services/${SERVICE_NAME}
PUT http://localhost: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 http://localhost:8088/app/v1/services/${SERVICE_NAME}
PUT
请求正文
{ "name": "${SERVICE_NAME}", "state": "STOPPED" }
重新启动已停止的服务非常容易。
PUT http://localhost:8088/app/v1/services/${SERVICE_NAME}
PUT
请求正文
{ "name": "${SERVICE_NAME}", "state": "STARTED" }
除了停止服务外,它还将删除 hdfs 上的服务根文件夹和 YARN 服务注册表中的记录。
DELETE http://localhost: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/[email protected]", "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。