1. 程式人生 > 其它 >第二十四章 HDFS—儲存優化

第二十四章 HDFS—儲存優化

注:演示糾刪碼和異構儲存需要一共5臺伺服器。儘量拿另外一套叢集。提前準備5臺伺服器的叢集。

一、糾刪碼基本概述

1.糾刪碼原理

HDFS預設情況下,一個檔案有3個副本,這樣提高了資料的可靠性,但也帶來了2倍的冗餘開銷。Hadoop3.x引入了糾刪碼,採用計算的方式,可以節省約50%左右的儲存空間

2.糾刪碼操作相關的命令

[delopy@hadoop102 ~]$ hdfs ec
Usage: bin/hdfs ec [COMMAND]
          [-listPolicies]
          [-addPolicies -policyFile <file>]
          [-getPolicy -path <path>]
          [-removePolicy -policy <policy>]
          [-setPolicy -path <path> [-policy <policy>] [-replicate]]
          [-unsetPolicy -path <path>]
          [-listCodecs]
          [-enablePolicy -policy <policy>]
          [-disablePolicy -policy <policy>]
          [-help <command-name>].

3.檢視當前支援的糾刪碼策略

[delopy@hadoop102 ~]$ hdfs ec -listPolicies
Erasure Coding Policies:
ErasureCodingPolicy=[Name=RS-10-4-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=10, numParityUnits=4]], CellSize=1048576, Id=5], State=DISABLED
ErasureCodingPolicy=[Name=RS-3-2-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=3, numParityUnits=2]], CellSize=1048576, Id=2], State=DISABLED
ErasureCodingPolicy=[Name=RS-6-3-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=6, numParityUnits=3]], CellSize=1048576, Id=1], State=ENABLED
ErasureCodingPolicy=[Name=RS-LEGACY-6-3-1024k, Schema=[ECSchema=[Codec=rs-legacy, numDataUnits=6, numParityUnits=3]], CellSize=1048576, Id=3], State=DISABLED
ErasureCodingPolicy=[Name=XOR-2-1-1024k, Schema=[ECSchema=[Codec=xor, numDataUnits=2, numParityUnits=1]], CellSize=1048576, Id=4], State=DISABLED

4.糾刪碼策略解釋

RS-3-2-1024k:使用RS編碼,每3個數據單元,生成2個校驗單元,共5個單元,也就是說:這5個單元中,只要有任意的3個單元存在(不管是資料單元還是校驗單元,只要總數=3),就可以得到原始資料。每個單元的大小是1024k=1024*1024=1048576。
RS-10-4-1024k:使用RS編碼,每10個數據單元(cell),生成4個校驗單元,共14個單元,也就是說:這14個單元中,只要有任意的10個單元存在(不管是資料單元還是校驗單元,只要總數=10),就可以得到原始資料。每個單元的大小是1024k=1024*1024=1048576。

RS-6-3-1024k:使用RS編碼,每6個數據單元,生成3個校驗單元,共9個單元,也就是說:這9個單元中,只要有任意的6個單元存在(不管是資料單元還是校驗單元,只要總數=6),就可以得到原始資料。每個單元的大小是1024k=1024*1024=1048576。

RS-LEGACY-6-3-1024k:策略和上面的RS-6-3-1024k一樣,只是編碼的演算法用的是rs-legacy。 

XOR-2-1-1024k:使用XOR編碼(速度比RS編碼快),每2個數據單元,生成1個校驗單元,共3個單元,也就是說:這3個單元中,只要有任意的2個單元存在(不管是資料單元還是校驗單元,只要總數= 2),就可以得到原始資料。每個單元的大小是1024k=1024*1024=1048576。

二、糾刪碼案例實操

糾刪碼策略是給具體一個路徑設定。所有往此路徑下儲存的檔案,都會執行此策略。

預設只開啟對RS-6-3-1024k策略的支援,如要使用別的策略需要提前啟用。

1.需求

將/input目錄設定為RS-3-2-1024k策略

2.具體步驟

#1.開啟對RS-3-2-1024k策略的支援
[delopy@hadoop102 hadoop]$  hdfs ec -enablePolicy  -policy RS-3-2-1024k
Erasure coding policy RS-3-2-1024k is enabled

#2.在HDFS建立目錄,並設定RS-3-2-1024k策略
[delopy@hadoop102  hadoop]$  hdfs dfs -mkdir /input

[delopy@hadoop202 hadoop]$ hdfs ec -setPolicy -path /input -policy RS-3-2-1024k

#3.上傳檔案,並檢視檔案編碼後的儲存情況
[delopy@hadoop102 hadoop]$ hdfs dfs -put web.log /input
注:你所上傳的檔案需要大於2M才能看出效果。(低於2M,只有一個數據單元和兩個校驗單元)

#4.檢視儲存路徑的資料單元和校驗單元,並作破壞實驗

三、異構儲存(冷熱資料分離)

異構儲存主要解決,不同的資料,儲存在不同型別的硬碟中,達到最佳效能的問題。

1.儲存型別和儲存策略

#1.關於儲存型別
RAM_DISK:(記憶體映象檔案系統)
SSD:(SSD固態硬碟)
DISK:(普通磁碟,在HDFS中,如果沒有主動宣告資料目錄儲存型別預設都是DISK)
ARCHIVE:(沒有特指哪種儲存介質,主要的指的是計算能力比較弱而儲存密度比較高的儲存介質,用來解決資料量的容量擴增的問題,一般用於歸檔)

#2.關於儲存策略
說明:從Lazy_Persist到Cold,分別代表了裝置的訪問速度從快到慢

2.異構儲存Shell操作

#1.檢視當前有哪些儲存策略可以用
[delopy@hadoop102 hadoop]$ hdfs storagepolicies -listPolicies

#2.為指定路徑(資料儲存目錄)設定指定的儲存策略
hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx

#3.獲取指定路徑(資料儲存目錄或檔案)的儲存策略
hdfs storagepolicies -getStoragePolicy -path xxx

#4.取消儲存策略;執行改命令之後該目錄或者檔案,以其上級的目錄為準,如果是根目錄,那麼就是HOT
hdfs storagepolicies -unsetStoragePolicy -path xxx

#5.檢視檔案塊的分佈
bin/hdfs fsck xxx -files -blocks -locations

#6.檢視叢集節點
hadoop dfsadmin -report

四、異構儲存環境準備

1.測試環境描述

伺服器規模:5臺
叢集配置:副本數為2,建立好帶有儲存型別的目錄(提前建立)
叢集規劃:
節點 儲存型別分配
hadoop102 RAM_DISK,SSD
hadoop103 SSD,DISK
hadoop104 DISK,RAM_DISK
hadoop105 ARCHIVE
hadoop106 ARCHIVE

2.配置檔案資訊

#1.為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/hadoop/hdfsdata/ssd,[RAM_DISK]file:///opt/module/hadoop/hdfsdata/ram_disk</value>
</property>

#2.為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/hadoop/hdfsdata/ssd,[DISK]file:///opt/module/hadoop/hdfsdata/disk</value>
</property>

#3.為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/hadoop/hdfsdata/disk</value>
</property>

#4.為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/hadoop/hdfsdata/archive</value>
</property>

#5.為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/hadoop/hdfsdata/archive</value>
</property>

3.資料準備

#1.啟動叢集
[delopy@hadoop102 hadoop]$ hdfs namenode -format
[delopy@hadoop102 hadoop]$ myhadoop.sh start

#2.並在HDFS上建立檔案目錄
[delopy@hadoop102 hadoop]$ hadoop fs -mkdir /hdfsdata

#3.並將檔案資料上傳
[delopy@hadoop102 hadoop]$ hadoop fs -put /opt/module/hadoop/NOTICE.txt /hdfsdata

五、HOT儲存策略案例

#1.最開始我們未設定儲存策略的情況下,我們獲取該目錄的儲存策略
[delopy@hadoop102 hadoop]$ hdfs storagepolicies -getStoragePolicy -path /hdfsdata

#2.我們檢視上傳的檔案塊分佈
[delopy@hadoop102 hadoop]$ hdfs fsck /hdfsdata -files -blocks -locations
[DatanodeInfoWithStorage[192.168.10.104:9866,DS-0b133854-7f9e-48df-939b-5ca6482c5afb,DISK], DatanodeInfoWithStorage[192.168.10.103:9866,DS-ca1bd3b9-d9a5-4101-9f92-3da5f1baa28b,DISK]]

未設定儲存策略,所有檔案塊都儲存在DISK下。所以,預設儲存策略為HOT。

六、WARM儲存策略測試

#1.接下來我們為資料降溫
[delopy@hadoop102 hadoop]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy WARM

#2.再次檢視檔案塊分佈,我們可以看到檔案塊依然放在原處。
[delopy@hadoop102 hadoop]$ hdfs fsck /hdfsdata -files -blocks -locations

#3.我們需要讓他HDFS按照儲存策略自行移動檔案塊
[delopy@hadoop102 hadoop]$ hdfs mover /hdfsdata

#4.再次檢視檔案塊分佈
[delopy@hadoop102 hadoop]$ hdfs fsck /hdfsdata -files -blocks -locations

