在我們實(shí)際的開發(fā)過程中,我們的某些數(shù)據(jù)可能經(jīng)常使用,但是過了一段時間,這個數(shù)據(jù)就不怎么使用了,即我們的數(shù)據(jù)存在一個熱、溫、冷等這些特性。那么針對數(shù)據(jù)的熱度,我們可以采用不同的策略,存儲到不同的存儲介質(zhì)上。
1 背景
在我們實(shí)際的開發(fā)過程中,我們的某些數(shù)據(jù)可能經(jīng)常使用,但是過了一段時間,這個數(shù)據(jù)就不怎么使用了,即我們的數(shù)據(jù)存在一個熱、溫、冷等這些特性。那么針對數(shù)據(jù)的熱度,我們可以采用不同的策略,存儲到不同的存儲介質(zhì)上。
比如:
- 針對經(jīng)常訪問的數(shù)據(jù),我們可以存儲在SSD上。
- 針對訪問頻率不高的,我們可以存儲在DISK,即普通的硬盤上。
- 針對幾乎不會訪問的數(shù)據(jù),保存在歸檔介質(zhì)上。
注意:那么hdfs自己知道哪些數(shù)據(jù)是熱數(shù)據(jù),哪些數(shù)據(jù)是冷數(shù)據(jù)嗎,貌似是不知道的,需要我們自己去判斷。
2 hdfs異構(gòu)存儲類型和存儲策略
2.1 hdfs支持的存儲類型
hdfs支持如下4中存儲類型
- ? ARCHIVE: 它具有高存儲密度(PB級存儲)但計算能力弱,一般用于歸檔文件的存儲。
- ? DISK : 普通磁盤,默認(rèn)的存儲類型
- ? SSD : SSD固態(tài)硬盤
- ? RAM_DISK: 支持在內(nèi)存中寫入單個副本文件

hdfs支持的存儲類型
2.2 hdfs如何知道數(shù)據(jù)存儲目錄是那種存儲類型
hdfs是不會自動檢測我們指定的數(shù)據(jù)存儲目錄是何種存儲類型的,需要我們在配置的時候告訴hdfs。
指定目錄的存儲類型
vim hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>[SSD]file:///var/hadoop/dfs/data1,[DISK]file:///var/hadoop/dfs/data2</value>
</property>
從上面的配置中可以 /var/hadoop/dfs/data1前面指定了[SSD],則說明data1 這個目錄是一個 SSD的存儲介質(zhì),但是具體是不是真的SSD類型,這個是不會去校驗(yàn)的。

hdfs如何知道數(shù)據(jù)存儲目錄是那種存儲類型
2.3 存儲策略
2.3.1 在hdfs中支持如下存儲策略
- Hot: 用于存儲和計算。當(dāng)我們的數(shù)據(jù)是熱數(shù)據(jù)時,可以使用這種存儲策略,所有的副本都在DISK中。
- Warm: 僅適用于計算有限的存儲。不再使用的數(shù)據(jù)或需要?dú)w檔的數(shù)據(jù)從熱存儲移動到冷存儲。當(dāng)一個塊冷時,所有副本都存儲在ARCHIVE中。
- Cold:部分熱和部分冷。當(dāng)一個塊是熱的時,它的一些副本存儲在DISK中,其余的副本存儲在ARCHIVE中。
- All_SSD:用于將所有副本存儲在SSD中。
- One_SSD:用于將其中一個副本存儲在SSD中。其余副本存儲在DISK中。
- Lazy_Persist:用于在內(nèi)存中寫入具有單個副本的塊。副本首先用RAM_DISK寫入,然后懶惰地保存在DISK中。
- Provided:用于在HDFS之外存儲數(shù)據(jù)hdfs支持的存儲策略
2.3.2 存儲策略表

