Hadoop3.2.0 HDFS擦除編碼

目的

複製很昂貴 - HDFS中的默認3x複製方案在存儲空間和其他資源(例如,網絡帶寬)中具有200%的開銷。但是,對於I / O活動相對較低的暖和冷數據集,在正常操作期間很少訪問其他塊副本,但仍會消耗與第一個副本相同的資源量。

因此,自然的改進是使用擦除編碼(EC)代替複製,其提供相同級別的容錯並且具有更少的存儲空間。在典型的擦除編碼(EC)設置中,存儲開銷不超過50%。EC文件的複製因子沒有意義。它始終爲1,無法通過-setrep命令進行更改。

 

背景

在存儲系統中,EC最值得注意的用途是廉價磁盤冗餘陣列(RAID)。RAID通過條帶化實現E​​C,條帶化將邏輯順序數據(例如文件)劃分爲更小的單元(例如位,字節或塊),並將連續單元存儲在不同的磁盤上。在本指南的其餘部分中,這個條帶分佈單元稱爲條帶化單元(或單元)。對於每個原始數據單元條帶,計算並存儲一定數量的奇偶校驗單元 - 其過程稱爲編碼。可以通過基於倖存數據和奇偶校驗單元的解碼計算來恢復任何條帶化單元上的錯誤。

將EC與HDFS集成可以提高存儲效率,同時仍然提供與傳統的基於複製的HDFS部署類似的數據持久性。例如,具有6個塊的3x複製文件將消耗6 * 3 = 18個磁盤空間塊。但是使用EC(6數據,3奇偶校驗)部署,它將只消耗9塊磁盤空間。

 

架構

在EC的背景下,條帶化具有幾個關鍵優勢。首先,它啓用在線EC(以EC格式立即寫入數據),避免轉換階段並立即節省存儲空間。在線EC還通過並行利用多個磁盤軸來增強順序I / O性能; 這在具有高端網絡的集羣中尤其可取。其次,它自然地將一個小文件分發到多個DataNode,並且無需將多個文件捆綁到一個編碼組中。這極大地簡化了文件操作,例如刪除,配額報告和聯合命名空間之間的遷移。

在典型的HDFS羣集中,小文件佔總存儲消耗的3/4以上。爲了更好地支持小文件,在第一階段的工作中,HDFS支持使用條帶化的EC。在未來,HDFS還將支持連續的EC佈局。有關詳細信息,請參閱設計文檔和有關HDFS-7285的討論。

  • NameNode Extensions - 條帶化HDFS文件在邏輯上由塊組組成,每個塊組包含一定數量的內部塊。爲了減少這些附加塊的NameNode內存消耗,引入了新的分層塊命名協議。可以從任何內部塊的ID推斷出塊組的ID。這允許在塊組級別而不是塊級別進行管理。
  • 客戶端擴展 - 增強了客戶端讀取和寫入路徑,以並行處理塊組中的多個內部塊。在輸出/寫入路徑上,DFSStripedOutputStream管理一組數據流,每個DataNode用於存儲當前塊組中的內部塊。飄帶大多是異步工作的。協調器負責整個塊組的操作,包括結束當前塊組,分配新塊組等。在輸入/讀取路徑上,DFSStripedInputStream將請求的邏輯字節數據範圍轉換爲存儲在DataNode上的內部塊。然後它並行發出讀取請求。發生故障時,它會發出額外的解碼讀取請求。
  • DataNode Extensions - DataNode運行額外的ErasureCodingWorker(ECWorker)任務,用於故障擦除編碼塊的後臺恢復。NameNode檢測到失敗的EC塊,然後選擇DataNode進行恢復工作。恢復任務作爲心跳響應傳遞。此過程類似於在失敗時重新複製複製塊的方式。重建執行三個關鍵任務:
    1. 從源節點讀取數據:使用專用線程池從源節點並行讀取輸入數據。根據EC策略,它會將讀取請求計劃到所有源目標,並僅讀取用於重建的最小數量的輸入塊。
    2. 解碼數據並生成輸出數據:從輸入數據中解碼新數據和奇偶校驗塊。所有丟失的數據和奇偶校驗塊一起解碼。
    3. 將生成的數據塊傳輸到目標節點:解碼完成後,將恢復的塊傳輸到目標DataNode。
  • 擦除編碼策略爲了適應異構工作負載,我們允許HDFS集羣中的文件和目錄具有不同的複製和擦除編碼策略。擦除編碼策略封裝瞭如何編碼/解碼文件。每個策略由以下信息定義:
    1. EC模式:這包括EC組中的數據和奇偶校驗塊的數量(例如,6 + 3),以及編解碼器算法(例如,Reed-Solomon,XOR)。
    2. 條帶化單元的大小。這決定了條帶化讀寫的粒度,包括緩衝區大小和編碼工作。

策略命名爲編解碼器 - num數據塊 - num奇偶校驗塊 - 單元大小。目前,支持五種內置策略:RS-3-2-1024k,RS-6-3-1024k,RS-10-4-1024k,RS-LEGACY-6-3-1024k,XOR-2-1- 1024k。

