HDFS的存儲策略


我們在安裝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種存儲類型:

  1. DISK:表示普通磁盤(機械磁盤)
  2. SSD:表示固態硬盤
  3. RAM_DISK:表示內存硬盤,參考虛擬內存盤,說白了就是內存
  4. 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支持六種數據存儲策略,分別是:

  1. COLD
  2. WARM
  3. HOT
  4. ONE_SSD
  5. ALL_SSD
  6. 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.enabledtrue,當然,這個配置默認的值是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的存儲策略


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM