天天看點

大資料開發:一文帶你理清Hadoop糾删碼

作者:尚矽谷教育

随着大資料技術的發展,HDFS作為Hadoop的核心子產品之一得到了廣泛的應用。為了系統的可靠性,HDFS通過複制來實作這種機制。但在HDFS中每一份資料都有兩個副本,這也使得存儲使用率僅為1/3,每TB資料都需要占用3TB的存儲空間。是以,在保證可靠性的前提下如何提高存儲使用率已成為目前HDFS面對的主要問題之一。Hadoop 3.0 引入了糾删碼技術(Erasure Coding),它可以提高50%以上的存儲使用率,并且保證資料的可靠性。

一、什麼是EC

起源

糾删碼 (Erasure Code)

糾删碼技術起源于通信傳輸領域,後被逐漸運用到存儲系統中。它對資料進行分塊,然後計算出一些備援的校驗塊。當一部分資料塊丢失時,可以通過剩餘的資料塊和校驗塊計算出丢失的資料塊。

Facebook 的開源項目HDFS-RAID在HDFS之上使用了糾删碼技術。HDFS-RAID對屬于同一檔案的塊分組并依次生成校驗塊,将這些校驗塊構成獨立的檔案,并與原始的資料檔案一一對應。RaidNode作為一個新的角色被引入進來,它負責從DataNode中讀取檔案的資料塊,計算出校驗塊, 并寫入校驗檔案中;同時,它還周期性地檢查被編碼了的檔案是否存在塊丢失,如有丢失則重新進行計算以恢複丢失的塊。

HDFS-RAID的優點是其建構于HDFS之上,不需要修改HDFS本已經複雜的内部邏輯,但缺點也顯而易見:校驗檔案對使用者是可見的,存在被誤删除的可能;依賴于MySQL和MapReduce來存儲中繼資料和生成校驗檔案;RaidNode需要周期性地查找丢失的塊,加重了NameNode的負擔;使用的編解碼器性能較差,在實際應用中往往不能滿足要求。另外,由于缺乏維護,HDFS已将HDFS-RAID的代碼從contrib包中移除,這給使用HDFS-RAID帶來不少困難。

發展

2014下半年,英特爾和Cloudera共同提出了将糾删碼融入到HDFS内部的想法和設計(HDFS EC),随後吸引了包括Hortonworks、華為、Yahoo!等衆多公司的參與,使之成為Hadoop開源社群較為活躍的一個項目。将糾删碼融入到HDFS内部帶來了諸多好處:它不再需要任何的外部依賴,使用者使用起來更為友善;其代碼成為HDFS的一部分,便于維護;可以充分利用HDFS的内部機制使性能得到最大程度的優化。糾删碼的編解碼性能對其在HDFS中的應用起着至關重要的作用,如果不利用硬體方面的優化就很難得到理想的性能。英特爾的智能存儲加速庫(ISA-L)提供了對糾删碼編解碼的優化,極大的提升了其性能。

二、EC原理

原理介紹

1. 在存儲系統中,糾删碼技術主要是通過利用糾删碼算法将原始的資料進行編碼得到校驗,并将資料和校驗一并存儲起來,以達到容錯的目的。其基本思想是将k塊原始的資料元素通過一定的編碼計算,得到m塊校驗元素。對于這k+m塊元素,當其中任意的m塊元素出錯(包括資料和校驗出錯),均可以通過對應的重構算法恢複出原來的k塊資料。生成校驗的過程被成為編碼(encoding),恢複丢失資料塊的過程被稱為解碼(decoding)。

Reed-Solomon Codes縮寫為RS碼,使用複雜的線性代數運算來生成多個奇偶校驗塊,是以可以容忍多個資料塊故障。RS碼在使用的時候需指定2個參數RS(n, m),n代表的是資料塊的數量,m代表的是校驗塊的數量,校驗塊由資料塊編碼産生。

2. RS編碼的編碼與解碼原理如圖1所示。編碼時,利用生成矩陣B與資料列向量D的乘積得到資訊列向量D+C;重構時,利用現存的資訊列向量Survivors與對應的逆矩陣B'-1 乘積得到原資料列向量D,進而達到恢複原資料的目的。

大資料開發:一文帶你理清Hadoop糾删碼

圖1 RS編碼的編碼與重構原理

舉例

舉個例子:

比如:我們有 7、8、9 三個原始資料,通過矩陣乘法,計算出來兩個校驗資料 50、122。這時原始資料加上校驗資料,一共五個資料:7、8、9、50、122,可以任意丢兩個,然後通過算法進行恢複。

大資料開發:一文帶你理清Hadoop糾删碼

我們再舉個簡單的例子:

大資料開發:一文帶你理清Hadoop糾删碼
大資料開發:一文帶你理清Hadoop糾删碼
大資料開發:一文帶你理清Hadoop糾删碼

