詳解HDFS3.x新特性-糾刪碼

EC介紹

Erasure Coding  簡稱EC,中文名:糾刪碼算法

EC(糾刪碼)是一種編碼技術,在HDFS以前,這種編碼技術在廉價磁盤冗餘陣列(RAID)中應用最普遍(RAID介紹:大數據預備知識-存儲磁盤、磁盤冗餘陣列RAID介紹),RAID經過條帶化技術實現EC,條帶化技術就是一種自動將 I/O 的負載均衡到多個物理磁盤上的技術,原理就是將一塊連續的數據分紅不少小部分並把他們分別存儲到不一樣磁盤上去,這就能使多個進程同時訪問數據的多個不一樣部分而不會形成磁盤衝突(當多個進程同時訪問一個磁盤時,可能會出現磁盤衝突),並且在須要對這種數據進行順序訪問的時候能夠得到最大程度上的 I/O 並行能力,從而得到很是好的性能。在HDFS中,把連續的數據分紅不少的小部分稱爲條帶化單元,對於原始數據單元的每一個條帶單元,都會計算並存儲必定數量的奇偶檢驗單元,計算的過程稱爲編碼,能夠經過基於剩餘數據和奇偶校驗單元的解碼計算來恢復任何條帶化單元上的錯誤緩存

HDFS數據冗餘存儲策略

HDFS的存儲策略是副本機制,這種存儲方式使得數據存儲的安全性獲得提升,但同時也帶來了額外的開銷,HDFS默認的3副本方案在存儲空間和其餘資源(如網絡帶寬)上有200%的額外開銷,可是對於I/O活動相對較低的數據,在正常期間不多訪問其餘塊副本,可是仍然消耗與第一個副本相同的資源量。所以,HDFS 3.x版本一個重大改進就是使用糾刪碼(EC)代替副本機制,糾刪碼技術提供了與副本機制相同的容錯能力,而存儲空間卻少得多。在典型的糾刪碼(EC)設置中,存儲開銷不超過50%。安全

EC算法實現原理

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的應用場景

將EC技術集成進HDFS能夠提升存儲效率,同時仍提供與傳統的基於副本的HDFS部署相似的數據持久性。例如,一個具備6個塊的3副本文件將消耗 6 * 3 = 18 個磁盤空間。可是,使用EC(6個數據,3個校驗)部署時,它將僅消耗9個磁盤空間塊。oop

可是EC在編碼過程及數據重建期間會大量的使用CPU資源,而且數據大部分是執行遠程讀取,因此還會有大量的網絡開銷。佈局

因此,對於CPU資源緊張且存儲成本較低的狀況下,能夠採用副本機制存儲數據,對於CPU資源有剩餘且存儲成本較高的狀況下,能夠採用EC機制存儲數據性能

EC在HDFS的架構

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進行恢復工做。此過程相似於失敗時如何從新恢復副本的塊。重建執行三個關鍵的任務節點:

  1. 從源節點讀取數據:使用專用線程池從源節點並行讀取輸入數據。基於EC策略,對全部源目標的發起讀取請求,並僅讀取最少數量的輸入塊進行重建。
  2. 解碼數據並生成輸出數據:從輸入數據解碼新數據和奇偶校驗塊。全部丟失的數據和奇偶校驗塊一塊兒解碼。
  3. 將生成的數據塊傳輸到目標節點:解碼完成後,恢復的塊將傳輸到目標DataNodes。

糾刪碼策略:爲了適應異構的工做負載,HDFS羣集中的文件和目錄容許具備不一樣的複製和糾刪碼策略。糾刪碼策略封裝瞭如何對文件進行編碼/解碼。每一個策略由如下信息定義:

  1. EC模式:這包括EC組(例如6 + 3)中的數據和奇偶校驗塊的數量,以及編解碼器算法(例如Reed-Solomon,XOR)。
  2. 條帶化單元的大小。這肯定了條帶讀取和寫入的粒度,包括緩衝區大小和編碼工做。

咱們能夠經過XML文件定義本身的EC策略,該文件必須包含如下三個部分:

  1. layoutversion:這表示EC策略XML文件格式的版本。
  2. schemas:這包括全部用戶定義的EC模式。
  3. policies:這包括全部用戶定義的EC策略,每一個策略均由schema id和條帶化單元的大小(cellsize)組成。

Hadoop conf目錄中有一個配置EC策略的XML示例文件,配置時能夠參考該文件,文件名稱爲user_ec_policies.xml.template。

集羣的硬件配置

糾刪碼對羣集在CPU和網絡方面提出了其餘要求:

  1. 編碼和解碼工做會消耗HDFS客戶端和DataNode上的額外CPU。
  2. 糾刪碼文件也分佈在整個機架上,以實現機架容錯。這意味着在讀寫條帶化文件時,大多數操做都是在機架上進行的。所以,網絡二等分帶寬很是重要。
  3. 對於機架容錯,擁有至少與配置的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可能更合適。

在副本機制下,咱們能夠設置副本因子,指定副本的數量,可是在EC策略下,指定副本因子是沒有意義的,由於它始終爲1,沒法經過相關命令進行更改。

搜索公衆號「五分鐘學大數據」,深刻鑽研大數據技術

相關文章
相關標籤/搜索