[DatanodeInfoWithStorage[192.168.10.105:9866,DS-d46d08e1-80c6-4fca-b0a2-4a3dd7ec7459,ARCHIVE], DatanodeInfoWithStorage[192.168.10.103:9866,DS-ca1bd3b9-d9a5-4101-9f92-3da5f1baa28b,DISK]]

檔案塊一半在DISK,一半在ARCHIVE,符合我們設定的WARM策略

七、COLD策略測試

#1.我們繼續將資料降溫為cold
[delopy@hadoop102 hadoop]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy COLD
注意:當我們將目錄設定為COLD並且我們未配置ARCHIVE儲存目錄的情況下,不可以向該目錄直接上傳檔案,會報出異常。

#2.手動轉移
[delopy@hadoop102 hadoop]$ hdfs mover /hdfsdata

#3.檢查檔案塊的分佈
[delopy@hadoop102 hadoop]$ bin/hdfs fsck /hdfsdata -files -blocks -locations

[DatanodeInfoWithStorage[192.168.10.105:9866,DS-d46d08e1-80c6-4fca-b0a2-4a3dd7ec7459,ARCHIVE], DatanodeInfoWithStorage[192.168.10.106:9866,DS-827b3f8b-84d7-47c6-8a14-0166096f919d,ARCHIVE]]

所有檔案塊都在ARCHIVE,符合COLD儲存策略。

八、ONE_SSD策略測試

#1.接下來我們將儲存策略從預設的HOT更改為One_SSD
[delopy@hadoop102 hadoop]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy One_SSD

#2.手動轉移檔案塊
[delopy@hadoop102 hadoop]$ hdfs mover /hdfsdata

#3.轉移完成後,我們檢視檔案塊分佈,
[delopy@hadoop102 hadoop]$ bin/hdfs fsck /hdfsdata -files -blocks -locations

[DatanodeInfoWithStorage[192.168.10.104:9866,DS-0b133854-7f9e-48df-939b-5ca6482c5afb,DISK], DatanodeInfoWithStorage[192.168.10.103:9866,DS-2481a204-59dd-46c0-9f87-ec4647ad429a,SSD]]
檔案塊分佈為一半在SSD,一半在DISK,符合One_SSD儲存策略。

九、 ALL_SSD策略測試

#1.接下來,我們再將儲存策略更改為All_SSD
[delopy@hadoop102 hadoop]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy All_SSD

#2.手動轉移檔案塊
[delopy@hadoop102 hadoop]$ hdfs mover /hdfsdata

#3.檢視檔案塊分佈,我們可以看到,
[delopy@hadoop102 hadoop]$ bin/hdfs fsck /hdfsdata -files -blocks -locations

[DatanodeInfoWithStorage[192.168.10.102:9866,DS-c997cfb4-16dc-4e69-a0c4-9411a1b0c1eb,SSD], DatanodeInfoWithStorage[192.168.10.103:9866,DS-2481a204-59dd-46c0-9f87-ec4647ad429a,SSD]]
所有的檔案塊都儲存在SSD,符合All_SSD儲存策略。

十、LAZY_PERSIST策略測試

#1.繼續改變策略,將儲存策略改為lazy_persist
[delopy@hadoop102 hadoop]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy lazy_persist

#2.手動轉移檔案塊
[delopy@hadoop102 hadoop]$ hdfs mover /hdfsdata

#3.檢視檔案塊分佈
[delopy@hadoop102 hadoop]$ hdfs fsck /hdfsdata -files -blocks -locations

[DatanodeInfoWithStorage[192.168.10.104:9866,DS-0b133854-7f9e-48df-939b-5ca6482c5afb,DISK], DatanodeInfoWithStorage[192.168.10.103:9866,DS-ca1bd3b9-d9a5-4101-9f92-3da5f1baa28b,DISK]]

這裡我們發現所有的檔案塊都是儲存在DISK,按照理論一個副本儲存在RAM_DISK,其他副本儲存在DISK中,這是因為,我們還需要配置“dfs.datanode.max.locked.memory”,“dfs.block.size”引數。              

那麼出現儲存策略為LAZY_PERSIST時,檔案塊副本都儲存在DISK上的原因有如下兩點:
1)當客戶端所在的DataNode節點沒有RAM_DISK時,則會寫入客戶端所在的DataNode節點的DISK磁碟,其餘副本會寫入其他節點的DISK磁碟。
2)當客戶端所在的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.

我們可以通過該命令查詢此引數的記憶體
[delopy@hadoop102 hadoop]$ ulimit -a

max locked memory       (kbytes, -l) 64