詳解Hadoop3.x新特性功能-HDFS糾刪碼
文章首發於微信公眾號:五分鐘學大數據
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個校驗塊
例:有 7、8、9 三個原始數據,通過矩陣乘法,計算出來兩個校驗數據 50、122。這時原始數據加上校驗數據,一共五個數據:7、8、9、50、122,可以任意丟兩個,然後通過算法進行恢復
矩陣乘法
GT是生成矩陣,RS(k,m)的生成矩陣就是m行k列的矩陣
Data代表原始數據,7,8,9代表原始數據塊
Parity代表校驗數據,50,122代表校驗數據塊
所以3個原始數據塊,如果使用2個校驗塊,EC編碼總共佔用5個數據塊的磁盤空間,與2副本機制佔用6個數據塊的磁盤空間容錯能力相當。
EC的應用場景
將EC技術集成進HDFS可以提高存儲效率,同時仍提供與傳統的基於副本的HDFS部署類似的數據持久性。例如,一個具有6個塊的3副本文件將消耗 6 * 3 = 18 個磁盤空間。但是,使用EC(6個數據,3個校驗)部署時,它將僅消耗9個磁盤空間塊。
但是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進行恢復工作。此過程類似於失敗時如何重新恢復副本的塊。重建執行三個關鍵的任務節點:
- 從源節點讀取數據:使用專用線程池從源節點並行讀取輸入數據。基於EC策略,對所有源目標的發起讀取請求,並僅讀取最少數量的輸入塊進行重建。
- 解碼數據並生成輸出數據:從輸入數據解碼新數據和奇偶校驗塊。所有丟失的數據和奇偶校驗塊一起解碼。
- 將生成的數據塊傳輸到目標節點:解碼完成後,恢復的塊將傳輸到目標DataNodes。
-
糾刪碼策略:為了適應異構的工作負載,HDFS群集中的文件和目錄允許具有不同的複製和糾刪碼策略。糾刪碼策略封裝了如何對文件進行編碼/解碼。每個策略由以下信息定義:
- EC模式:這包括EC組(例如6 + 3)中的數據和奇偶校驗塊的數量,以及編解碼器算法(例如Reed-Solomon,XOR)。
- 條帶化單元的大小。這確定了條帶讀取和寫入的粒度,包括緩衝區大小和編碼工作。
我們可以通過XML文件定義自己的EC策略,該文件必須包含以下三個部分:
- layoutversion:這表示EC策略XML文件格式的版本。
- schemas:這包括所有用戶定義的EC模式。
- policies:這包括所有用戶定義的EC策略,每個策略均由schema id和條帶化單元的大小(cellsize)組成。
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可能更合適。
在副本機制下,我們可以設置副本因子,指定副本的數量,但是在EC策略下,指定副本因子是沒有意義的,因為它始終為1,無法通過相關命令進行更改。
關注公眾號:五分鐘學大數據,獲取更多技術