Hadoop 服務註冊可以使用在許多方面:-
註冊表的使用者可以同時是條目(服務記錄)的發佈者,也可以是透過其服務記錄找到的其他服務的使用者。分散式應用程式的不同部分也可以將其用於不同的目的。舉例來說,YARN 應用程式的應用程式主控程式可以發佈繫結,供其工作人員容器使用。然後,在容器中執行的程式碼可以查詢繫結,以與該管理員進行通訊,即使該管理員已在叢集的不同節點上重新啟動。用戶端應用程式可以查詢外部服務端點,以透過公開 API 與 AM 進行互動。
註冊表無法用於:-
yarn:persistence = "application_attempt" yarn:id = ${application_attemptId}
這表示,即使建立新的嘗試,此記錄也會在應用程式嘗試完成時刪除。每個應用程式嘗試都必須重新註冊端點,而這可能是找到服務所需要的。
yarn:persistence = "application_attempt" yarn:id = application_attemptId
這表示,此記錄會持續存在,即使在應用程式嘗試之間也是如此,儘管端點資訊已過時。
路徑的選擇是應用程式特定的。對於保證 YARN 應用程式名稱唯一的服務,我們建議採用以下慣例
/users/${username}/applications/${service-class}/${instance-name}
或者,可以在路徑中使用應用程式 ID
/users/${username}/applications/${service-class}/${applicationId}
後者使得將 YARN 應用程式清單條目對應到服務記錄變得非常簡單。
用戶端應用程式可以找到服務
找到服務記錄後,用戶端可以列舉外部
繫結,並找到具有所需 API 的條目。
這裡 YARN 應用程式中的所有容器都發佈服務端點,供公開使用。
id:password
配對,讓它們有權限在沒有使用者的 kerberos 認證資料的情況下更新這些條目。這讓容器可以在授予 AM 寫入權限至登錄路徑的使用者權杖過期後,更新它們的條目。id:password
配對建立登錄作業實例。${base-path} + "/" + RegistryPathUtils.encodeYarnID(containerId)
此記錄應具有容器持久性政策和容器 ID
yarn:persistence = "container" yarn:id = containerId
當容器終止時,條目會自動刪除。
此容器已部署服務的已匯出服務端點應列在服務記錄的 external
端點清單中。
${base-path}
下的條目,列舉 YARN 應用程式匯出的所有容器。通常固定在叢集中的服務,但需要發佈繫結和組態資訊的服務,可以發佈在登錄中。範例:Apache Oozie 服務。已部署應用程式可能也發佈至叢集外部的服務。範例:Amazon Dynamo 實例。
這些服務可以註冊在屬於執行服務的使用者路徑下,例如 /users/oozie
或 /users/hbase
。用戶端應用程式會使用此路徑。雖然這可以驗證服務記錄的有效性,但它依賴於用戶端應用程式知道服務已部署的使用者名稱,或已組態完整路徑。
另一種方式是讓服務部署在 /services
下的靜態服務路徑下。例如,/services/oozie
可以包含 Oozie 服務的註冊。由於此路徑的權限限制為預先組態的系統帳戶,因此在安全叢集上此路徑上的服務註冊的存在,確認它是由叢集管理工具註冊的。
/services
下,且它是由其中一個系統使用者帳戶部署的,它可以自行註冊。在此,YARN 容器會向其 AM 註冊以接收工作,通常透過某種心跳機制,定期回報。如果 AM 已設定為容器在應用程式嘗試結束後繼續執行,則當 AM 發生故障時,容器會繼續執行。這些容器需要繫結至任何重新啟動的 AM。它們也可能希望得出結論,如果 AM 沒有重新啟動,它們最終應該逾時並自行終止。此類政策有助於應用程式對應網路分割。
internal
端點清單中,其中 api
欄位設定為容器使用的特定 API 的 URL。ps
指令中。更安全的方法是將共用機密儲存在叢集檔案系統,將路徑傳遞給容器。此類路徑的 URI 可能會是應用程式的已註冊內部端點之一。管理埠和繫結僅是其他要發布的端點。這些應發布為內部端點,因為它們不供公開使用。
客戶端應用程式希望找出實作特定 API 的所有服務,例如 "classpath://org.apache.hbase"
registryOperations.list(path)
以列出該路徑下所有節點,取得子節點的相對清單。stat()
來列舉子記錄狀態。ServiceRecordHeader.getLength()
的值,它可能會包含服務記錄。resolve()
作業來擷取內容。如果成功,它確實包含服務記錄,因此客戶端可以列舉外部
端點,並找出具有所需 API 的端點。RegistryPathStatus
狀態項目的 children
欄位。如果它大於或等於 0,應對該項目的路徑執行遞迴列舉。此演算法描述了註冊表樹的深度優先搜尋。當然,可以進行變更,包括廣度優先搜尋,或在找到單一進入點時立即停止搜尋。也可以選擇對不同的子樹進行平行搜尋,這可能會縮短搜尋時間,儘管是以增加註冊表基礎架構上的客戶端負載為代價。
一個工具類別 RegistryUtils
提供靜態工具方法,用於常見的登錄操作,特別是,RegistryUtils.listServiceRecords(registryOperations, path)
執行指定路徑的所有立即子記錄條目的列示和收集。
客戶端應用程式會遇到「當端點無效時該怎麼辦」的問題,特別是當服務未執行時,該怎麼辦?
有些傳輸假設中斷是暫時的,並且針對原始繫結進行旋轉重試是正確的策略。這是 Hadoop IPC 客户端的預設政策。
其他傳輸會快速失敗,立即透過例外或其他機制報告失敗。這對客戶端是直接可見的,但允許客戶端重新掃描登錄並重新繫結到應用程式。
最後,有些應用程式從一開始就設計為動態故障轉移:它們發布的繫結資訊實際上是一個 zookeeper 路徑。Apache HBase 和 Apache Accumulo 就是這種情況的範例。登錄用於繫結的初始查詢,之後客戶端會自然而然地對故障具有復原力。