當前位置:編程學習大全網 - 源碼下載 - HDFS糾刪碼

HDFS糾刪碼

副本是昂貴的--在HDFS中默認的3副本機制有200%的存儲空間和其它的資源(比如:網絡帶寬)開銷。然而,相對於低 I/O 活動的暖數據集和冷數據集,在正常的操作期間對其額外的副本很少訪問,但是仍然消耗與第壹副本相同數量的資源。

因此,壹個自然的改進是使用糾刪碼(Erasure Coding)替代副本機制,它使用更少的存儲空間提供相同的容錯級別,壹個典型的糾刪碼設置,會使得存儲空間的開銷不超過50%;壹個EC文件的副本因子是無意義的,它壹直保持為1,並且不能通過命令 -setrep修改EC的副本因子的值。

磁盤陣列(RAID)是在存儲系統中,使用EC最出名的。RAID使用條 帶的方式實現的EC,它提供邏輯上序列的數據(比如文件)到更小的單元(比如比特、字節、或塊),並存儲連續的單元到不同的磁盤上。在本指南的其余部分,這種條帶分布單元被稱為條帶單元(或者單元),對於每壹個條帶原始數據單元,計算並存儲壹定數量的奇偶校驗單元,這個過程叫做編碼。通過對剩余的數據和奇偶校驗單元解碼計算,可以恢復任意條帶單元的錯誤。

將EC和HDFS集成可以提高存儲效率,然而同樣提供傳統的基於副本機制的HDFS持久化部署,例如:3副本的文件有6個塊,將會消耗 6*3 = 18個塊的磁盤空間,但是使用EC(6個數據,3個校驗)部署,他將只消耗9個塊的磁盤空間。

在EC的環境中,條帶有若幹主要的優點,首先,它能在線EC(使用EC的格式直接寫數據),避免轉換階段,直接節省存儲空間。在線EC通過並行利用多磁盤主軸增強I/O性能;這在高性能的網絡的集群中尤其需要。其次,它自然的分發小文件到多個DataNodes,消除了將多個文件綁定到壹個編碼組的需要,這會很大的簡化文件的操作,比如刪除、配額匯報和在聯邦集群中不同的Namespace之間遷移數據等。在典型的HDFS集群中,小文件占總存儲空間3/4以上的消耗,為了更好的支持小文件,在第壹階段工作中,HDFS支持條帶的EC。在未來,HDFS也會支持連續的EC布局,查看設計文檔,更多的信息在issue HDFS-7285 中討論。

條帶的HDFS文件是由邏輯上的塊組構成,每個塊組包含壹定數量的內部塊,為了減少額外的塊對NameNode內存消耗,提出了新的分層塊命名協議,塊組的ID可以從它的內部塊的任意 ID 中推斷出來,這允許塊組級別的管理,而不是塊級別的。

客戶端讀寫路徑被增強,可以並行處理壹個塊組的多個內部塊;在輸出/寫入路徑, DFSStripedOutputStream 用於管理壹組數據流,每個數據流對應壹個DataNode,該DataNode在當前塊組中存儲壹個內部塊,這些數據流大多是異步工作;協調器負責操作整個塊組,包括結束當前的塊組、分配新的塊組等等。在輸入 / 讀路徑, DFSStripedInputStream 將請求的邏輯字節範圍的數據轉換為存儲在DataNodes上的內部塊的範圍,然後並行的發布讀請求,在出現故障時,它發出額外的讀請求用於解碼。

DataNode會運行壹個額外的 ErasureCodingWorker (ECWorker) 任務用於後臺恢復失敗的EC塊,當NameNode檢測到壹個失敗的EC塊,它會選擇壹個DataNode去做恢復的工作,恢復任務通過心跳響應傳遞至DataNode,這個過程類似於副本塊重新復制失敗的數據塊,重建失敗的塊有3個主要的任務:

使用專用的線程池並行的讀取輸入數據,基於EC策略,它將所有的讀請求調度到所有的源節點,並且只讀取最小數據量的輸入塊數用於重構。

從輸入數據中解碼出新的數據塊和奇偶校驗塊,所有丟失的數據塊和校驗塊壹起解碼。

解碼完成後,恢復的數據塊被傳輸到目標DataNode節點。

為了使糾刪碼策略適合異構的工作方式,我們允許HDFS集群上的文件和目錄具有不同的副本和糾刪碼策略,糾刪碼策略封裝了如何編碼/解碼文件,每壹個策略由以下信息部分定義:

這個包括在EC組(比如:6+3)中數據塊和校驗塊的數量,以及編解碼器算法(比如: Reed-Solomon, XOR )

這決定了條帶讀寫的粒度,包括緩沖區大小和編碼工作。

策略被命名為數據塊數量-校驗塊數量-塊單元的大小,當前支持6種內置策略:RS-3-2-1024k,?RS-6-3-1024k,?RS-10-4-1024k,?RS-LEGACY-6-3-1024k,?XOR-2-1-1024k?和REPLICATION。

REPLICATION是壹種特殊的策略,它只能被設置在目錄上,強制目錄采用3副本策略,而不是繼承它的祖先的糾刪碼策略,該策略使3副本目錄與糾刪碼目錄交叉成為可能。

REPLICATION?策略是壹直啟用的,而其它的內置策略在默認的情況下是禁用的。

類似於HDFS存儲策略,糾刪碼策略是設置在目錄上的,當壹個文件被創建,它繼承離它最近的祖先目錄的EC策略。

目錄級別的EC策略只影響在該目錄下創建的新文件,壹旦壹個文件已經被創建,它的糾刪碼策略可以被查詢,但是不能改變,如果壹個糾刪碼文件被重命名到壹個不同的EC策略的目錄中,該文件會保留它之前存在的EC策略,轉換壹個文件到不同的EC策略需要重寫它的數據,重寫數據是通過拷貝文件(比如:通過distcp)而不是重命名文件。

我們允許用戶通過XML文件的方式去定義它們自己的EC策略,該XML文件必須要有下面的3部分:

1) layoutversion:? 表示EC策略文件格式的版本。

2) schemas: 這個包括所有用戶定義的EC約束

3) policies:? 這個包括所有用戶定義的EC策略,每個策略由schema id和條帶單元的大小(cellsize)構成,

在hadoop conf目錄中有壹個名稱叫 user_ec_policies.xml.template的樣本EC策略的XML文件。

因特爾 ISA-L 代表因特爾智能存儲加速庫, ISA-L 是為存儲應用程序優化的底層函數開源的集合,它包括在 AVX 和 AVX2 指令集上快速的塊 ?Reed-Solomon 類型的糾刪碼優化,HDFS糾刪碼可以利用ISA-L去加速編解碼計算,ISA-L支持大多數開源的操作系統,包括linux和windows,ISA-L默認是不啟動的,有關如何啟動ISA-L,請看下面的說明。

糾刪碼在集群的CPU和網絡方面提出了額外的要求。

編碼和解碼工作會消耗HDFS客戶端和DataNodes上額外的CPU。

糾刪碼文件也分布在機架之間,用於機架容錯,這意味著當讀取和寫入條帶文件,大多數操作是在機架外的,因此,網絡對分帶寬非常重要的。

對於機架容錯來說,至少擁有與配置的EC條帶寬度相同的機架數量也是很重要的,對於EC策略RS (6,3),這意味著至少要有9個機架,理想的情況下要有10或者11個機架用於處理計劃內和計劃外的停機。對於機架數量少於條帶寬度的集群,HDFS不能維護機架容錯,但是仍然會分散條帶文件到多個節點為了節點級別的容錯。

默認情況下,所有內置的糾刪碼策略是被禁用的,但是定義在參數dfs.namenode.ec.system.default.policy中的除外,該策略在默認情況下是啟用的。集群管理員可以根據集群的大小和希望的容錯屬性使用命令hdfs ec [-enablePolicy -policy <policyName>]啟用壹組策略;例如,對於壹個擁有9個機架的集群,類似RS-10-4-1024k?這樣的策略不能達到機架級別的容錯,而策略RS-6-3-1024k?或者RS-3-2-1024k更適合。如果管理員只關心節點級別的容錯,在至少有14個DataNodes的集群中策略RS-10-4-1024k也是適合的。

系統默認的EC策略可以通過參數‘dfs.namenode.ec.system.default.policy’ 來配置,在這種配置下,當命令?‘-setPolicy’沒有指定策略名稱的參數時,默認的策略將會被使用。

默認情況下,參數?‘dfs.namenode.ec.system.default.policy’ 的值為“RS-6-3-1024k”,使用Reed-Solomon和XOR實現的編解碼器可以使用客戶端和DataNode節點指定如下的關鍵字配置:io.erasurecode.codec.rs.rawcoders用來指定默認的RS編解碼器,io.erasurecode.codec.rs-legacy.rawcoders用於指定legacy RS編解碼器,io.erasurecode.codec.xor.rawcoders用於指定XOR編解碼器;用戶也可以使用類似關鍵字io.erasurecode.codec.self-defined-codec.rawcoders來配置自定義的編解碼器。這些關鍵字的值是帶有回退機制的編碼器名稱的列表。這些編解碼器工廠以指定的配置的值有序的被加載,直到壹個編解碼器被成功的加載,默認的RS和XOR編解碼器配置更喜歡本地實現,而不是純java實現;RS-LEGACY沒有本地編解碼器實現,因此默認的只能是純java的實現;所有這些編解碼器都有純java的實現;對於默認的RS編解碼器,它也有壹個本地實現,利用英特爾?ISA-L庫提高編解碼器性能;對於XOR編解碼器,也支持利用英特爾?ISA-L庫提升編解碼的性能的本地實現;請參閱“Enable Intel ISA-L”獲取更詳細的信息。默認的RSLegacy的實現是純java的,默認的RS和XOR是使用了因特爾ISA-L庫本地實現的,在DataNodes上的糾刪碼後臺恢復工作也可以使用下面的參數被調優:

1) dfs.datanode.ec.reconstruction.stripedread.timeout.millis --條帶讀取超時時間,默認值 5000 ms

2) dfs.datanode.ec.reconstruction.stripedread.buffer.size --讀取服務的緩存大小,默認值 64K

3) dfs.datanode.ec.reconstruction.threads -- DataNode用於後臺重構工作的線程數量,默認值 8 個線程

4) dfs.datanode.ec.reconstruction.xmits.weight -- 與副本塊恢復 相比,EC後臺恢復任務使用的xmits 的相對權重,默認值0.5,設置它的值為0去禁用計算EC恢復任務的權重,也就是說,EC任務總是1 xmits。通過計算出讀數據流的數量和寫數據流的數量的最大值來計算出糾刪碼恢復任務的xmits。例如,如果壹個EC恢復任務需要從6個節點讀取數據,往2個節點寫入數據,它擁有的 xmits 是max(6, 2) * 0.5 = 3,復制文件的恢復任務總是計算為1xmit,NameNode利用dfs.namenode.replication.max-streams減去DataNode上總的xmitsInProgress(合並來自副本文件和EC文件的xmits)?,以便調度恢復任務到這個DataNode。

HDFS利用因特爾ISA-L庫去提高默認的RS本地實現的編解碼器的編解碼計算速度,開啟並使用英特爾ISA-L庫,需要3步:

1)構建ISA-L庫,請參閱官方的網站?“ /01org/isa-l/ ” 獲取詳情信息。

2)構建帶有ISA-L支持的Hadoop,請參閱源碼中BUILDING.txt文件中的?“Build instructions for Hadoop”中的“Intel ISA-L build options”部分。

