HDFS是一個高吞吐、高容錯的分佈式文件系統,可是HDFS在保證高容錯的同時也帶來了高昂的存儲成本,好比有5T的數據存儲在HDFS上,按照HDFS的默認3副本機制,將會佔用15T的存儲空間。那麼有沒有一種能達到和副本機制相同的容錯能力可是能大幅度下降存儲成本的機制呢,有,就是在HDFS 3.x 版本引入的糾刪碼機制。算法
Erasure Coding 簡稱 EC,中文名:糾刪碼緩存
EC(糾刪碼)是一種編碼技術,在 HDFS 以前,這種編碼技術在廉價磁盤冗餘陣列(RAID)中應用最普遍,RAID 經過條帶化技術實現 EC,條帶化技術就是一種自動將 I/O 的負載均衡到多個物理磁盤上的技術,原理就是將一塊連續的數據分紅不少小部分並把他們分別存儲到不一樣磁盤上去,這就能使多個進程同時訪問數據的多個不一樣部分而不會形成磁盤衝突(當多個進程同時訪問一個磁盤時,可能會出現磁盤衝突),並且在須要對這種數據進行順序訪問的時候能夠得到最大程度上的 I/O 並行能力,從而得到很是好的性能。安全
在HDFS中,把連續的數據分紅不少的小部分稱爲條帶化單元,對於原始數據單元的每一個條帶單元,都會計算並存儲必定數量的奇偶檢驗單元,計算的過程稱爲編碼,能夠經過基於剩餘數據和奇偶校驗單元的解碼計算來恢復任何條帶化單元上的錯誤。網絡
HDFS的存儲策略是副本機制,這種存儲方式使得數據存儲的安全性獲得提升,但同時也帶來了額外的開銷,HDFS默認的3副本方案在存儲空間和其餘資源(如網絡帶寬)上有200%的額外開銷,可是對於I/O活動相對較低的數據,在正常期間不多訪問其餘塊副本,可是仍然消耗與第一個副本相同的資源量。架構
所以,HDFS 3.x 版本一個重大改進就是使用糾刪碼(EC)代替副本機制,糾刪碼技術提供了與副本機制相同的容錯能力,而存儲空間卻少得多。在典型的糾刪碼(EC)設置中,存儲開銷不超過50%。負載均衡
EC的實現算法有不少種,較爲常見的一種算法是Reed-Solomon(RS),它有兩個參數,記爲RS(k,m)
,k 表示數據塊,m 表示校驗塊,有多少個校驗塊就最多可容忍多少個塊(包括數據塊和校驗塊)丟失,具體原理經過以下例子解釋:koa
咱們使用RS(3,2)
,表示使用 3 個原始數據塊,2 個校驗塊。分佈式
例:由RS(3,2)
可求出它的生成矩陣 GT,和 七、八、9 三個原始數據塊 Data,經過矩陣乘法,計算出來兩個校驗數據塊 50、122。這時原始數據加上校驗數據,一共五個數據塊:七、八、九、50、122,能夠任意丟兩個,而後經過算法進行恢復,矩陣乘法以下圖所示:ide
GT 是生成矩陣,RS(k,m) 的生成矩陣就是 m 行 k 列的矩陣;
Data 表明原始數據,7,8,9表明原始數據塊;
Parity 表明校驗數據,50,122表明校驗數據塊。oop
因此3個原始數據塊,若是使用2個校驗塊,EC編碼總共佔用5個數據塊的磁盤空間,與2副本機制佔用6個數據塊的磁盤空間容錯能力至關。
將EC技術集成進HDFS能夠提升存儲效率,同時仍提供與傳統的基於副本的HDFS部署相似的數據持久性。例如,一個具備6個塊的3副本文件將消耗 6 * 3 = 18 個磁盤空間。可是,使用EC(6個數據,3個校驗)部署時,它將僅消耗9個磁盤空間塊。
可是EC在編碼過程及數據重建期間會大量的使用CPU資源,而且數據大部分是執行遠程讀取,因此還會有大量的網絡開銷。
因此,對於CPU資源緊張且存儲成本較低的狀況下,能夠採用副本機制存儲數據,對於CPU資源有剩餘且存儲成本較高的狀況下,能夠採用EC機制存儲數據。
HDFS 是直接使用 Online EC
(以EC格式寫入數據),避免了轉換階段並節省了存儲空間。Online EC
還經過並行利用多個磁盤主軸來加強順序I/O
性能。在具備高端網絡的羣集中,這尤爲理想。其次,它天然地將一個小文件分發到多個DataNode,而無需將多個文件捆綁到一個編碼組中。這極大地簡化了文件操做,例如刪除,磁盤配額以及namespaces之間的遷移。
在通常HDFS集羣中,小文件可佔總存儲消耗的3/4以上,爲了更好的支持小文件,HDFS目前支持條形佈局(Striping Layout)的EC方案,而HDFS連續佈局(Contiguous Layout)方案正在開發中。
優勢:
缺點:
優勢:
缺點:
傳統模式下 HDFS 中文件的基本構成單位是block
,而EC模式下文件的基本構成單位是block group
。以RS(3,2)爲例,每一個block group
包含3個數據塊,2個校驗塊。
HDFS對於引入EC模式所作的主要擴展以下:
NameNode:HDFS文件在邏輯上由block group組成,每一個block group包含必定數量的內部塊,爲了減小這些內部塊對NameNode內存消耗,HDFS引入了新的分層塊命名協議。能夠從其任何內部塊的ID推斷出block group的ID。這容許在塊組而不是塊的級別進行管理。
Client:客戶端讀取和寫入路徑獲得了加強,能夠並行處理block group中的多個內部塊。
DataNode:DataNode運行額外ErasureCodingWorker(ECWorker)任務,用於對失敗的糾刪編碼塊進行後臺恢復。NameNode檢測到失敗的EC塊, 會選擇一個DataNode進行恢復工做。此過程相似於失敗時如何從新恢復副本的塊。重建執行三個關鍵的任務節點:
糾刪碼策略:爲了適應異構的工做負載,HDFS羣集中的文件和目錄容許具備不一樣的複製和糾刪碼策略。糾刪碼策略封裝瞭如何對文件進行編碼/解碼。每一個策略由如下信息定義:
咱們能夠經過XML文件定義本身的EC策略,該文件必須包含如下三個部分:
Hadoop conf
目錄中有一個配置EC策略的XML示例文件,配置時能夠參考該文件,文件名稱爲user_ec_policies.xml.template
。
糾刪碼對羣集在CPU和網絡方面有必定的要求:
編碼和解碼工做會消耗HDFS客戶端和DataNode上的額外CPU。
糾刪碼文件也分佈在整個機架上,以實現機架容錯。這意味着在讀寫條帶化文件時,大多數操做都是在機架上進行的。所以,網絡二等分帶寬很是重要。
對於機架容錯,擁有至少與配置的EC條帶寬度同樣多的機架也很重要。對於EC策略RS(6,3)
,這意味着最少要有9個機架,理想狀況下是10或11個機架,以處理計劃內和計劃外的中斷。對於機架少於條帶寬度的羣集,HDFS沒法保持機架容錯,但仍會嘗試在多個節點之間分佈條帶化文件以保留節點級容錯。
在HDFS默認狀況下,全部的EC策略是被禁止的,咱們能夠根據羣集的大小和所需的容錯屬性,經過hdfs ec [-enablePolicy -policy]
命令啓用EC策略。
例如,對於具備9個機架的羣集,像RS-10-4-1024k
這樣的策略將不會保留機架級的容錯能力,而RS-6-3-1024k
或RS-3-2-1024k
可能更合適。
RS-10-4-1024k
表示有10個數據塊,4個校驗塊。
在副本機制下,咱們能夠設置副本因子,指定副本的數量,可是在EC策略下,指定副本因子是沒有意義的,由於它始終爲1,沒法經過相關命令進行更改。