天天看點

大資料之Hadoop的HDFS存儲優化—異構存儲(冷熱資料分離)

異構存儲主要解決,不同的資料,儲存在不同類型的硬碟中,達到最佳性能的問題

1)存儲類型

RAM_DISK:記憶體鏡像檔案系統

SSD:SSD固态硬碟

DISK:普通磁盤,在HDFS中,如果沒有主動聲明資料目錄儲存類型預設都是DISK

ARCHIVE:沒有特指哪種存儲媒體,主要指的是計算能力比較弱而儲存密度比較高的媒體,用來解決資料容量擴增的問題,一般用于歸檔

原文:sw-code

2)儲存政策

政策ID 政策名稱 副本分布
15 Lazy_Persist RAM_DISK:1, DISK: n-1
12 All_SSD SSD :n
10 One_SSD SSD:1, DISK: n-1
7 Host(default) DISK: n
6 Warm DISK:1, ARCHIVE: n-1
2 Cold ARCHIVE: n

Shell操作

(1)檢視目前有哪些存儲政策可用。原文:sw-code

[hadoop@hadoop102 ~]$ hdfs storagepolicies -listPolicies
           

(2)為指定路徑(資料存儲目錄或檔案)的存儲政策

hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx
           

(3)擷取指定路徑(資料存儲目錄或檔案)的存儲政策

hdfs storagepolicies -getStoragePolicy -path xxx
           

(4)取消政策:執行該指令後該目錄或檔案,及其上級的目錄為準,如果是根目錄,那麼就是HOT

hdfs storagepolicies -unsetStoragePolicy -path xxx
           

(5)檢視檔案塊的分布

hdfs fsck xxx -files -blocks -locations
           

(6)檢視叢集節點

hadoop dfsadmin -report
           

測試環境準備

1)環境描述

伺服器規模:5台

叢集配置:副本數為2,建立好帶有存儲類型的目錄(提前建立)

叢集規劃

節點 存儲類型配置設定
hadoop102 RAM_DISK,SSD
hadoop103 SSD,DISK
hadoop104 DISK,RAM_DISK
hadoop105 ARCHIVE
hadoop106 ARCHIVE

2)配置檔案資訊

(1)為hadoop102節點的

hdfs-site.xml

添加如下資訊

<property>
    <name>dfs.replication</name>
    <value>2</value>
</property>
<property>
    <name>dfs.storage.policy.enabled</name>
    <value>true</value>
</property>
<property>
    <name>dfs.datanode.data.dir</name>
    <value>[SSD]file:///opt/module/hadoop-3.1.3/hdfsdata/ssd,[RAM_DISK]file:///opt/module/hadoop-3.1.3/hdfsdata/ram_disk</value>
</property>
           

(3)為hadoop103節點的

hdfs-site.xml

添加如下資訊

<property>
    <name>dfs.replication</name>
    <value>2</value>
</property>
<property>
    <name>dfs.storage.policy.enabled</name>
    <value>true</value>
</property>
<property>
    <name>dfs.datanode.data.dir</name>
    <value>[SSD]file:///opt/module/hadoop-3.1.3/hdfsdata/ssd,[DISK]file:///opt/module/hadoop-3.1.3/hdfsdata/disk</value>
</property>
           

(4)為hadoop104節點的

hdfs-site.xml

添加如下資訊

<property>
    <name>dfs.replication</name>
    <value>2</value>
</property>
<property>
    <name>dfs.storage.policy.enabled</name>
    <value>true</value>
</property>
<property>
    <name>dfs.datanode.data.dir</name>
    <value>[RAM_DISK]file:///opt/module/hadoop-3.1.3/hdfsdata/ram_disk,[DISK]file:///opt/module/hadoop-3.1.3/hdfsdata/disk</value>
</property>
           

(5)為hadoop105節點的

hdfs-site.xml

添加如下資訊

<property>
    <name>dfs.replication</name>
    <value>2</value>
</property>
<property>
    <name>dfs.storage.policy.enabled</name>
    <value>true</value>
</property>
<property>
    <name>dfs.datanode.data.dir</name>
    <value>[ARCHIVE]file:///opt/module/hadoop-3.1.3/hdfsdata/archive</value>
</property>
           

(6)為hadoop106節點的

hdfs-site.xml

添加如下資訊

<property>
    <name>dfs.replication</name>
    <value>2</value>
</property>
<property>
    <name>dfs.storage.policy.enabled</name>
    <value>true</value>
</property>
<property>
    <name>dfs.datanode.data.dir</name>
    <value>[ARCHIVE]file:///opt/module/hadoop-3.1.3/hdfsdata/archive</value>
</property>
           

3)資料準備

(1)啟動叢集

[hadoop@hadoop102 hadoop-3.1.3]$ hdfs namenode -format
[hadoop@hadoop102 hadoop-3.1.3]$ myhadoop.sh start
           

(2)在HDFS上建立檔案目錄