還支持默認的REPLICATION方案。它只能在目錄上設置,強制目錄採用3x複製方案,而不是繼承其祖先的擦除編碼策略。此策略可以將3x複製方案目錄與擦除編碼目錄交錯。

始終啓用REPLICATION。在所有EC策略中,默認情況下啓用RS(6,3)。

與HDFS存儲策略類似,在目錄上設置擦除編碼策略。創建文件時,它會繼承其最近的祖先目錄的EC策略。

目錄級EC策略僅影響在目錄中創建的新文件。創建文件後,可以查詢其擦除編碼策略,但不能更改。如果將擦除編碼文件重命名爲具有不同EC策略的目錄,則該文件將保留其現有EC策略。將文件轉換爲不同的EC策略需要重寫其數據; 通過複製文件(例如通過distcp)而不是重命名來完成此操作。

我們允許用戶通過XML文件定義自己的EC策略,該文件必須具有以下三個部分:

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

名爲user_ec_policies.xml.template的示例EC策略XML文件位於Hadoop conf目錄中,用戶可以引用該目錄。

  • 英特爾ISA-L英特爾ISA-L代表英特爾智能存儲加速庫。ISA-L是爲存儲應用程序設計的優化低級功能的開源集合。它包括針對Intel AVX和AVX2指令集優化的快速塊Reed-Solomon類型擦除代碼。HDFS擦除編碼可以利用ISA-L來加速編碼和解碼計算。ISA-L支持大多數主要操作系統,包括Linux和Windows。默認情況下不啓用ISA-L。有關如何啓用ISA-L,請參閱以下說明。

部署

羣集和硬件配置

擦除編碼在CPU和網絡方面對集羣提出了額外的要求。

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

擦除編碼要求羣集中的數據節點數與配置的EC條帶寬度相同。對於EC策略RS(6,3),這意味着至少9個DataNode。

擦除編碼文件也分佈在機架上,用於機架容錯。這意味着在讀取和寫入條帶文件時,大多數操作都是在機架外。因此,網絡二分帶寬非常重要。

對於機架容錯,擁有足夠數量的機架也很重要,因此平均而言,每個機架保持的塊數不超過EC奇偶校驗塊的數量。計算它的公式將是(數據塊+奇偶校驗塊)/奇偶校驗塊,向上舍入。對於EC政策RS(6,3),這意味着最少3個機架(由(6 + 3)/ 3 = 3計算),理想情況下9個或更多來處理計劃內和計劃外中斷。對於機架數量少於奇偶校驗單元數量的羣集,HDFS無法保持機架容錯,但仍會嘗試跨多個節點分佈條帶文件以保留節點級別的容錯。因此,建議設置具有相似數量的DataNode的機架。

 

配置鍵

默認情況下,禁用所有內置擦除編碼策略,但默認情況下啓用的dfs.namenode.ec.system.default.policy中定義的策略除外。集羣管理員可以根據集羣的大小和所需的容錯屬性,通過hdfs ec [-enablePolicy -policy ]命令啓用一組策略。例如,對於具有9個機架的羣集,RS-10-4-1024k等策略不會保留機架級容錯,而RS-6-3-1024k或RS-3-2-1024k可能更合適。如果管理員只關心節點級容錯,只要集羣中至少有14個DataNode ,RS-10-4-1024k仍然是合適的。

可以通過'dfs.namenode.ec.system.default.policy'配置配置系統默認EC策略。使用此配置時,如果未在'-setPolicy'命令中將策略名稱作爲參數傳遞,則將使用默認EC策略。

默認情況下,'dfs.namenode.ec.system.default.policy'爲“RS-6-3-1024k”。

該編解碼器實現的用於裏德-索羅門和XOR可與以下客戶端和數據管理部的配置的鍵被構造成:io.erasurecode.codec.rs.rawcoders默認RS編解碼器,io.erasurecode.codec.rs-legacy.rawcoders用於遺留用於XOR編解碼器的RS編解碼器,io.erasurecode.codec.xor.rawcoders。用戶還可以使用配置鍵配置自定義編解碼器,如:io.erasurecode.codec.self-defined-codec.rawcoders。這些鍵的值是具有回退機制的編碼器名稱列表。這些編解碼器工廠按配置值指定的順序加載,直到成功加載編解碼器。默認的RS和XOR編解碼器配置優先於純Java的本機實現。沒有RS-LEGACY本機編解碼器實現,因此默認值僅爲純Java實現。所有這些編解碼器都採用純Java實現。對於默認的RS編解碼器,還有一個本機實現,它利用Intel ISA-L庫來提高編解碼器的性能。對於XOR編解碼器,還支持利用Intel ISA-L庫來提高編解碼器性能的本機實現。有關更多詳細信息,請參閱“啓用Intel ISA-L”部分。RS Legacy的默認實現是純Java,

