服务发现

本文档描述了 Hadoop 上的服务发现机制以及启用它的步骤。

概述

实现了一个 DNS 服务器 以通过标准机制(DNS 查找)在 Hadoop 上发现服务。

框架 ApplicationMaster 将容器信息(如主机名和 IP 地址)发布到 Hadoop 服务注册表中。DNS 服务器通过将它们转换为 DNS 记录(如 A 记录和 SRV 记录)来公开 Hadoop 服务注册表中的信息。然后,客户端可以通过标准 DNS 查找来发现容器的 IP。

对于非 Docker 容器(具有空 Artifact 或将 Artifact 类型设置为 TARBALL 的容器),由于同一主机上的所有容器共享相同的 IP 地址,因此 DNS 支持正向 DNS 查找,但不支持反向 DNS 查找。使用 Docker 时,它支持正向和反向查找,因为可以将每个容器配置为具有自己唯一的 IP。此外,DNS 还支持为正向和反向查找配置静态区域文件。

集群中的 Docker 容器 IP 管理

为了支持每个容器每个 IP 的用例,必须使用 bridge 网络启动容器。但是,使用 bridge 网络,默认情况下无法从其他节点路由在某个节点上运行的容器。如果您只进行单节点测试,这不是问题,但是,对于多节点环境,必须使容器可以从其他节点路由。

根据平台(如 GCE 或 AWS)有多种解决此问题的方法。有关如何启用此功能的信息,请参阅特定平台文档。对于本地群集,解决此问题的一种方法是在每个节点上将 docker 守护程序配置为使用自定义网桥,例如 br0,该网桥可从所有节点路由。此外,使用 fixed-cidr 选项将以 CIDR 形式表示的独占连续 IP 地址范围(例如 172.21.195.240/26 (64 个 IP))分配给每个 docker 守护程序,如下所示 docker daemon.json

"bridge": "br0"
"fixed-cidr": "172.21.195.240/26"

查看如何 自定义 docker 网桥网络 以获取详细信息。

注册表 DNS 的命名约定

借助 DNS 支持,用户可以简单地以如下所示的明确命名格式访问其服务

${COMPONENT_INSTANCE_NAME}.${SERVICE_NAME}.${USER}.${DOMAIN}

例如,在一个其域名是 yarncluster(由 core-site.xml 中的 hadoop.registry.dns.domain-name 定义)的群集中,由用户 devuser 部署的、名为 hbase 的服务,其包含两个组件 hbasemasterregionserver,可以如下所示访问

此 URL 指向通常的 hbase 主机 UI

http://hbasemaster-0.hbase.devuser.yarncluster:16010/master-status

请注意,YARN 服务框架为序列中单调递增的整数中的每个容器分配 COMPONENT_INSTANCE_NAME。例如,hbasemaster-0 被分配为 0,因为它对于 hbasemaster 组件是第一个且唯一的实例。对于 regionserver 组件,它可以有多个容器,因此可以命名为:regionserver-0regionserver-1regionserver-2

每个 YARN 服务组件还具有用于容器容错或通过 RegistryDNS 进行负载均衡的多 A 记录。命名格式定义为

${COMPONENT_NAME}.${SERVICE_NAME}.${USER}.${DOMAIN}

例如,由 Chuck 启动的应用程序 app 的名为 www 的组件将具有如下所示的 DNS 记录

www.app.chuck.example.com IN A 123.123.123.1
www.app.chuck.example.com IN A 123.123.123.1
www.app.chuck.example.com IN A 123.123.123.1

免责声明:DNS 实现仍处于试验阶段。它不应被用作功能齐全的 DNS。