這篇文章給大家分享的是有關Router-Based HDFS Federation在滴滴大數據中如何應用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
HDFS 的 Master/Slave 架構,使得其具有單點瓶頸,即隨著業務數據的大規模膨脹,Master 節點在元數據存儲與提供服務上都會存在瓶頸。為了克服 HDFS 單點瓶頸存在的擴展性、性能、隔離問題,社區提出了Federation( https://issues.apache.org/jira/browse/HDFS-1052 )方案來進行解決。
但是使用該方案之后,暴露給客戶的問題就是,同一個集群出現了多個命名空間(namespace),客戶需要知道讀寫的數據在哪個命名空間下才可以進行操作。為了解決統一命名空間的問題,社區提出了基于客戶端(client-side)的解決方案 ViewFS( https://issues.apache.org/jira/browse/HADOOP-7257 ),該方案會在客戶端做好配置,用戶目錄一對一的掛載到具體的命名空間目錄上,滴滴在解決 Federation 問題時使用的就是這個方案。
ViewFS 方案也存在一些問題:
對于已經發布出去客戶端升級比較困難;
對于新增目錄需要增加掛載配置,與產品對接,維護起來比較困難。
社區在 2.9 和 3.0 版本中發布了一個新的解決統一命名空間問題的方案 Router-Based Federation( https://issues.apache.org/jira/browse/HDFS-10467 ),該方案是基于服務端進行實現的,在升級管理方面比較好維護,滴滴最近引入了該方案,并進行了一些改造。
Router-Based Federation 對外提供了 Router 服務,包含在 Federation layer 中,如下圖所示。這個 Router 服務將允許用戶透明地訪問任何子集群,讓子集群獨立管理自己的 Blockpool。為了實現這些目標,Federation layer 必須將 Block 訪問引導至適當的子群集。同時,它具有可擴展性,高可用性和容錯性。
Federation layer 包含多個組件。Router 是一個與 Namenode 具有相同接口的組件,根據 State Store 的元數據信息將客戶端請求轉發給正確的子集群。State Store 組件包含了遠程掛載表(具有 ViewFS 特性,但在客戶端之間共享)和有關 SubCluster 的負載/空間信息。
下圖架構中顯示每個子集群增加了 Router(標記為“R”)和邏輯集中式(但物理分布式)的狀態存儲(State Store),以及每個 SubCluster 的 Namenodes(“NN”)和 Datanodes(“DN”)。這種方法與 YARN Federation(YARN-2915)具有相同的架構。
系統中可以有多個的 Router,每個 Router 有兩個角色:
向客戶端提供一個全局 Namenode 接口并負責轉發請求正確的子群集中的 Active Namenode;
在 State Store 中維護關于 Namenode 的信息。
Router 在收到客戶端請求,根據 mount-table 中的信息查找正確的子集群,然后轉發對該集群請求到對應子集群 Active Namenode。在收到 Active Namenode 的響應結果之后,將結果返回給客戶端 。 為了提升性能,Router 可以緩存遠程掛載表條目和子集群的狀態。
對于 Namenode 信息的維護,Router 定期檢查一個 Namenode 的狀態和向 State Store 報告其高可用性(HA)狀態和負載/空間狀態。 為了提高 Namenode HA 的性能,Router 使用 State Store 中的高可用性狀態信息,以將請求轉發到最有可能處于活動狀態的 Namenode。
Router 是無狀態的,所有 Router 同時提供服務。如果某個 Router 變成不可用,不影響其他任何 Router 提供服務。
客戶端配置他們的 DFS HA 客戶端(例如 ConfiguredFailoverProvider 或 RequestHedgingProxyProvider)與 Federation 中的所有 Router 配合使用。
為了實現高可用性和靈活性,多個 Router 可以監控相同的 Namenode 并把心跳發送信息到 State Store。 如果 Router 出現故障,這會增加信息的恢復能力。
如果 Router 不能連接到 State Store,它可能會錯誤地提供過期 locations 的訪問,讓 Federation 進入不一致的狀態。
為防止這種情況發生,當 Router 無法連接到 State Store 一段時間后,它會進入安全模式(類似于 Namenode 的 safe mode)。當客戶端嘗試訪問 safe mode 的 Router 時候,會拋出異常,客戶端的 Proxy 捕獲后,會嘗試連接其他的 Router。類似于 Namenode,Router 保持在這個安全模式,直到它確定 State Store 可用為止。
這可以防止 Router 啟動時出現不一致。 假定一個 Router 如果在一段時間內沒有心跳(例如,心跳間隔的五倍),則它已經死亡或處于安全模式。
為了與用戶和管理員進行交互,Router 公開了多個接口。包括 RPC、Admin、WebUI 。
RPC 實現了客戶端與 HDFS 交互的最常見接口。 目前僅支持使用普通 MapReduce,Spark 和 Hive ( on Tez,Spark 和MapReduce)。一些高級特性,如快照、加密和分層存儲在未來版本實現。 所有未實現的功能都會拋出異常。
Admin 為管理員實現的一個 RPC 接口,包括從子集群獲取信息、添加/刪除條目到 mout table。也可以通過命令行獲取和修改 Federation 信息。WebUI 實現了一個可視化 Federation 狀態,模仿了當前的 Namenode UI,除此之外,還包含 mout table,每個子集群的成員信息以及 Router 的狀態。
State Store 維護的信息包括:
子集群的塊訪問負載,可用磁盤空間,HA 狀態等狀態;
文件夾/文件和子集群之間的映射,即遠程 Mount Table;
Router 的狀態。State Store 的后端存儲是可配置的。 既可以可以存儲在文件中,也可以存在 ZooKeeper 中。
Membership 反映了 Federation 中的 Namenode 的狀態。包括有關子集群的信息,例如存儲量和節點數量。Router 定期檢測一個或多個 Namenode 的信息。
管理文件夾和子集群之間的映射。 它與 ViewFS 中的 Mount Table 類似:hdfs://tmp → hdfs://C0-1/tmp /* Folder tmp is mapped to folder tmp in subcluster C0-1 */
為了跟蹤 Router 中 caches 的狀態,Router 將其版本信息、狀態信息等存儲在 State Store 中。
目前 RBF 只是實現了一些基本 Namenode 接口,有些接口并不支持,HDFS-13655( https://issues.apache.org/jira/browse/HDFS-13655 )中會實現一些不支持的協議接口;當前 RBF 的穩定性也還存在一些問題,HDFS-13891( https://issues.apache.org/jira/browse/HDFS-13891 )會跟蹤一些穩定性問題進而解決掉。
社區 Hadoop 在 2.9 和 3.0 中發布了 RBF 這個 Feature,滴滴目前的 Hadoop 版本是 2.7.2,我們的做法是將 branch-2 分支里關于 RBF 的提交都移植到了我們的代碼中,做了一些必要的修改工作。
在滴滴的大數據集群中,Federation 拆成了 5 組 Namenode。經過性能測試,我們得出這樣的結論:一個 Router 對應服務一組 Namenode 不存在壓力,因此我們選擇部署 5 個 Router 來服務整個集群。目前 Router-Based Federation 方案在滴滴已經穩定運行 2 月有余。
直接引入 RBF 在運行 Hive 任務時會出現一些錯誤,例如 Wrong FS 等等。為此我們將 Hive 客戶端代碼做了修改,使其兼容 RBF。在 Hive 的元數據存儲中,location 信息存儲的是帶HDFS Schema 的絕對路徑信息,在 Hive 代碼中處理 move 邏輯時,我們都會將路徑做一個 resolve 得到實際的 HDFS 路徑,然后再進行處理,這樣可以避免該問題的出現。
在實際測試中,我們也發現了 RBF 的一些性能問題和 BUG,包括 Quota 問題、mount-table cache 使用不當問題、mount-table 創建 znode 出現 Null 問題等等。在解決這些問題之后,將 patch 貢獻給了社區,大部分被社區接收,具體修復和優化如下:
HDFS-13710: https://issues.apache.org/jira/browse/HDFS-13710
HDFS-13821: https://issues.apache.org/jira/browse/HDFS-13821
HDFS-13836: https://issues.apache.org/jira/browse/HDFS-13836
HDFS-13844: https://issues.apache.org/jira/browse/HDFS-13844
HDFS-13845: https://issues.apache.org/jira/browse/HDFS-13845
HDFS-13854: https://issues.apache.org/jira/browse/HDFS-13854
HDFS-13856: https://issues.apache.org/jira/browse/HDFS-13856
HDFS-13857: https://issues.apache.org/jira/browse/HDFS-13857
HDFS-13802: https://issues.apache.org/jira/browse/HDFS-13802
HDFS-13852: https://issues.apache.org/jira/browse/HDFS-13852
HDFS-14114: https://issues.apache.org/jira/browse/HDFS-14114
感謝各位的閱讀!關于“Router-Based HDFS Federation在滴滴大數據中如何應用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。