[hadoop@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /hdfsdata
           

(3)上傳檔案

[hadoop@hadoop102 hadoop-3.1.3]$ hadoop fs -put NOTICE.txt /hdfsdata
           

可在Browsing HDFS檢視檔案資訊

HOT存儲政策案例

(1)最開始我們未設定存儲政策的情況下,我們擷取該目錄的存儲政策

[hadoop@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -getStoragePolicy -path /hdfsdata
The storage policy of /hdfsdata is unspecified
           

(2)檢視上傳的檔案塊分布

[hadoop@hadoop102 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -locations

[DatanodeInfoWithStorage[192.168.10.104:9866,DS-e3ce2615-178f-4489-b58e-27a577f4b72f,DISK], DatanodeInfoWithStorage[192.168.10.103:9866,DS-e8c8d524-7005-4dc4-99ed-30820ff67ef5,DISK]]
           

未設定存儲政策,所有檔案都存儲在DISK下。是以,預設存儲政策為HOT。

WARM存儲政策測試

(1)接下來為資料降溫

[hadoop@hadoop102 ~]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy WARM
           

(2)再次檢視檔案塊分布,我們可以看到檔案塊依然放在原處

[hdoop@hadoop102 ~]$ hdfs fsck /hdfsdata -files -blocks -locations
           

(3)我們需要讓他HDFS按照存儲政策自行移動檔案夾

[hadoop@hadoop102 ~]$ hdfs mover /hdfsdata
           

(4)再次檢視檔案塊分布

[hdoop@hadoop102 ~]$ hdfs fsck /hdfsdata -files -blocks -locations

[DatanodeInfoWithStorage[192.168.10.106:9866,DS-a417ad5b-f80a-4f8c-a500-d6d5a6c52d6d,ARCHIVE], DatanodeInfoWithStorage[192.168.10.103:9866,DS-e8c8d524-7005-4dc4-99ed-30820ff67ef5,DISK]]
           

檔案一半在DISK,一半在ARCHIVE,符合我們設定的WARM政策

COLD政策測試

(1)繼續降溫為clod

[hadoop@hadoop102 ~]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy COLD
           

注意:當我們将目錄設定為COLD并且我們未配置ARCHIVE存儲目錄的情況下,不可以直接向該目錄直接上傳檔案,會報出異常。

(2)手動轉移

[hadoop@hadoop102 ~]$ hdfs mover /hdfsdata
           

(3)檢查檔案快分布

[hdoop@hadoop102 ~]$ hdfs fsck /hdfsdata -files -blocks -locations

[DatanodeInfoWithStorage[192.168.10.106:9866,DS-a417ad5b-f80a-4f8c-a500-d6d5a6c52d6d,ARCHIVE], DatanodeInfoWithStorage[192.168.10.105:9866,DS-1c17f839-d8f5-4ca2-aa4c-eaebbdd7c638,ARCHIVE]]
           

ONE_SSD政策測試

(1)更改政策為ONE_SSD

[hadoop@hadoop102 ~]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy ONE_SSD
           

(2)手動轉移

[hadoop@hadoop102 ~]$ hdfs mover /hdfsdata
           

(3)檢查檔案快分布

[hdoop@hadoop102 ~]$ hdfs fsck /hdfsdata -files -blocks -locations

[DatanodeInfoWithStorage[192.168.10.104:9866,DS-e3ce2615-178f-4489-b58e-27a577f4b72f,DISK], DatanodeInfoWithStorage[192.168.10.103:9866,DS-0a858711-8264-4152-887a-9408e2f83c3a,SSD]]
           

ALL_SSD政策測試

(1)更改政策為ALL_SSD

[hadoop@hadoop102 ~]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy ALL_SSD
           

(2)手動轉移

[hadoop@hadoop102 ~]$ hdfs mover /hdfsdata
           

(3)檢查檔案快分布

[hdoop@hadoop102 ~]$ hdfs fsck /hdfsdata -files -blocks -locations

[DatanodeInfoWithStorage[192.168.10.102:9866,DS-b4a0eba9-0335-409a-aab5-2ebfe724fe0a,SSD], DatanodeInfoWithStorage[192.168.10.103:9866,DS-0a858711-8264-4152-887a-9408e2f83c3a,SSD]]
           

LAZY_PERSIST政策測試

(1)更改政策為LAZY_PERSIST

[hadoop@hadoop102 ~]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy LAZY_PERSIST
           

(2)手動轉移

[hadoop@hadoop102 ~]$ hdfs mover /hdfsdata
           

(3)檢查檔案快分布

[hdoop@hadoop102 ~]$ hdfs fsck /hdfsdata -files -blocks -locations

[DatanodeInfoWithStorage[192.168.10.104:9866,DS-e3ce2615-178f-4489-b58e-27a577f4b72f,DISK], DatanodeInfoWithStorage[192.168.10.103:9866,DS-e8c8d524-7005-4dc4-99ed-30820ff67ef5,DISK]]
           

檔案塊都存儲在了DISK中,與預期的不一樣,這是因為,還需要配置

dfs.datanode.max.locked.memory

dfs.block.size

參數。

當存儲政策為LAZY_PERSIST時,檔案塊副本都存儲在DISK上的原因有如下兩點:

(1)當用戶端所在節點沒有RAM_DISK時,則會寫入用戶端所在的DataNode節點的DISK磁盤。其餘副本會寫入其他節點的DISK磁盤。

(2)當用戶端所在的DataNode有RAM_DISK時,但

dfs.datanode.max.locked.memory

參數未設定或設定過小(小于

dfs.block.size

參數值)時,則會寫入用戶端所在的DataNode節點的DISK磁盤,其餘會寫入其他節點的DISK磁盤。

但是由于虛拟機的

max locked memory

為64KB,是以如果參數配置過大,會報錯

我們可以通過該指令檢視此參數的記憶體

[hadoop@hadoop102 ~]$ ulimit -a

max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited

           

本文來自部落格園,作者:sw-code,轉載請注明原文連結:https://www.cnblogs.com/sw-code/p/16391434.html

繼續閱讀