我們在安裝HDFS的時候,我們在hdfs-site.xml
配置過DataNode的數據存儲的文件目錄,如下:
<property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop-twq/bigdata/dfs/data</value> <description>DataNode存放數據的地方</description> </property>
目錄/home/hadoop-twq/bigdata/dfs/data
就是DataNode存放數據的地方,這個目錄對應的存儲介質就是普通的磁盤(DISK)。除了普通磁盤,存儲介質其實還有固態硬盤(SSD)等。那么,在了解HDFS存儲策略之前,我們先了解下HDFS支持的存儲類型
存儲類型
HDFS支持如下4種存儲類型:
- DISK:表示普通磁盤(機械磁盤)
- SSD:表示固態硬盤
- RAM_DISK:表示內存硬盤,參考虛擬內存盤,說白了就是
內存
- ARCHIVE:這個並不是特指某種存儲介質,而是為了滿足高密度存儲而定義的一種存儲類型,一般對於歸檔的、訪問不怎么頻繁的數據可以以 ARCHIVE 的形式存儲。
以上四種的存儲類型的存取的速度大小為:RAM_DISK->SSD->DISK->ARCHIVE。但是單bit存儲成本由高到低
那么我們在配置DataNode的存儲路徑的時候,我們可以分別為上面四種存儲類型配置存儲位置,如下圖:
<property> <name>dfs.datanode.data.dir</name> <value>[RAM_DISK]file:///ram_disk,[SSD]file:///ssd1/dn,[DISK]file:///disk1/dn,[ARCHIVE]file:///archive1/dn</value> <description>DataNode存放數據的地方</description> </property>
上面配置的DataNode的多個存儲位置由逗號隔開,每一個存儲位置由存儲類型和存儲物理路徑組成。HDFS通過該配置感知底層存儲的位置和類型
存儲策略
上面介紹了HDFS的數據可以存儲的存儲類型,那么數據真實是存儲在哪一中類型的存儲介質中呢?這個就是HDFS存儲策略需要解決的問題了。接下來,我們詳細看下HDFS支持的存儲策略
我們先在master機器上執行如下的命令,來查看HDFS支持的存儲策略:
hdfs storagepolicies -listPolicies
返回結果如下:
Block Storage Policies: BlockStoragePolicy{COLD:2, storageTypes=[ARCHIVE], creationFallbacks=[], replicationFallbacks=[]} BlockStoragePolicy{WARM:5, storageTypes=[DISK, ARCHIVE], creationFallbacks=[DISK, ARCHIVE], replicationFallbacks=[DISK, ARCHIVE]} BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]} BlockStoragePolicy{ONE_SSD:10, storageTypes=[SSD, DISK], creationFallbacks=[SSD, DISK], replicationFallbacks=[SSD, DISK]} BlockStoragePolicy{ALL_SSD:12, storageTypes=[SSD], creationFallbacks=[DISK], replicationFallbacks=[DISK]} BlockStoragePolicy{LAZY_PERSIST:15, storageTypes=[RAM_DISK, DISK], creationFallbacks=[DISK], replicationFallbacks=[DISK]}
我們分別來解釋上面HDFS支持的六種存儲策略:
COLD
BlockStoragePolicy{COLD:2, storageTypes=[ARCHIVE], creationFallbacks=[], replicationFallbacks=[]}
這個存儲策略的名稱是COLD
,策略ID是2
,存儲類型是ARCHIVE
。這種存儲策略是用於存儲冷數據,也就是很少會使用的歸檔數據可以設置為這個存儲策略。
creationFallbacks:這個是指當創建數據塊的時候,如果當前存儲策略指定的存儲類型的空間不足的時候的備選存儲類型
replicationFallbacks:這個是當數據塊復制的時候,如果當前存儲策略指定的存儲類型的空間不足的時候的備選存儲類型
對於COLD的存儲策略,所有的數據都存儲在ARCHIVE
存儲類型對應的存儲位置上,數據塊創建或者復制的時候都沒有備選的存儲類型
WARM
BlockStoragePolicy{WARM:5, storageTypes=[DISK, ARCHIVE], creationFallbacks=[DISK, ARCHIVE], replicationFallbacks=[DISK, ARCHIVE]}
這個存儲策略的名稱是WARM
,策略ID是5
,存儲類型是DISK, ARCHIVE
。半冷半熱的數據可以設置這個存儲策略。設置為這個存儲策略的時候,如果數據塊的備份數是n
的話,那么,創建的第一個數據塊的數據存儲在DISK
類型的存儲目錄中,其他復制的(n - 1)
個數據塊的數據存儲在ARCHIVE
類型的存儲目錄中。
在這種存儲策略下:
當創建數據塊的時候,如果當前存儲策略指定的存儲類型的空間不足的時候的備選存儲類型是DISK, ARCHIVE
當數據塊復制的時候,如果當前存儲策略指定的存儲類型的空間不足的時候的備選存儲類型是DISK, ARCHIVE
HOT
BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}
這個存儲策略的名稱是HOT
,策略ID是7
,存儲類型是DISK
。**熱(其實就是經常會使用)**的數據可以設置這個存儲策略。設置為這個存儲策略的時候,如果數據塊的備份數是n
的話,那么,不管是新建的數據塊還是復制的數據塊的數據都存儲在DISK
類型中對應的存儲位置上
在這種存儲策略下:
當創建數據塊的時候,沒有備選存儲類型
當數據塊復制的時候,如果當前存儲策略指定的存儲類型的空間不足的時候的備選存儲類型是ARCHIVE
ONE_SSD
BlockStoragePolicy{ONE_SSD:10, storageTypes=[SSD, DISK], creationFallbacks=[SSD, DISK], replicationFallbacks=[SSD, DISK]}
這個存儲策略的名稱是ONE_SSD
,策略ID是10
,存儲類型是SSD, DISK
。這個策略是HDFS的默認的數據存儲策略
設置為這個存儲策略的時候,如果數據塊的備份數是n
的話,那么,1個新建的數據塊存儲在SSD
類型的對應的位置上,其他的(n - 1)
個復制的數據塊存儲在DISK
類型的對應的位置上。
在這種存儲策略下:
當數據塊復制的時候,如果當前存儲策略指定的存儲類型的空間不足的時候的備選存儲類型是SSD, DISK
當數據塊復制的時候,如果當前存儲策略指定的存儲類型的空間不足的時候的備選存儲類型是SSD, DISK
ALL_SSD
BlockStoragePolicy{ALL_SSD:12, storageTypes=[SSD], creationFallbacks=[DISK], replicationFallbacks=[DISK]}
這個存儲策略的名稱是ALL_SSD
,策略ID是12
,存儲類型是SSD
。設置為這個存儲策略的時候,如果數據塊的備份數是n
的話,那么,不管是新建的還是復制的n
個數據塊都存儲在SSD
類型對應的位置上
在這種存儲策略下:
當數據塊復制的時候,如果當前存儲策略指定的存儲類型的空間不足的時候的備選存儲類型是DISK
當數據塊復制的時候,如果當前存儲策略指定的存儲類型的空間不足的時候的備選存儲類型是DISK
LAZY_PERSIST
BlockStoragePolicy{LAZY_PERSIST:15, storageTypes=[RAM_DISK, DISK], creationFallbacks=[DISK], replicationFallbacks=[DISK]}
這個存儲策略的名稱是LAZY_PERSIST
,策略ID是15
,存儲類型是RAM_DISK, DISK
。設置為這個存儲策略的時候,如果數據塊的備份數是n
的話,那么,1個新建的數據塊存儲在RAM_DISK
類型的對應的位置上,其他的(n - 1)
個復制的數據塊存儲在DISK
類型的對應的位置上。
在這種存儲策略下:
當數據塊復制的時候,如果當前存儲策略指定的存儲類型的空間不足的時候的備選存儲類型是DISK
當數據塊復制的時候,如果當前存儲策略指定的存儲類型的空間不足的時候的備選存儲類型是DISK
總結
從上我們可以看出,HDFS支持六種數據存儲策略,分別是:
- COLD
- WARM
- HOT
- ONE_SSD
- ALL_SSD
- LAZY_PERSIST
按照ALL_SSD -> ONE_SSD -> HOT -> WARM -> COLD的順序,面向的數據是越來越冷
LAZY_PERSIST
比較特殊,如果一個文件的存儲策略被指定為LAZY_PERSIST
,在寫入時會先寫入內存,再異步地寫入磁盤,即主要用來降低小數據量的寫入延遲,代價是在某些情況下會有數據丟失。
官方對LAZY_PERSIST
的解釋如下:
Applications can choose to use Lazy Persist Writes to trade off some durability guarantees in favor of reduced latency
最后,我們用一張圖表來總結上面六種存儲策略:
策略ID | 策略名稱 | 數據塊放置情況(n個備份) | creationFallbacks | replicationFallbacks |
---|---|---|---|---|
2 | COLD | ARCHIVE: n | ||
5 | WARM | DISK: 1, ARCHIVE: n-1 | ARCHIVE, DISK | ARCHIVE, DISK |
7 | HOT(默認策略) | DISK: n | ARCHIVE | |
10 | ONE_SSD | SSD: 1, DISK: n-1 | SSD, DISK | SSD, DISK |
12 | ALL_SSD | SSD: n | DISK | DISK |
15 | LAZY_PERSIST | RAM_DISK: 1, DISK: n-1 | DISK | DISK |
我們要開啟HDFS的存儲策略的功能的話,我們需要配置參數dfs.storage.policy.enabled
為true
,當然,這個配置默認的值是true
,即HDFS的默認是支持存儲策略的。
存儲策略的設置
我們可以先通過下面的命令來查看一個HDFS路徑是否設置了存儲策略:
hdfs storagepolicies -getStoragePolicy -path /user/hadoop-twq/cmd
執行上面的命令的輸出是:
The storage policy of /user/hadoop-twq/cmd is unspecified
說明這個路徑沒有設置存儲路徑,那么這個路勁就是用默認的存儲策略,即HOT
存儲策略
我們可以通過下面的命令來為某個路徑設置存儲策略:
hdfs storagepolicies -setStoragePolicy -path /user/hadoop-twq/cmd -policy HOT
執行上面的命令的輸出是:
Set storage policy HOT on /user/hadoop-twq/cmd
說明文件路徑/user/hadoop-twq/cmd
的存儲策略已經設置為HOT
。我們可以再次使用下面的命令來查看這個路徑的存儲策略:
hdfs storagepolicies -getStoragePolicy -path /user/hadoop-twq/cmd
這個時候的返回是:
The storage policy of /user/hadoop-twq/cmd: BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}
可以看出,路徑/user/hadoop-twq/cmd
確實被設置為HOT
的存儲策略