服務發現

本文檔描述了 Hadoop 上的服務發現機制以及啟用它的步驟。

概觀

實作了一個 DNS 伺服器,以透過標準機制(DNS 查詢)在 Hadoop 上發現服務。

架構 ApplicationMaster 會將容器資訊(例如主機名稱和 IP 位址)張貼到 Hadoop 服務註冊中心。DNS 伺服器會透過將 Hadoop 服務註冊中心的資訊轉換成 DNS 記錄(例如 A 記錄和 SRV 記錄)來公開這些資訊。然後,客戶端就能透過標準 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 IPs))指定給每個 Docker 守護程式,如下所示在 Docker daemon.json

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

查看如何自訂 Docker 橋接器網路以取得詳細資訊。

使用 Registry 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 服務組件還具有多 A 記錄,以透過 RegistryDNS 實現容器容錯或負載平衡。命名格式定義為

${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。