還可以通過以下配置參數調整DataNode上的擦除編碼後臺恢復工作:

  1. dfs.datanode.ec.reconstruction.stripedread.timeout.millis - 條帶讀取的超時。默認值爲5000毫秒。
  2. dfs.datanode.ec.reconstruction.stripedread.buffer.size - 閱讀器服務的緩衝區大小。默認值爲64KB。
  3. dfs.datanode.ec.reconstruction.threads - Datanode用於後臺重建工作的線程數。默認值爲8個線程。
  4. dfs.datanode.ec.reconstruction.xmits.weight - EC後臺恢復任務使用的xmits相對於複製塊恢復的相對權重。默認值爲0.5。它設置爲0以禁用EC恢復任務的計算權重,即EC任務始終具有1個 xmits。擦除編碼恢復任務的xmit被計算爲讀取流的數量和寫入流的數量之間的最大值。例如,如果EC恢復任務需要從6個節點讀取並寫入2個節點,則它具有max( 6,2 )* 0.5 = 3的x。複製文件的恢復任務始終計爲1 xmit。NameNode使用dfs.namenode.replication.max-streams減去總xmitsInProgress 在DataNode上,它結合了來自複製文件和EC文件的xmits,以便將恢復任務安排到此DataNode。

啓用Intel ISA-L

默認RS編解碼器的HDFS本機實現利用Intel ISA-L庫來改進編碼和解碼計算。要啓用和使用Intel ISA-L,有三個步驟。

  1. 構建ISA-L庫。有關詳細信息,請參閱官方網站“ https://github.com/01org/isa-l/ ”。
  2. 使用ISA-L支持構建Hadoop。請參閱源代碼中(BUILDING.txt)的“構建Hadoop指令”中的“Intel ISA-L構建選項”部分。
  3. 使用-Dbundle.isal將isal.lib目錄的內容複製到最終的tar文件中。使用tar文件部署Hadoop。確保在HDFS客戶端和DataNode上可以使用ISA-L。

要驗證Hadoop是否正確檢測到ISA-L,請運行hadoop checknative命令。

 

管理命令

HDFS提供ec子命令來執行與擦除編碼相關的管理命令。

hdfs ec [generic options] [-setPolicy -path

以下是每個命令的詳細信息。

  • [-setPolicy -path

在指定路徑的目錄上設置擦除編碼策略。

path:HDFS中的目錄。這是一個必需參數。設置策略僅影響新創建的文件,不會影響現有文件。

policyName:用於此目錄下的文件的擦除編碼策略。如果設置了'dfs.namenode.ec.system.default.policy'配置,則可以省略此參數。路徑的EC策略將使用配置中的默認值進行設置。

-replicate在目錄上應用默認的REPLICATION方案,強制目錄採用3x複製方案。

-replicate和-policy 是可選參數。它們不能同時指定。

  • [-getPolicy -path

獲取指定路徑上文件或目錄的擦除編碼策略的詳細信息。

  • [-unsetPolicy -path

取消先前對目錄上的setPolicy調用設置的擦除編碼策略。如果目錄從祖先目錄繼承了擦除編碼策略,則unsetPolicy是no-op。在沒有顯式策略集的目錄上取消設置策略不會返回錯誤。

  • [-listPolicies]

列出在HDFS中註冊的所有(啓用,禁用和刪除)擦除編碼策略。只有啓用的策略適合與setPolicy命令一起使用。

  • [-addPolicies -policyFile ]

添加用戶定義的擦除編碼策略列表。請參閱etc / hadoop / user_ec_policies.xml.template以獲取示例策略文件。最大單元格大小在屬性“dfs.namenode.ec.policies.max.cellsize”中定義,默認值爲4MB。目前,HDFS允許用戶共添加64個策略,添加的策略ID範圍爲64到127.如果已添加64個策略,則添加策略將失敗。

  • [-listCodecs]

獲取系統中支持的擦除編碼編解碼器和編碼器列表。編碼器是編解碼器的實現。編解碼器可以具有不同的實現,因此具有不同的編碼器。編解碼器的編碼器以後備順序列出。

  • [-removePolicy -policy ]

刪除用戶定義的擦除編碼策略。

  • [-enablePolicy -policy ]

啓用擦除編碼策略。

  • [-disablePolicy -policy ]

禁用擦除編碼策略。

 

限制

由於嚴重的技術挑戰,擦除編碼文件不支持某些HDFS操作,即hflush,hsync,concat,setReplication,truncate和append。

  • 擦除編碼文件上的append()和truncate()將拋出IOException。
  • 如果文件與不同的擦除編碼策略或複製文件混合,concat()將拋出IOException。
  • setReplication()在擦除編碼文件上是無操作的。
  • hflush()和HSYNC()上DFSStripedOutputStream是無操作。因此,在擦除編碼文件上調用hflush()或hsync()不能保證數據是持久的。

客戶端可以使用StreamCapabilities API來查詢OutputStream是否支持hflush()和hsync()。如果客戶端希望通過hflush()和hsync()獲得數據持久性,那麼當前的補救措施是在非擦除編碼目錄中創建常規3x複製文件等文件,或使用FSDataOutputStreamBuilder#replicate() API創建3x複製文件一個擦除編碼的目錄。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章