三、HDFS EC方案

連續布局

對HDFS的一個普通檔案來說,構成它的基本機關是塊。對于EC模式下的檔案,構成它的基本機關為塊組。塊組由一定數目的資料塊加上生成的校驗塊放一起構成。以RS(6,3)為例,每一個塊組包含1-6個資料塊,以及3個校驗塊。進行EC編碼的前提是每個塊的長度一緻。如果不一緻,則應填充0。

資料被依次寫入一個塊中,一個塊寫滿之後再寫入下一個塊,資料的這種分布方式被稱為連續布局。在一些分布式檔案系統如QFS和Ceph中,廣泛使用另外一種布局:條形布局。條(stripe)是由若幹個相同大小單元(cell)構成的序列。在條形布局下,資料被依次寫入條的各個單元中,當條被寫滿之後就寫入下一個條,一個條的不同單元位于不同的資料塊中。

大資料開發:一文帶你理清Hadoop糾删碼

檔案資料被依次寫入塊中,一個塊寫滿之後再寫入下一個塊,這種分布方式稱為連續布局。

優點:

  • 容易實作
  • 友善和多副本存儲政策進行轉換

缺點:

  • 需要用戶端緩存足夠的資料塊
  • 不适合存儲小檔案

條形布局

條(stripe)是由若幹個相同大小的單元(cell)構成的序列。檔案資料被依次寫入條的各個單元中,當一個條寫滿之後再寫入下一個條,一個條的不同單元位于不同的資料塊中。這種分布方式稱為條形布局。

優點:

  • 用戶端緩存資料較少
  • 無論檔案大小都适用

缺點:

  • 會影響一些位置敏感任務的性能,因為原先在一個節點上的塊被分散到了多個不同的節點上。
  • 和多副本存儲政策轉換比較麻煩。
大資料開發:一文帶你理清Hadoop糾删碼

布局方案選擇

對HDFS EC來說,首要的問題是選擇什麼樣的布局方式。連續布局實作起來較為容易,但它隻适合較大的檔案。另外,如果讓client端直接寫一個連續布局檔案需要緩存下足夠的資料塊,然後生成校驗塊并寫入,以RS(6,3),blockSize=128M為例,client端需要緩存1.12G的資料,這點決定了連續布局的檔案更适合由普通檔案轉化而來,而條形布局就不存在上述缺點。由于一個條的單元往往較小(通常為64K或1M),是以無論檔案大小,條形布局都可以為檔案節省出空間。client端在寫完一個條的資料單元後就可以計算出校驗單元并寫出,是以client端需要緩存的資料很少。條形布局的一個缺點是會影響一些位置敏感任務的性能,因為原先在一個節點上的一個塊被分散到了多個不同的節點上。

HDFS最初就是為較大檔案設計的分布式檔案系統,但随着越來越多的應用将資料存儲于HDFS上,HDFS的小(即小于1個塊組)檔案數目越來越多,而且它們所占空間的比率也越來越高。以Cloudera一些較大客戶的叢集為例,小檔案占整個空間的比例在36-97%之間。

基于以上分析,HDFS EC優先考慮對條形布局的支援。設計與實作也主要圍繞已經實作了的條形布局展開。

四、EC的優勢與劣勢

優勢

糾删碼技術作為一門資料保護技術,自然有許多的優勢,首先可以解決的就是目前分布式系統,雲計算中采用副本來防止資料的丢失。副本機制确實可以解決資料丢失的問題,但是翻倍的資料存儲空間也必然要被消耗,這一點卻是非常緻命的。EC技術的運用就可以直接解決這個問題。

劣勢

EC技術的優勢确實明顯,但是他的使用也是需要一些代價的,一旦資料需要恢複,他會造成2大資源的消耗:

1、網絡帶寬的消耗,因為資料恢複需要去讀其他的資料塊和校驗塊。

2、進行編碼,解碼計算需要消耗CPU資源。

就是既耗網絡又耗CPU。

總結

糾删碼技術作為一門資料保護技術,自然有許多的優勢。将糾删碼技術融入到HDFS中,可以保證在同等(或者更高)可靠性的前提下,将存儲使用率提高了一倍。同樣的叢集使用者可以存儲兩倍的資料,這将大大減少使用者硬體方面的開銷。

對于EC,最好的選擇是用于冷資料叢集,有下面2點原因:

1. 冷資料叢集往往有大量的長期沒有被通路的資料,體量确實很大,采用EC技術,可以大大減少副本數。

2.冷資料叢集基本穩定,耗資源量少,是以一旦進行資料恢複,将不會對叢集造成大的影響。

出于上述2種原因,冷資料叢集是一個很好的選擇。

繼續閱讀