3)使用-Dbundle.isal拷貝?isal.lib?目錄中的內容到最終的tar文件中。

使用該tar文件部署Hadoop,確保ISA-L是在HDFS客戶端和DataNodes端是可用的。為了驗證ISA-L能夠被Hadoop正確的檢測到,運行命令 ?hadoop checknative來驗證。

HDFS提供了EC的子命令用於執行糾刪碼相關的管理命令。

hdfs ec [generic options] [-setPolicy -path <path> [-policy <policyName>] [-replicate]] [-getPolicy -path <path>] [-unsetPolicy -path <path>] [-listPolicies] [-addPolicies -policyFile <file>] [-listCodecs] [-enablePolicy -policy <policyName>] [-disablePolicy -policy <policyName>] [-help [cmd ...]]

下面是關於每個命令的詳情:

[-setPolicy -path <path> [-policy <policyName>] [-replicate]]

在指定的目錄的路徑上設置糾刪碼策略。

path:HDFS中的目錄,這是壹個強制的參數,設置壹個策略只影響新創建的文件,不影響已經存在的文件。

policyName:在這個目錄下的文件上使用的糾刪碼策略,如果配置了參數‘dfs.namenode.ec.system.default.policy’,這個參數可以被省略,這時路徑的EC策略將會被設置成配置文件中的默認值。

-replicate:在目錄上應用指定的REPLICATION策略,強制目錄采用3副本復制方案。

-replicate?和-policy <policyName>是可選的參數,它們不能同時被指定。

[-getPolicy -path <path>]

獲取在指定路徑上目錄或者文件的糾刪碼策略的詳情。

[-unsetPolicy -path <path>]

取消之前使用setPolicy?在目錄上設置的糾刪碼策略。如果目錄是從祖先中繼承的糾刪碼策略,unsetPolicy?是壹個空操作,即在沒有明確設置策略的目錄上取消策略將不會返回錯誤。

[-listPolicies?]

列出所有在HDFS中註冊的糾刪碼策略,只有啟用的策略才能使用setPolicy?命令。

[-addPolicies -policyFile <file>]

添加壹個糾刪碼策略的列表,請參閱模板策略文件etc/hadoop/user_ec_policies.xml.template,最大的條帶單元大小被定義在屬性?‘dfs.namenode.ec.policies.max.cellsize’ 中,默認值是4MB,當前的HDFS中總***允許用戶添加64個策略,被添加的策略ID的範圍是64~127,如果已經有64個策略被添加,再添加策略將會失敗。

[-listCodecs]

獲取系統中支持的糾刪碼編解碼器和coder列表。壹個coder是壹個編解碼器的實現,壹個編解碼器可以有不同的實現,因此會有不同的coder,編解碼器的coders采用後備的順序被列出。

[-removePolicy -policy <policyName>]

移除壹個糾刪碼策略。

[-enablePolicy -policy <policyName>]

啟用壹個糾刪碼策略

[-disablePolicy -policy <policyName>]

禁用壹個糾刪碼策略。

由於大量的技術挑戰,在糾刪碼文件上不支持某些HDFS的寫操作,比如hflush,?hsync?和append操作。

在糾刪碼文件上使用append()將會拋出IOException。

在DFSStripedOutputStream?上執行hflush()?和hsync()是空操作,因此,在糾刪碼文件上調用hflush()?或者hsync()不能保證數據被持久化。

客戶端可以使用 StreamCapabilities ?提供的API去查詢壹個OutputStream?是否支持hflush()?和hsync(),如果客戶端渴望數據通過hflush()?和hsync()持久化,當前的補救措施是在非糾刪碼目錄中創建3副本文件,或則使用FSDataOutputStreamBuilder#replicate()提供的API在糾刪碼目錄中創建3副本文件。

  • 上一篇:日本曾在我國挖的大坑,我國花費20億填了10年,如今怎樣了?
  • 下一篇:VS是什麽意思
  • copyright 2024編程學習大全網