企业数据中可分为实时数据、热数据、冷数据、极冷数据,不同的数据在使用频率上存在很大的区别比如实时数据可能是需要实时处理并实施反馈给客户端,而冷数据是不常用可能几周或者几个月才会用到一次。
考虑到上面实际情况,HDFS通过异构存储机制将不同需求或者冷热数据存储到不同的介质中,即兼顾了性能又兼顾了成本。
HDFS异构存储声明了4种存储类型:
RAM_DISK(内存)
SSD(固态硬盘)
DISK(机械硬盘),默认使用
ARCHIVE(高密度存储介质、存储归档历史数据)
异构存储的开启需要通过配置文件主动声明
配置文件:hdfs-site.xml,配置的参数:
<property>
<name>dfs.namenode.name.dir</name>
<value>[SSD]file:/${hadoop.tmp.dir}/dfs/data,[ARCHIVE]file:/${hadoop.tmp.dir}/dfs/data/archive,</value>
</property>
对于数据的存储介质,HDFS的BlockStoragePolicySuite类内部定义了6种策略:
HOT:(默认策略)用于存储和计算。流行的数据,仍然用于处理,将留在此策略中。当块是热的时,所有副本都存储在 DISK 中。
COLD:仅适用于计算有限的存储。不再使用的数据或需要存档的数据从热存储移动到冷存储。当块为冷时,所有副本都存储在存档中。
WARM:部分热和部分冷。当块是暖的时,其某些副本存储在 DISK 中,其余副本存储在存档中。
ALL_SSD:用于将所有副本存储在 SSD 中。
ONE_SSD:用于将其中一个副本存储在 SSD 中。其余副本存储在 DISK 中。
LAYZ_PERSIST:用于写入内存中具有单个副本的块。副本首先写入RAM_DISK中,同时启动异步线程将内存数据持久化到 DISK 中(该异步线程是延时处理的)。
注:前三种根据冷热数据区分,后三种根据磁盘性质区分。
列出所有存储策略命令:
hdfs storagepolicies -listPolicies #命令
Block Storage Policies:
BlockStoragePolicy{PROVIDED:1, storageTypes=[PROVIDED, DISK], creationFallbacks=[PROVIDED, DISK], replicationFallbacks=[PROVIDED, DISK]}
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 storagepolicies -setStoragePolicy -path <path> -policy <policy> #命令
-path <path> 应用目录或文件的路径
-policy <policy> 存储策略的名称
取消存储策略:
hdfs storagepolicies -unsetStoragePolicy -path <path> #命令
在执行unset命令之后,将应用当前目录最近的上级目录的存储策略,如果没有则使用默认的存储策略。
获取存储策略:
hdfs storagepolicies -getStoragePolicy -path <path> #命令
查看不同存储策略文件的block位置:
hdfs fsck <path> -files -blocks -locations #命令
实例:
D:\apache-paas\hadoop-3.1.4\bin>hadoop fs -ls /
Found 1 items
drwxrwxrwx - root supergroup 0 2021-02-02 10:54 /test
D:\apache-paas\hadoop-3.1.4\bin>hdfs storagepolicies -getStoragePolicy -path /test
The storage policy of /test is unspecified
D:\apache-paas\hadoop-3.1.4\bin>hdfs storagepolicies -setStoragePolicy -path /test -policy COLD
Set storage policy COLD on /test
D:\apache-paas\hadoop-3.1.4\bin>hdfs storagepolicies -getStoragePolicy -path /test
The storage policy of /test:
BlockStoragePolicy{COLD:2, storageTypes=[ARCHIVE], creationFallbacks=[], replicationFallbacks=[]}
D:\apache-paas\hadoop-3.1.4\bin>hdfs storagepolicies -setStoragePolicy -path /test -policy HOT
Set storage policy HOT on /test
D:\apache-paas\hadoop-3.1.4\bin>hdfs storagepolicies -getStoragePolicy -path /test
The storage policy of /test:
BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}
D:\apache-paas\hadoop-3.1.4\bin>hdfs storagepolicies -unsetStoragePolicy -path /test
Unset storage policy from /test
D:\apache-paas\hadoop-3.1.4\bin>hdfs storagepolicies -getStoragePolicy -path /test
The storage policy of /test is unspecified
LAYZ_PERSIST设置使用
1、虚拟内存盘配置
mount -t tmpfs -o size=1g tmpfs /mnt/dn-tmpfs/
将tmpfs挂载到目录/mnt/dn-tmpfs/,并限制内存使用大小为1G。
tmpfs,临时文件系统,是一种基于内存的文件系统。tmpfs是最好的基于RAM的文件系统。
2、内存存储介质设置
配置文件:hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>/grid/0,/grid/1,[RAM_DISK]/mnt/dn-tmpfs</value>
</property>
3、参数设置优化
dfs.storage.policy.enabled
是否开启异构存储,默认true开启。
dfs.datanode.max.locked.memory
用于在数据节点上的内存中缓存块副本的内存量(以字节为单位)。默认情况下,此参数设置为0,这将禁用内存中缓存。内存值过小会导致内存中的总的可存储的数据块变少,如果超过DataNode能承受的最大内存,部分内存块会被直接移除。