存儲策略表
2.3.2 Storage Policy Resolution
創(chuàng)建文件或目錄時,未指定其存儲策略。可以使用storagePolicy -setStoragePolicy命令指定存儲策略。文件或目錄的有效存儲策略由以下規(guī)則解析。
- 如果文件或目錄指定了存儲策略,則返回它。
- 對于未指定的文件或目錄,如果是根目錄,則返回默認(rèn)存儲策略。否則,返回其父級的有效存儲策略。
有效的存儲策略可以通過storagePolicy -getStoragePolicy命令檢索。
2.3.4 配置存儲策略
- dfs.storage.policy.enabled 用于啟用或禁止存儲策略特性,默認(rèn)值是true
- dfs.datanode.data.dir 在每個數(shù)據(jù)節(jié)點(diǎn)上,逗號分隔的存儲位置應(yīng)標(biāo)記其存儲類型。這允許存儲策略根據(jù)策略將塊放置在不同的存儲類型上。
舉例說明?
- 如果一個datanode 上的存儲位置 /grid/dn/disk0是 DISK類型,應(yīng)該配置為[DISK]file:///grid/dn/disk0
- 如果一個datanode 上的存儲位置 /grid/dn/disk0是 SSD類型,應(yīng)該配置為[SSD]file:///grid/dn/disk0
- 如果一個datanode 上的存儲位置 /grid/dn/disk0是 ARCHIVE類型,應(yīng)該配置為[ARCHIVE]file:///grid/dn/disk0
- 如果沒有顯式標(biāo)記的存儲類型,則datanode存儲位置的默認(rèn)存儲類型將是DISK。
2.3.5 基于存儲策略的數(shù)據(jù)移動
在已經(jīng)存在的文件/目錄上設(shè)置新的存儲策略將改變命名空間中的策略,但它不會在存儲介質(zhì)之間物理移動塊。 此處介紹基于Mover來解決這個問題,具體的細(xì)節(jié)需要看官方文檔。

mover工具的使用
2.3.6 存儲策略命令
2.3.6.1 列出所有存儲策略
hdfs storagepolicies -listPolicies
2.3.6.2 為文件或目錄設(shè)置存儲策略
hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>
<path>:需要設(shè)置存儲策略的文件或目錄
<policy>:存儲策略的名字
2.3.6.3 取消存儲策略
hdfs storagepolicies -unsetStoragePolicy -path <path>
取消對文件或目錄的存儲策略設(shè)置。在unset命令之后,將應(yīng)用最近祖先的存儲策略,如果沒有任何祖先的策略,則將應(yīng)用默認(rèn)存儲策略。
2.3.6.4 獲取文件或目錄的存儲策略。
hdfs storagepolicies -getStoragePolicy -path <path>
2.3.6.5 查看文件塊分布
hdfs fsck xxx -files -blocks -locations
3 hdfs異構(gòu)存儲案例
3.1 環(huán)境準(zhǔn)備
ip地址節(jié)點(diǎn)名存儲類型192.168.121.140hadoop01DISK,ARCHIVE192.168.121.141hadoop02DISK,SSD192.168.121.142hadoop03SSD,ARCHIVE
3.2 節(jié)點(diǎn) hdfs-site.xml配置文件
3.2.1 hadoop01
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 開啟hdfs異構(gòu)存儲策略 -->
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<!-- 配置block塊的存儲目錄,配置hdfds數(shù)據(jù)的存儲目錄 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>[DISK]file:///opt/bigdata/hadoop-3.3.4/data/disk,[ARCHIVE]file:///opt/bigdata/hadoop-3.3.4/data/archive</value>
</property>
3.2.2 hadoop02
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 開啟hdfs異構(gòu)存儲策略 -->
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<!-- 配置block塊的存儲目錄,配置hdfds數(shù)據(jù)的存儲目錄 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>[DISK]file:///opt/bigdata/hadoop-3.3.4/data/disk,[SSD]file:///opt/bigdata/hadoop-3.3.4/data/ssd</value>
</property>
3.2.3 hadoop03
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 開啟hdfs異構(gòu)存儲策略 -->
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<!-- 配置block塊的存儲目錄,配置hdfds數(shù)據(jù)的存儲目錄 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>[SSD]file:///opt/bigdata/hadoop-3.3.4/data/ssd,[ARCHIVE]file:///opt/bigdata/hadoop-3.3.4/data/archive</value>
</property>
3.3 重啟hdfs集群,并看數(shù)據(jù)目錄存儲類型是否正確

