Shockang 2021-08-15 21:13:49 阅读数:451
這是我參與8月更文挑戰的第6天,活動詳情查看:8月更文挑戰
HDFS 為了提高可靠性,采用了“暴力”的三副本技術,這就帶來了存儲成本的問題。業界一直在探索如何降低存儲成本。 傳統的 RAID 技術就被很自然地借鑒過來與 HDFS 相結合。 通過結合 RAID 的 糾删碼(Erasuredcode)技術,存儲成本從原來的 HDFS 默認的3倍降低到1.4倍。 從 Hadoop3.x 開始 HDFS 就已經使用文件糾删碼技術(ErasuredCode)代替三副本機制了。
糾删碼常見的有三類:Reed-Solomen 類、級聯低密度糾删碼和數字噴泉碼。
這裏只簡單介紹下目前廣泛應用的 Reed-Solomen 類糾删碼。
從糾刑碼的基本形態來看,它是N個數據+M個校驗的結構,其中數據和校驗的N和M值都能够按照一定的規則設定。
在1~M個數據塊(數據或校驗均可)損壞的情况下,整體數據仍然可以通過計算剩餘數據塊上的數據得出,整體數據不會丟失,存儲仍然可用。
從圖中可以看出,糾删碼和RAID技術有些類似,一個條帶(Stripe)是由多個數據塊(Strip) 構成的,分為數據塊和校驗塊。
但與 RAID5、 RAID6 不同的是,糾删碼從功能上來看最大的區分特點是校驗和數據的比例可按N+M可調整,並且校驗塊數量不再受限於兩個,典型的如12+4、6+3等。
關於 RAID 技術請參考我的這篇博客——一篇文章搞懂 RAID 技術是什麼
糾删碼通過技術含量較高的算法,提供和副本近似的可靠性,同時减小了額外所需冗餘設備的數量,提高了存儲設備的利用率。
但糾删碼所帶來的額外負擔主要是計算量和數倍的網絡負載。
尤其是在出現硬盤故障後,重建數據將耗費大量的CPU資源,而且計算一個數據塊需要通過網絡讀出N倍的數據並傳輸,所以網絡負載也有數倍甚至數十倍的增加。
從整體來看,若采用糾删碼技術,則能够得到希望的容錯能力和存儲資源利用率,但是需要接受一定的數據重建代價,二者之間需要進行平衡。
那麼,有沒有優化改善的空間呢?
如果仔細分析故障出現的原因,則會很容易發現兩個特征。
因此,優化的思路自然聚集到更容易出現的單個磁盤故障上來。
如何更有效地處理這種概率較大的事件呢?
最佳的解决方案是分組,把單個磁盤故障的影響範圍縮小到各個組內部,當磁盤出現故障時,在該組內部解决,在恢複過程中讀組內更少的盤,跑更少的網絡流量,從而减小對全局的影響。
LRC(Locally Repairable Codes)意為局部校驗編碼,其核心思想為:
將校驗塊分為全局校驗塊和局部校驗塊,在故障恢複時分組計算。
以微軟 Azure 的雲存儲(Windows Azure Storage)實現為例:
相對於副本而言,糾删碼(Erasure Code)的編碼技術無疑對存儲空間利用率帶來很大提昇,但由於引入額外的編碼、解碼運算,對分布式系統的計算能力和網絡都有一定的額外要求。簡單地理解就是硬件性能要昇級,網絡環境也要昇級,昇級的代價在現階段還是一筆不小的預算。
而由於性能損失的原因,用在本身壓力已經很大、很“熱”的在線存儲系統明顯不是很合適, 所以目前大多數系統還是把Erasure Code用於冷數據的離線處理階段。
LRC編碼由於减少了網絡1O0傳輸的數據量,所以參與數據恢複運算的數據量和重建時間基本上能够縮短一倍,但這是以犧牲可靠性和空間利用率為代價的。
HDFS RAID的實現(Facebook的實現)主要是在現有的HDFS上增加了一個包裝 Contrib,如圖所示。之所以不在HDFS上直接修改,原設計者的解釋是HDFS的核心代碼已經够複雜了不想讓它更複雜
文件數據的RAID化有兩種場景
RAID Node 上的 BlockIntegrityMonitor 線程會通過文件檢查工具檢查系統中沖突或失效的數據,然後通過 BlockCopier 和 BlockFixer 線程周期性地對這些數據進行修複。
在 Local模式下,修複過程在 RaidNode 上執行;而在 Dist 模式下,修複過程通過提交Job的方式交由集群完成。
HDFS-7285 和 HDFS RAID 不同,它將編碼過程集成到 HDFS 內部,需要對整個 HDFS 內部實現進行改造,包括 DataNode、 NameNode及 DFS Client。該方案同時支持在線和離線 EC。
HDFS是應用級的塊存儲,為了支持非文件性質的系統數據, Hortonworks 改進了HDFS,將塊存儲和對象存儲融合,提出 Ozone,將HDFS從文件系統擴展到更複雜的企業應用。
過去,HDFS架構將元數據管理與數據存儲分離成兩個相互獨立的層。
文件數據存儲在包含有上千個存儲服務器(節點)的存儲層,而元數據存儲在文件元數據層。
HDFS的這種分離方式使得應用直接從存儲磁盤讀寫數據時能够獲得很高的吞吐量擴展空間。
Ozone使得HDFS塊存儲層能够進一步支持非文件性質的系統數據,而HDFS的文件塊架構也將支持存儲鍵值和對象。
與HDFS的名稱空間元數據類似, Ozone的元數據系統也基於塊存儲層, 但是 Ozone的元數據將被動態分配,支持大量的 Bucket Space。
Hortonworks認為,HDFS將自然進化成一個完整的企業大數據存儲系統,而 Ozone也將以 Apache 項目(HDFS-7240)的方式開源。
HDFS是根據 Google 的論文啟發而發明的塊存儲,但是 HDFS 應該理解為應用級的存儲,程序完全構建在 OS 普通用戶態空間裏,存儲的可靠性靠“暴力”的三副本來保證。
訪問 HDFS 需要使用專門的接口,因此 HDFS 只適合在 Hadoop 領域使用簡單的塊存儲軟件,並沒有存儲很多企業特性, 如快照、重複數據消除等。
傳統的存儲都構築在專門的SAN硬件上,通信接口也采用SAS等存儲專有接口,專有服務器帶來的成本高、擴展性差等缺陷越來越不被客戶所接受。
隨著分布式技術的發展,一些專門做存儲的廠商自然而然地想到用通用服務器來做存儲,於是就有了一系列解决方案,最有名的是 Vmware的Virtual SAN。
在EC背景下,striping 有幾個關鍵優勢。
首先,它啟用了在線EC(立即以EC格式寫入數據),避免了轉換階段,並立即節省存儲空間。
在線EC還通過並行利用多個磁盤主軸來提高順序I/O性能;這在具有高端網絡的集群中尤為可取。
其次,它自然地將一個小文件分發給多個DataNodes,並消除了將多個文件捆綁到單個編碼組中的必要性。這大大簡化了文件操作,如删除、配額報告和聯邦命名空間之間的遷移。
在典型的HDFS集群中,小文件可以占總存儲消耗的四分之三以上。為了更好地支持小文件,在第一階段的工作中,HDFS支持帶條紋的EC。
未來HDFS還將支持連續的EC布局。有關更多信息,請參閱HDFS-7285的設計文檔和討論。
Striped HDFS 文件在邏輯上由塊組組成,每個塊組包含一定數量的內部塊。
為了减少這些額外塊的NameNode內存消耗,引入了一種新的分層塊命名協議。
塊組(block group)的ID可以從其任何內部塊的ID推斷。
這允許在塊組而不是塊級別進行管理。
客戶端讀寫路徑被增强,以並行處理塊組中的多個內部塊。
在輸出/寫入路徑上,DFSStripedOutputStream 管理一組數據流,每個數據節點一個,在當前塊組中存儲一個內部塊。
數據流大多异步工作。協調員(coordinator)負責整個塊組的操作,包括結束當前塊組、分配新的塊組等。
在輸入/讀取路徑上,DFSStripedInputStream 將請求的數據邏輯字節範圍轉換為存儲在 DataNodes 上的內部塊。
然後,它並行發布讀取請求。失敗後,它會發出額外的讀取請求進行解碼。
DataNode運行一個額外的 ErasureCodingWorker(ECWorker)任務,用於後臺恢複失敗的 Erasure 編碼塊。
失敗的EC塊由NameNode檢測,然後選擇數據節點進行恢複工作。恢複任務作為心跳響應傳遞。
這個過程類似於複制的塊在失敗時如何複制。
為了適應异構的工作負載,我們允許 HDFS 集群中的文件和目錄具有不同的複制和糾删碼策略。
糾删碼策略封裝了如何對文件進行編碼/解碼。
每個策略由以下信息定義:
策略被命名為 codec-num data blocks-num parity blocks-cell size 。
目前,支持五種內置策略:RS-3-2-1024k、RS-6-3-1024k、RS-10-4-1024k、RS-LEGACY-6-3-1024k、XOR-2-1-1024k。
默認的複制方案也受支持。它只能設置在目錄上,以强制目錄采用3倍複制方案,而不是繼承其祖先的糾删碼策略。此策略使3倍複制方案目錄與糾删碼目錄交織成為可能。
複制總是啟用的。在所有EC策略中,默認情况下啟用RS(6,3)。
與HDFS存儲策略類似,糾删碼策略設置在目錄上。創建文件時,它將繼承其最近祖先目錄的EC策略。
目錄級EC策略僅影響目錄內創建的新文件。創建文件後,可以查詢其删除編碼策略,但不能更改。
如果删除編碼文件重命名為具有不同EC策略的目錄,則該文件將保留其現有EC策略。
將文件轉換為不同的EC策略需要重寫其數據;通過複制文件(例如通過distcp)而不是重命名來做到這一點。
關於 distcp 請參考我的這篇博客——distcp 是什麼?如何在兩個 HDFS 集群之間傳輸數據?
一個名為 user_ec_policies.xml.template 的EC策略XML文件示例比特於Hadoop conf目錄中,用戶可以引用。
英特爾ISA-L代錶英特爾智能存儲加速庫。
ISA-L是為存儲應用程序設計的優化低級函數的開源集合。
它包括為英特爾 AVX 和 AVX2 指令集優化的快速 Reed-Solomon 類型糾删碼。
HDFS 糾删碼可以利用ISA-L來加速編碼和解碼計算。
ISA-L支持大多數主要操作系統,包括Linux和Windows。
默認情况下,ISA-L不啟用。
版权声明:本文为[Shockang]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815211248099Q.html