1. 程式人生 > 實用技巧 >Hadoop——HDFS異構儲存&HBase冷熱分離

Hadoop——HDFS異構儲存&HBase冷熱分離

前言

總體上HDFS異構儲存的價值在於,根據資料熱度採用不同策略從而提升叢集整體資源使用效率。

對於頻繁訪問的資料,將其全部或部分儲存在更高訪問效能的儲存介質(記憶體或SSD)上,提升其讀寫效能;

對於幾乎不會訪問的資料,儲存在歸檔儲存介質上,降低其儲存成本。

但是HDFS異構儲存的配置需要使用者對目錄指定相應的策略,即使用者需要預先知道每個目錄下的檔案的訪問熱度(事先劃分好冷熱資料儲存目錄,設定好對應的Storage Policy,

然後後續相應的程式在對應分類目錄下寫資料,自動繼承父目錄的儲存策略),在實際大資料平臺的應用中,這是比較困難的一點。

一、異構儲存是什麼

所謂的異構儲存就是將不同需求或者冷熱的資料儲存到不同的介質中去,實現既能兼顧效能又能兼顧成本。對於儲存到HDFS的資料大致可以分下圖的4個等級。

從上圖可以看出,大部分的資料都是冷資料或者極冷資料,對於這部分資料,讀請求很少,寫請求也非常少,對訪問延遲不敏感。

如果將這部分資料儲存通過高壓縮比,並且儲存到普通的SATA大容量盤中去,能極大地節約成本。

對於熱資料和實時資料,寫請求比較高,讀請求也很高,但是資料量很小。這個時候為了實現高併發低延遲,我們可以將這部分資料儲存到SSD中。

Hadoop從2.6.0版本開始支援異構儲存,HBase也從1.1.0開始支援將WAL的異構儲存策略。

備註:這裡面的難點是要對業務訪問模式有足夠的瞭解,提前確認好各個目錄下的資料訪問熱度,以便規劃好資料的儲存策略。

二、HDFS異構儲存型別和策略

儲存型別

HDFS異構儲存支援如下4種類型,分別是:

  1. RAM_DISK
  2. SSD
  3. DISK
  4. ARCHIVE
這裡前面3種都很好理解,單獨解釋一下ARCHIVE,這裡ARCHIVE並不是指某種儲存介質,而是一種高密度的儲存方式,用於儲存極冷資料。 一般用得比較多的SSD和DISK兩類。如果配置的時候沒有指定儲存型別的話,預設就是DISK儲存。比如如下配置:
/data1/hbase/hdfs,/data2/hbase/hdfs,/data3/hbase/hdfs,/data4/hbase/hdfs,/data5/hbase/hdfs,/data6/hbase/hdfs,
/data7/hbase/hdfs,/data8/hbase/hdfs,/data9/hbase/hdfs,/data10/hbase/hdfs,/data11/hbase/hdfs,/data12/hbase/hdfs,
[SSD]/wal_data

這裡前面12個盤都沒有指定儲存型別,則預設是DISK儲存,而第13快盤指定了SSD儲存型別。

這4種儲存型別,按照RAM_DISK->SSD->DISK->ARCHIVE,速度由快到慢,單位儲存成本由高到低。

儲存策略

HDFS儲存策略設定如下表:

由上圖,我們可以看出HDFS總共支援Lazy_Persist、All_SSD、One_SSD、Hot、Warm和Cold等6種儲存策略,預設策略為Hot。

上圖中的第三列是表示儲存策略對應的儲存型別,具體如下:

  • Lazy_Persist : 1份資料儲存在[RAM_DISK]即記憶體中,其他副本儲存在DISK中
  • All_SSD:全部資料都儲存在SSD中
  • One_SSD:一份資料儲存在SSD中,其他副本儲存在DISK中
  • Hot:全部資料儲存在DISK中
  • Warm:一份資料儲存在DISK中,其他資料儲存方式為ARCHIVE
  • Cold:全部資料以ARCHIVE的方式儲存

上圖中的第4、5列表示建立和寫副本的時候,如果該儲存策略對應的資源不足,比如磁碟不可用或者空間寫滿,則建立檔案和同步副本的時候選擇第4和第5列對應的儲存型別,你可以理解為降級機制。

三、HDFS異構儲存原理

對於HDFS異構儲存的原理大致概括如下圖所示:

這裡的原理簡單概括如下:

1、在hdfs的配置檔案hdfs-site.xml中配置對應的異構儲存(後面配置部分有詳細介紹)

2、DataNode啟動的時候從配置檔案中讀取對應的儲存型別,以及容量情況,並通過心跳的形式不斷的上報給NameNode。

3、NameNode收到DataNode傳送的關於儲存型別、容量等內容的心跳包後,會進行處理,更新儲存的相關內容。

4、寫請求發到NameNode後,NameNode根據寫請求具體的目錄對應的儲存策略選擇對應的儲存型別的DataNode進行寫入操作。

備註:上面是根據自己的理解簡單概括的大致呼叫過程,如果需要了解更詳細的呼叫關係,可以閱讀這篇文章,寫得很詳細:https://blog.csdn.net/androidlushangderen/article/details/51105876

四、HDFS異構儲存的配置和策略設定

HDFS異構存的配置

每個磁碟單獨掛載到不同目錄,需要注意加上noatime選項。 首先配置 DataNode 的資料目錄,只需要將對應的型別新增到dfs.datanode.data.dir的配置項中即可,

備註:也需要配置dfs.storage.policy.enabled為true,因為預設就是true,所以這裡忽略。

配置的時候需要申明儲存型別和對應的目錄,儲存型別需要用中括號括起來,儲存型別有[SSD]/[DISK]/[ARCHIVE]/[RAM_DISK],如果不指定儲存型別,則預設就是DISK。

比如我的機器中只配置了DISK和SSD的型別,範例如下:

通過上面的例子,前面12個盤,我沒有設定儲存型別,因為都是DISK,最後一個盤使用了SSD型別。

HDFS異構儲存策略設定

HDFS提供了專門的命令來設定對應的策略,命令使用方法如下:

檢視策略幫助資訊:

hdfs storagepolicies -help

列出當前版本支援的儲存策略:

hdfs storagepolicies -listPolicies

設定對應路徑的策略:

hdfs storagepolicies -setStoragePolicy -path -policy

範例:

# 設定/hbase/data/default為Hot的策略
hdfs storagepolicies -setStoragePolicy -path /hbase/data/default -policy Hot

# 取消策略
hdfs storagepolicies -unsetStoragePolicy -path

# 獲取對應路徑的策略
hdfs storagepolicies -getStoragePolicy -path

五、HDFS異構儲存的管理

對於HDFS異構儲存的管理,主要包含如下兩個方面:

1、統計線上資料的訪問頻率,確認冷熱資料所在目錄,灰度進行調整

2、使用hdfs storagepolicies相關命令進行策略的調整

3、修改儲存策略以後,使用mover工具進行資料的遷移,mover的使用方法如下:

hdfs mover [-p files/dirs | -f localfile ]

可以使用-p指定要遷移的目錄,也可以將要遷移的檔案列表寫入檔案中,用-f引數指定對應的檔案或者目錄進行遷移。

六、Move遷移資料

Mover 是 HDFS 的一個數據遷移工具,類似 Balancer. 區別在於,Mover 的目的是把資料塊按照儲存策略遷移,Balancer 是在不同 DataNode 直接進行平衡。

如果 DataNode 掛載了多種儲存型別,Mover 優先嚐試在本地遷移,避免網路 IO.

使用方式:hdfs mover -p <path>,如果想一次性遷移所有資料,可把 path 指定為根路徑,不過需要的時間也更長。

七、HDFS 社群版存在問題:

  • 對存量資料處理的支援不好。設定資料的 Storage Policies 屬性後,只對新寫入的資料有效。對於存量資料,系統並不能將其自動移動到對應的儲存介質上。
  HDFS 提供了一個外接工具 mover,可以把資料移動到正確的位置,但 mover 也不能確保呼叫後會把所有的資料都移動過去。
  • 沒有提供冷資料分析方案。

  • 沒有提供把遠端儲存裝置(譬如 S3)mount 到 DataNode 上作為儲存型別的方案。

八、HBase利用HDFS異構儲存特性

HBase 資源隔離 + 異構儲存。SATA 磁碟的隨機 iops 能力,單次訪問的 RT,讀寫吞吐上都遠遠不如 SSD,那麼對 RT 極其敏感業務來說,SATA 盤並不能勝任,所以我們需要 HBase 有支援 SSD 儲存介質的能力。

為了 HBase 可以支援異構儲存,首先在 HDFS 層面就需要做響應的支援,在 HDFS 2.6.x 以及之後的版本,提供了對 SSD 上儲存檔案的能力,

換句話說在一個 HDFS 叢集上可以有 SSD 和 SATA 磁碟並存,對應到 HDFS 儲存格式為 [ssd] 與 [disk]。

儲存架構

新增 SSD 磁碟之後,HDFS 叢集儲存架構示意圖:

使用場景

  • 將WAL日誌儲存到SSD中,其他的資料則儲存在普通的SATA盤中

HBase實現異構wal儲存很簡單,底層依賴的就是hdfs的異構storage策略,不過是將wal檔案所在的目錄經反射呼叫dfs client的setStoragePolicy方法設定為使用者指定的policy。

具體的配置策略如下:在 hdfs-site.xml 中修改:

<property>      
    <name>hbase.wal.storage.policy</name>      
    <value>ONE_SSD</value> 
</property>

該配置的預設值是NONE,也就是wal檔案和資料都儲存在DISK上,不做區分。

可以修改為ONE_SSD或者ALL_SDD,不同在於:

  1. ONE_SSD:wal的一個副本置於SSD上,而其他副本仍然在預設儲存;
  2. ALL_SSD:wal檔案的所有副本都儲存於SSD盤上;
  • 將表的指定列族資料儲存在SSD盤中

在HBASE-14061之後,我們支援通過hbase.hstore.block.storage.policy“配置,我們支援CF級別設定來覆蓋配置檔案中的設定。

例如,要建立具有兩個系列的表:具有“ ALL_SSD”儲存策略的“ cf1”和具有“ ONE_SSD”的“ cf2”,我們可以在hbase shell中使用以下命令:

create 'table',{NAME=>'f1',STORAGE_POLICY=>'ALL_SSD'},{NAME=>'f2',STORAGE_POLICY=>'ONE_SSD'}

我們還可以像其他所有配置一樣在table屬性中設定配置:

create 'table',{NAME=>'f1',CONFIGURATION=>{'hbase.hstore.block.storage.policy'=>'ONE_SSD'}}

引用: