本文介紹hdfs的存儲策略 內容譯自:http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html#Get_Storage_Policy 譯註:存儲策略是在和經濟妥協的一個技術產物。 ...
本文介紹hdfs的存儲策略
譯註:存儲策略是在和經濟妥協的一個技術產物。由於存儲技術發展的日新月異,也許將來再考慮這種策略不是很有必要了。雖然從邏輯上來說,總是有相似的問題出現。但將來對於絕大部分問題而言,這些問題已經不是問題了。
1.簡介
歸檔存儲用於減少對存儲的壓力。具有高密度存,不那麼貴的存儲的節點,這些接節點的計算能力也一般般,這種節點可以在集群中承當冷存儲(冷宮,冷點)。
可以根據策略要求,數據能從熱點移動到冷點。
為更多的節點添加冷存儲,可以提升集群存儲。
這個框架由多種存儲和歸檔存儲構成,其中還包含SSD和記憶體。
用戶可以選擇在SSD和記憶體中存儲數據,以便提升性能。
譯註:原文說了那麼多,有用的就是兩點:存儲、性能。 這種策略在很多其它系統都是透明的,也不需要它們自己管理。例如rdbms可以不它們的數據存儲的任意地方,不需要特別設定策略。
hdfs之所以要這麼做,是因為hdfs的應用現在變得更加多樣,有的人期望提供類似即席查詢的能力,而有的人僅僅要求偶爾計算一下。
2.存儲類型和存儲策略
譯註:原文的一段內容沒有特別含義,稍微啰嗦,所以摘其精要。
存儲類型
- DISK-普通磁碟,存儲
- SSD -SSD盤
- RAM_DISK 記憶體盤
- ARCHIVE -歸檔/壓縮,不是實際的磁碟類型,而是數據被壓縮存儲。
存儲策略
存儲策略允許不同的文件存儲在不同的存儲類型上。
目前有以下策略:
- Hot - 存儲和計算都熱。 如果是熱快,那麼複製的目標也是DISK(普通的磁碟)。
- Cold -用於有限計算的存儲。 數據不再使用,或者需要歸檔的數據被移動到冷存儲。如果數據塊是冷的,則複製使用ARCHIVE.
- Warm -半冷半熱。warm塊的複製內容,部分放置在DISK,其它的在ARCHIVE.
- All_SSD - 所有數據存儲在SSD.
- One_SSD - 一個複製在SSD,其它的在DISK.
- Lazy_Persist -只針對只有一個複製的數據塊,它們被放在RAM_DISK,之後會被寫入DISK。
一個存儲策略,包含以下部分
- Policy ID --策略ID
- Policy name --策略名稱
- A list of storage types for block placement --塊存放的有關存儲類型(可以多個)
- A list of fallback storage types for file creation--如果創建失敗的替代存儲類型(可以多個)
- A list of fallback storage types for replication--如果複製失敗的替代存儲類型(可以多個)
當有足夠空間的時候,塊複製使用下表中第三列所列出的存儲類型。
如果第三列的空間不夠,則考慮用第四列的(創建的時候)或者第五列的(複製的時候)
Policy ID | Policy Name | Block Placement (n replicas) | Fallback storages for creation | Fallback storages for replication |
---|---|---|---|---|
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 | DISK: 1, ARCHIVE: n-1 | ARCHIVE, DISK | ARCHIVE, DISK |
2 | Cold | ARCHIVE: n | <none> | <none> |
註意LAZY_PERSIST策略只用於複製一個塊(換言之,沒有數據冗餘)。
譯註:原文的意思是如果數據一部分在RAM_DISK,一部分在磁碟上,不會提高性能,所以只能用於一個複製的情況。本人不太理解。不過原文這麼說,就先這麼記著吧。
存儲策略的解析
當創建文件/目錄的時候,並未為它們設定了存儲策略。 但可以通過hdfs storagepolicies命令來管理。
文件/路徑的存儲策略按照如下規則解析:
-
如果有設定特定的策略,那麼就是那個策略
-
如果沒有設定,就返回上級目錄的存儲策略。如果是沒有策略的根目錄,那麼返回預設的存儲策略(hot-編號7的)。
配置
- dfs.storage.policy.enabled - 啟用/關閉存儲策略特性。預設是true(開啟)
-
dfs.datanode.data.dir - 數據路徑,多個以逗號分隔,但必須在前面帶上存儲類型。例如:
- A datanode storage location /grid/dn/disk0 on DISK should be configured with [DISK]file:///grid/dn/disk0
- A datanode storage location /grid/dn/ssd0 on SSD can should configured with [SSD]file:///grid/dn/ssd0
- A datanode storage location /grid/dn/archive0 on ARCHIVE should be configured with [ARCHIVE]file:///grid/dn/archive0
- A datanode storage location /grid/dn/ram0 on RAM_DISK should be configured with [RAM_DISK]file:///grid/dn/ram0
如果沒有設定存儲類型,那麼使用預設的([DISK])
譯註:例如DN1有兩個存儲類型 [DISK]file:///grid/dn/disk0,[SSD]file:///grid/dn/ssd0
每個節點可以具體配置,不需要都一樣。當然如果都一樣,可以稍微提升系統的性能。
3.MOVER-一個新的數據遷移工具
這個工具用戶歸檔數據,它類似於Balancer(移動數據方面)。MOVER定期掃描HDFS文件,檢查文件的存放是否符合它自身的存儲策略。如果數據塊不符合自己的策略,它會把數據移動到該去的地方。
語法
hdfs mover [-p <files/dirs> | -f <local file name>]
-p 指定要遷移的文件/目錄,多個以空格分隔
-f 指定本地一個文件路徑,該文件列出了需要遷移的文件或者目錄(一個一行)
如果不指定參數,那麼就移動根目錄。
4.存儲策略命令
列出所有存儲策略
hdfs storagepolicies -listPolicies
設置存儲策略
hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>
例如 hdfs storagepolicies -setStoragePolicy -path /tmp -policy ALL_SSD
取消存儲策略
hdfs storagepolicies -unsetStoragePolicy -path <path>
之後該目錄或者文件,以其上級的目錄為準,如果是根目錄,那麼就是HOT
獲取存取策略
hdfs storagepolicies -getStoragePolicy -path <path>
---
譯註:如果你的項目很有錢,不放可以把一些不是太大的數據放在ALL_SSD中,例如個數據節點上放個10t。甚至如果有更多錢,可以組成ssd raid。