Erasure Coding 簡稱EC,中文名:糾刪碼算法
EC(糾刪碼)是一種編碼技術,在HDFS以前,這種編碼技術在廉價磁盤冗餘陣列(RAID)中應用最普遍(RAID介紹:大數據預備知識-存儲磁盤、磁盤冗餘陣列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表示校驗塊,有多少個校驗塊就最多可容忍多少個塊(包括數據塊和校驗塊)丟失,具體原理經過以下例子解釋:網絡
咱們使用RS(3,2),表示使用3個原始數據塊,2個校驗塊
例:有 七、八、9 三個原始數據,經過矩陣乘法,計算出來兩個校驗數據 50、122。這時原始數據加上校驗數據,一共五個數據:七、八、九、50、122,能夠任意丟兩個,而後經過算法進行恢復
架構
GT是生成矩陣,RS(k,m)的生成矩陣就是m行k列的矩陣
Data表明原始數據,7,8,9表明原始數據塊
Parity表明校驗數據,50,122表明校驗數據塊負載均衡
因此3個原始數據塊,若是使用2個校驗塊,EC編碼總共佔用5個數據塊的磁盤空間,與2副本機制佔用6個數據塊的磁盤空間容錯能力至關。ide
將EC技術集成進HDFS能夠提升存儲效率,同時仍提供與傳統的基於副本的HDFS部署相似的數據持久性。例如,一個具備6個塊的3副本文件將消耗 6 * 3 = 18 個磁盤空間。可是,使用EC(6個數據,3個校驗)部署時,它將僅消耗9個磁盤空間塊。oop
可是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策略,該文件必須包含如下三個部分:
- layoutversion:這表示EC策略XML文件格式的版本。
- schemas:這包括全部用戶定義的EC模式。
- policies:這包括全部用戶定義的EC策略,每一個策略均由schema id和條帶化單元的大小(cellsize)組成。
Hadoop conf目錄中有一個配置EC策略的XML示例文件,配置時能夠參考該文件,文件名稱爲user_ec_policies.xml.template。
糾刪碼對羣集在CPU和網絡方面提出了其餘要求:
在HDFS默認狀況下,全部的EC策略是被禁止的,咱們能夠根據羣集的大小和所需的容錯屬性,經過hdfs ec [-enablePolicy -policy]命令啓用EC策略。例如,對於具備9個機架的羣集,像RS-10-4-1024k這樣的策略將不會保留機架級的容錯能力,而RS-6-3-1024k或RS-3-2-1024k可能更合適。
在副本機制下,咱們能夠設置副本因子,指定副本的數量,可是在EC策略下,指定副本因子是沒有意義的,由於它始終爲1,沒法經過相關命令進行更改。