查看數(shù)據(jù)目錄的存儲類型
3.4 案例演示
此處僅僅只是演示 Warm類型。
由之前的存儲策略表(2.3.2)可知,Warm類型的策略,只有一個塊存儲在DISK存儲上,其余的全部存儲在ARCHIVE存儲上。
# hdfs 上創(chuàng)建目錄
[hadoopdeploy@hadoop01 hadoop]$ hadoop fs -mkdir -p /var/data/storage
# 上傳文件到 hdfs 目錄中
[hadoopdeploy@hadoop01 hadoop]$ hadoop fs -put /etc/profile /var/data/storage/profile
# 設(shè)置 /var/data/storage 目錄的存儲策略為 warm
[hadoopdeploy@hadoop01 hadoop]$ hdfs storagepolicies -setStoragePolicy -path /var/data/storage -policy WARM
Set storage policy WARM on /var/data/storage
# 查看 /var/data/storage 目錄的文件塊分布,發(fā)現(xiàn)還是 2個 DISK,說明歷史數(shù)據(jù)需要遷移,使用 mover 命令
[hadoopdeploy@hadoop01 hadoop]$ hdfs fsck /var/data/storage -files -blocks -locations
Connecting to namenode via http://hadoop01:9870/fsck?ugi=hadoopdeploy&files=1&blocks=1&locations=1&path=%2Fvar%2Fdata%2Fstorage
FSCK started by hadoopdeploy (auth:SIMPLE) from /192.168.121.140 for path /var/data/storage at Sat Mar 18 17:49:48 CST 2023
/var/data/storage <dir>
/var/data/storage/profile 2098 bytes, replicated: replication=2, 1 block(s): OK
0. BP-1760725553-192.168.121.140-1676791226380:blk_1073741858_1036 len=2098 Live_repl=2 [DatanodeInfoWithStorage[192.168.121.141:9866,DS-e86f80ba-6f04-4074-ab96-f58212c3c0e2,DISK], DatanodeInfoWithStorage[192.168.121.140:9866,DS-ca40e8cf-4d38-4a42-bfcb-e636087e9025,DISK]]
......
# 將 /var/data/storage 按照存儲策略移動數(shù)據(jù)塊
[hadoopdeploy@hadoop01 hadoop]$ hdfs mover /var/data/storage
2023-03-18 17:52:04,620 INFO mover.Mover: namenodes = {hdfs://hadoop01:8020=null}
2023-03-18 17:52:04,630 INFO balancer.NameNodeConnector: getBlocks calls for hdfs://hadoop01:8020 will be rate-limited to 20 per second
2023-03-18 17:52:05,368 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.121.142:9866
2023-03-18 17:52:05,368 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.121.140:9866
2023-03-18 17:52:05,368 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.121.141:9866
2023-03-18 17:52:05,402 INFO balancer.Dispatcher: Start moving blk_1073741858_1036 with size=2098 from 192.168.121.140:9866:DISK to 192.168.121.140:9866:ARCHIVE through 192.168.121.140:9866
2023-03-18 17:52:05,412 INFO balancer.Dispatcher: Successfully moved blk_1073741858_1036 with size=2098 from 192.168.121.140:9866:DISK to 192.168.121.140:9866:ARCHIVE through 192.168.121.140:9866
Mover Successful: all blocks satisfy the specified storage policy. Exiting...
2023-3-18 17:52:15 Mover took 10sec
# 重新查看 /var/data/storage 目錄的文件塊分布,發(fā)現(xiàn)還是 一個是 DISK 另外一個 ARCHIVE,說明存儲策略生效了
pdeploy@hadoop01 hadoop]$ hdfs fsck /var/data/storage -files -blocks -locations
Connecting to namenode via http://hadoop01:9870/fsck?ugi=hadoopdeploy&files=1&blocks=1&locations=1&path=%2Fvar%2Fdata%2Fstorage
FSCK started by hadoopdeploy (auth:SIMPLE) from /192.168.121.140 for path /var/data/storage at Sat Mar 18 17:53:23 CST 2023
/var/data/storage <dir>
/var/data/storage/profile 2098 bytes, replicated: replication=2, 1 block(s): OK
0. BP-1760725553-192.168.121.140-1676791226380:blk_1073741858_1036 len=2098 Live_repl=2 [DatanodeInfoWithStorage[192.168.121.141:9866,DS-e86f80ba-6f04-4074-ab96-f58212c3c0e2,DISK], DatanodeInfoWithStorage[192.168.121.140:9866,DS-cf50253c-ea3f-46f6-bdd9-4ac1ad3907d2,ARCHIVE]]

查看文件塊分布
4 參考文檔
1、https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html
2、https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml