HDFS異構儲存的解析與測試
HDFS異構儲存的解析與測試
https://cloud.tencent.com/developer/article/1005577
看到這篇帖子,就做了一些測試,希望有幫助。
第1章 概述
1.1 引言
HDFS作為一個分散式檔案儲存系統,用於儲存檔案,通過目錄樹來定位檔案,由很多伺服器聯合起來實現其儲存的功能,那麼當伺服器儲存介質不同,就可以造成HDFS的讀寫效能的不同,儲存效能也會造成差異,總結來說就是HDFS的異構儲存。
1.2 異構儲存的背景
Hadoop從2.4版本後開始支援異構儲存,異構儲存是為了解決爆炸式的儲存容量增長以及計算能力增長所帶來的資料儲存需求。如果假定一份資料最開始被認定是一份熱資料,在經歷計算從而產生出新資料,那麼這份原始的熱資料很有可能轉變為冷資料。隨著資料不斷增長差異化儲存變得非常迫切,需要經常被計算或者讀取的熱資料為了保證效能需要儲存在告訴儲存裝置上,當一些資料變為冷資料後不經常會用到的資料會變為歸檔資料,可以使用大容量效能要差一些的儲存裝置來儲存來減少儲存成本,HDFS可以按照一定的規則來儲存這些資料。
1.3 異構儲存的定義
歸檔儲存是一種將不斷增長的儲存容量與計算容量分離開來的解決方案。密度更高、儲存成本更低、計算能力更低的節點正在成為可用的,可以在叢集中用作冷儲存。根據策略,可以將熱資料移到冷資料。增加節點到冷儲存中可以增加不依賴於叢集計算容量的儲存容量。
異構儲存和歸檔儲存提供的框架對HDFS體系結構進行了概括,使其包含了SSD、記憶體等其他型別的儲存介質。使用者可以選擇將資料儲存在SSD或記憶體中以獲得更好的效能。
1.4 發展
第一階段的異構,將datanode的儲存模型從一個可能對應多個物理儲存介質的單個儲存,轉變為一個儲存集合,每個儲存對應一個物理儲存介質。它還添加了儲存型別、磁碟和SSD的概念,其中磁碟是預設的儲存型別。
之後,為了支援歸檔儲存,增加了一種新的儲存型別ARCHIVE,它具有很高的儲存密度(PB級儲存),但計算能力很小,一般用於歸檔儲存應用率很低的資料;還添加了另一種新的儲存型別RAM_DISK,以支援在記憶體中寫入單個複製檔案。
第2章 儲存型別和儲存策略
2.1 關於儲存型別
RAM_DISK:(記憶體映象檔案系統)
SSD:(SSD固態硬碟)
DISK:(普通磁碟,在HDFS中,如果沒有主動宣告資料目錄儲存型別預設都是DISK)
ARCHIVE:(沒有特指哪種儲存介質,主要的指的是計算能力比較弱而儲存密度比較高的儲存介質,用來解決資料量的容量擴增的問題,一般用於歸檔)
2.2 關於儲存策略
策略ID | 策略名稱 | 塊分佈 | creationFallbacks | replicationFallbacks |
15 | LAZY_PERSIST | RAM_DISK:1,DISK:n-1 | DISK | DISK |
12 | ALL_SSD | SSD:n | DISK | DISK |
10 | ONE_SSD | SSD:1,DISK:n-1 | SSD,DISK | SSD,DISK |
7 | HOT(default) | DISK:n | <none> | ARCHIVE |
5 | WARM | DSIK:1,ARCHIVE:n-1 | ARCHIVE,DISK | ARCHIVE,DISK |
2 | COLD | ARCHIVE:n | <none> | <none> |
解析:
LAZY_PERSIST:一個副本儲存在記憶體RAM_DISK中,其餘副本儲存在磁碟中。
ALL_SSD:所有副本都儲存在SSD中。
ONE_SSD:一個副本儲存在SSD中,其餘副本儲存在磁碟中。
HOT:所有副本儲存在磁碟中,這也是預設的儲存策略。
WARM:一個副本儲存在磁碟上,其餘副本儲存在歸檔儲存上。
COLD:所有副本都儲存在歸檔儲存上。
更正式的說,儲存策略由以下欄位組成:
(1)Policy ID(例:7)
(2)Policy name(例:HOT)
(3)A list of storage type types for block placement(例:DISK)
(4)A list of fallback storage types for file creation(creationFallbacks)
(5)A list of fallback storage types for replication(replicationFallbacks)
當有足夠的空間時,塊副本將根據#3中指定的儲存型別列表進行儲存。當#3中的某些儲存型別快要用完空間時,在#4和#5中指定的回退儲存型別列表分別用來替換檔案建立和複製的空間不足以儲存型別。
儲存策略名稱分別從LAZY_PERSIST到COLD,分別代表了裝置的訪問速度從快到慢,訪問速度最快的為記憶體檔案系統,其次是SSD,再是普通盤,最後是歸檔性儲存,我們可以利用上面的策略來控制資料的分佈以達到降低成本的目的。
creationFallbacks //對於第一個建立的block塊的fallback情況時的可選儲存型別
replicationFallbacks //對於block塊的其餘副本的fallback情況時的可選儲存型別,這裡出現了fallback的情況,什麼叫做fallback的情況呢?當前儲存型別不可用的時候,退一級所選擇使用的儲存型別。
2.3 儲存策略相關shell命令
1)檢視當前有哪些儲存策略可以用
bin/hdfs storagepolicies -listPolicies
2)建立檔案或目錄時,其儲存策略未指定,可以使用該命令指定儲存策略。
bin/hdfs dfsadmin -setStoragePolicy
3)為指定路徑(資料儲存目錄)設定指定的儲存策略
bin/hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx
4)獲取指定路徑(資料儲存目錄或檔案)的儲存策略
bin/hdfs storagepolicies -getStoragePolicy -path xxx
5)取消儲存策略;執行改命令之後該目錄或者檔案,以其上級的目錄為準,如果是根目錄,那麼就是HOT
bin/hdfs storagepolicies -unsetStoragePolicy -path xxx
6)檢視檔案塊的分佈
bin/hdfs fsck xxx -files -blocks -locations
7)開啟負載均衡
bin/start-balancer.sh
8)檢視叢集節點
bin/hadoop dfsadmin -report
2.4 HDFS異構儲存的原理
DataNode通過心跳彙報自身資料儲存目錄的StorageType給NameNode(資料儲存目錄的解析/心跳彙報過程);
隨後NameNode進行彙總並更新叢集內各個節點的儲存型別情況;
待儲存檔案根據自身設定的儲存策略資訊向NameNode請求擁有此型別儲存介質的DataNode作為候選節點。
第3章 測試環境
3.1 測試環境描述
伺服器配置:記憶體、CPU核數、磁碟
伺服器規模:5臺
框架版本:Hadoop3.1.3、Centos7.5、JDK1.8
叢集配置:副本數為2,建立好帶有儲存型別的目錄(提前建立)
3.2 配置檔案資訊
我們採取如下的節點儲存型別分配:
節點 | 儲存型別分配 |
hadoop102:192.168.24.102 | RAM_DISK,SSD |
hadoop103:192.168.24.103 | SSD,DISK |
hadoop104:192.168.24.104 | DISK,RAM_DISK |
hadoop105:192.168.24.105 | ARCHIVE |
hadoop106:192.168.24.106 | ARCHIVE |
配置資訊:
dfs.storage.policy.enabled //用於啟用、禁用儲存策略特性,預設為true。
dfs.datanode.data.dir //在每個資料節點上,應該用都好分隔的儲存位置標記它們的儲存型別。這允許儲存策略根據策略將塊放置在不同的儲存型別上。
為hadoop102節點的hdfs-site.xml新增如下資訊
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>[SSD]file:///opt/module/hdfsdata/ssd,[RAM_DISK]file:///opt/module/hdfsdata/ram_disk</value>
</property>
為hadoop103節點的hdfs-site.xml新增如下資訊
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>[SSD]file:///opt/module/hdfsdata/ssd,[DISK]file:///opt/module/hdfsdata/disk</value>
</property>
為hadoop104節點的hdfs-site.xml新增如下資訊
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>[RAM_DISK]file:///opt/module/hdfsdata/ram_disk,[DISK]file:///opt/module/hdfsdata/disk</value>
</property>
為hadoop105節點的hdfs-site.xml新增如下資訊
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>[ARCHIVE]file:///opt/module/hdfsdata/archive</value>
</property>
為hadoop106節點的hdfs-site.xml新增如下資訊
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>[ARCHIVE]file:///opt/module/hdfsdata/archive</value>
</property>
第4章 儲存策略測試
首先我們開啟叢集。
(1)並在hdfs上建立檔案目錄
[[email protected] hadoop-3.1.3]$ hadoop fs -mkdir /hdfsdata
(2)並將檔案資料上傳
[[email protected] hadoop-3.1.3]$ hadoop fs -put /opt/module/hdfsdata/atguigu.txt.gz /hdfsdata
4.1 HOT儲存策略
(1)最開始我們未設定儲存策略的情況下,我們獲取該目錄的儲存策略
[[email protected] hadoop-3.1.3]$ bin/hdfs storagepolicies -getStoragePolicy -path /hdfsdata
The storage policy of /hdfsdata is unspecified
(2)我們檢視上傳的檔案塊分佈
[[email protected] hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks -locations
雖然顯示儲存策略未標識,但是我們可以看到檔案都儲存在130,104節點的DISK下。由此可知,我們的預設儲存策略為HOT。
4.2 WARM儲存策略
(1)接下來我們為資料降溫
[[email protected] hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy WARM
Set storage policy WARM on /hdfsdata
(2)再次檢視檔案塊分佈,我們可以看到檔案塊依然放在原處。
(3)我們需要讓他hdfs按照儲存策略自行移動檔案塊
[[email protected] hadoop-3.1.3]$ bin/hdfs mover /hdfsdata
由過程我們可以得知,檔案塊正在由DISK轉向ARCHIVE
(4)移動完成
(5)再次檢視檔案塊分佈,
[[email protected] hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks -locations
我們可以看到,檔案塊的儲存,一半在DISK,一半在ARCHIVE,符合我們設定的WARM策略
4.3 COLD策略
(1)我們繼續將資料降溫為cold
[[email protected] hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy COLD
Set storage policy COLD on /hdfsdata
注:這裡我們要注意,當我們將目錄設定為COLD並且我們未配置ARCHIVE儲存目錄的情況下,不可以向該目錄直接上傳檔案,會報出異常。
(2)移動檔案塊,我們可以觀察到檔案塊正在由DISK轉向ARCHIVE。
[[email protected] hadoop-3.1.3]$ bin/hdfs mover /hdfsdata
(3)檢查檔案塊的分佈
[[email protected] hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks -locations
我們可以看到,所有檔案塊都在ARCHIVE,符合COLD儲存策略。
4.4 ONE_SSD策略
(1)接下來我們將儲存策略從預設的HOT更改為One_SSD
[[email protected] hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy One_SSD
Set storage policy One_SSD on /hdfsdata
(2)移動檔案塊,從過程可以看到,部分檔案塊已經從DISK轉向SSD
[[email protected] hadoop-3.1.3]$ bin/hdfs mover /hdfsdata
(3)轉移完成後,我們檢視檔案塊分佈,我們可以看到檔案塊分佈為一半在SSD,一半在DISK,符合One_SSD儲存策略。
[[email protected] hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks -locations
4.5 ALL_SSD策略
(1)接下來,我們再將儲存策略更改為All_SSD
[[email protected] hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy All_SSD
Set storage policy All_SSD on /hdfsdata
(2)並移動檔案塊,可看到檔案塊繼續從DISK移動SSD(之前配置為One_SSD,已經移動一次了)
[[email protected] hadoop-3.1.3]$ bin/hdfs mover /hdfsdata
(3)檢視檔案塊分佈,我們可以看到,所有的檔案塊都儲存在SSD
[[email protected] hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks -locations
4.6 LAZY_PERSIST策略
(1)繼續改變策略,將儲存策略改為lazy_persist
[[email protected] hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy lazy_persist
Set storage policy lazy_persist on /hdfsdata
(2)移動檔案塊,可以看到過程
[[email protected] hadoop-3.1.3]$ bin/hdfs mover /hdfsdata
(3)檢視檔案塊分佈
[[email protected] hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks -locations
這裡我們發現所有的檔案塊都是儲存在DISK,按照理論一個副本儲存在RAM_DISK,其他副本儲存在DISK中,這是因為,我們還需要配置“dfs.datanode.max.locked.memory”,“dfs.block.size”引數。
那麼出現儲存策略為LAZY_PERSIST時,檔案塊副本都儲存在DISK上的原因有如下兩點:
- 當客戶端所在的DataNode節點沒有RAM_DISK時,則會寫入客戶端所在的DataNode節點的DISK磁碟,其餘副本會寫入其他節點的DISK磁碟。
- 當客戶端所在的DataNode有RAM_DISK,但“dfs.datanode.max.locked.memory”引數值未設定或者設定過小(小於“dfs.block.size”引數值)時,則會寫入客戶端所在的DataNode節點的DISK磁碟,其餘副本會寫入其他節點的DISK磁碟。
但是由於虛擬機器的”max locked memory”為64KB,所以,如果引數配置過大,還會報出錯誤:
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in secureMain
java.lang.RuntimeException: Cannot start datanode because the configured max locked memory size (dfs.datanode.max.locked.memory) of 209715200 bytes is more than the datanode's available RLIMIT_MEMLOCK ulimit of 65536 bytes.
我們可以通過該命令查詢此引數的記憶體
[[email protected] hadoop-3.1.3]$ ulimit -a
第5章 測試總結
由上述測試,我們可得知,HDFS的異構儲存策略,預設儲存策略為HOT,將資料儲存在DISK上,當我們需要一定的計算效率時,我們可以將資料改存放在SSD或者RAM_DISK上面,但是需要我們注意的就是記憶體中會有發生資料丟失的可能性;但是對比以下,應用程式可以選擇使用LAZY_PERSIST以犧牲一些永續性保證換取更低的延遲。
並且HDFS異構儲存使得HDFS在實際生產的應用中,顯得更加靈活,做到根據資料的實用性進行儲存,提高儲存資料的利用率。