經常做資料處理的夥伴們肯定會有這樣一種體會:最近一周内的資料會被經常使用到,而比如最近幾周的資料使用率會有下降,每周僅僅被通路幾次;在比如3月以前的資料使用率會大幅下滑,存儲的資料可能一個月才被通路幾次。這就産生了一種熱和冷資料,對需要頻繁通路的資料我們稱之為“熱”資料,反之我們稱之為”冷”資料,而處于中間的資料我們稱之為”溫”資料。在資料被視為公司資産的時代,每個公司基本都會儲存最近數年的資料,而這些資料尤其是冷資料的累積也給存儲平台帶來了甜蜜的負擔。下面就來分享下如何解決這些“負擔”。首先如何定義資料為冷熱資料呢,eBay公司根據資料年齡和使用頻率來定義不失為一種辦法,下圖為eBay關于資料溫度的定義
資料age
使用頻率
溫度
Age < 7天
1天20次
HOT
7 天 > Age < 1 月
1周5次
WARM
1 月 < Age < 3 月
1月5次
COLD
3 月 < Age < 3 年
1年2次
FROZEN
從Hadoop2.6開始,HDFS更好的支援了這種冷熱資料的分離存儲,我們可以按HDFS路徑指定其存儲政策,目前HDFS支援的存儲政策有:HOT、WARM、COLD、All_SSD、One_SSD、Lazy_Persist,我們着重介紹SSD相關的存儲政策,具體如下:
All_SSD - 用于将所有副本存儲在SSD中
One_SSD - 用于将其中一個副本存儲在SSD中。剩餘的副本存儲在DISK中
Lazy_Persist - 用于在記憶體中寫入單個副本的塊。該副本首先寫入RAM_DISK,然後在DISK中延續
1. 如果檔案或目錄特定于存儲政策,則傳回。
2. 對于未指定的檔案或目錄,如果是根目錄,則傳回預設存儲政策。否則,傳回其父級的有效存儲政策。
我們在實踐過程中,因為有一部分實時分析的需求,一部分是曆史資料的儲存,曆史資料很少參與計算,隻需偶爾查詢會用到。那麼對于曆史資料來說,我們可以使用一批計算能力較弱,而硬碟較多、容量較大的SATA盤,而實時分析的場景,需要高性能的計算力和硬碟吞吐能力,我們選用SSD硬碟來支撐,此外HDFS還提供了記憶體存儲類型,但我們的記憶體還是有限,暫未使用到。實際上,我們的每台伺服器的12塊硬碟slot中有3個是SSD,其餘9個是SATA。我們實踐結果表明,使用這種政策的效果比以前好了4倍以上。
要使用存儲政策,我們需要在在每個資料節點上hdfs-site.xml中參數dfs.datanode.data.dir配置的由逗号分隔的存儲位置使用的存儲類型進行标記。例如:
2. 使用[SSD]file:/// dfs/dn來辨別這個存儲位置為SSD硬碟
此外,預設情況下的存儲格式為DISK。
下面介紹設定存儲政策指令:
hdfsstoragepolicies -setStoragePolicy -path <path> -policy <policy>
相應的擷取存儲政策指令為:
總結下:我們可以在一個限定的Hadoop叢集中進行設定不同的磁盤使用不同的存儲政策,還可以利用API将資料存儲到不同的存儲層。HDFS設計的詳細存儲類型和存儲政策如下表,有興趣的同學可以看看:
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
12
All_SSD
SSD: n
10
One_SSD
SSD: 1, DISK: n-1
SSD, DISK
7
Hot (default)
DISK: n
<none>
ARCHIVE
5
Warm
DISK: 1, ARCHIVE: n-1
ARCHIVE, DISK
2
Cold
ARCHIVE: n
注:HDFS新加的ARCHIVE存儲類型, 它是一種支援PB級的高容量存儲但很少的 計算能力,用于歸檔資料使用,從上圖可以看出冷資料适合使用archive存儲類型