Hadoop
允许将不是热数据或者活跃数据的数据分配到比较便宜的存储上,用于归档或冷存储。可以设置存储策略,将较旧的数据从昂贵的高性能存储上转移到性价比较低(较便宜)的存储设备上。
Hadoop 2.5
及以上版本都支持存储策略,在该策略下,不仅可以在默认的传统磁盘上存储HDFS
数据,还可以在SSD
(固态硬盘)上存储数据。
异构存储
异构存储是Hadoop2.6.0
版本出现的新特性,可以根据各个存储介质读写特性不同进行选择。例如冷热数据的存储,对冷数据采取容量大,读写性能不高的存储介质如机械硬盘,对于热数据,可使用SSD
硬盘存储。在读写效率上性能差距大。异构特性允许我们对不同文件选择不同的存储介质进行保存,以实现机器性能的最大化。
HDFS中4种异构存储类型
如何让HDFS知道集群中的数据存储目录是哪种类型存储介质
配置属性时主动声明。HDFS并没有自动检测的能力。例如配置:dfs.datanode.data.dir = [SSD]file:///data/hadoop
如果目录前没有带上[SSD] [DISK] [ARCHIVE] [RAM_DISK]
这4种类型中的任何一种,则默认是DISK类型 。
块存储类型策略
指的是对HDFS
文件的数据块副本储存。对于数据的存储介质,HDFS
的BlockStoragePolicySuite
类内部定义了6
种策略。HOT(默认策略)、COLD、 WARM、 ALL_SSD、 ONE_SSD、 LAZY_PERSIST
前三种根据冷热数据区分,后三种根据磁盘性质区分,在 HDFS 中可以通过下面指令查看支持的策略:
hdfs storagepolicies -listPolicies
HOT
:用于存储和计算。流行且仍用于处理的数据将保留在此策略中。所有副本都存储在DISK中。
COLD
:仅适用于计算量有限的存储。不再使用的数据或需要归档的数据从热存储移动到冷存储。所有副本都存储在ARCHIVE中。
WARM
:部分热和部分冷。热时,其某些副本存储在DISK中,其余副本存储在ARCHIVE中。
All_SSD
:将所有副本存储在SSD中。
One_SSD
:用于将副本之一存储在SSD中。其余副本存储在DISK中。
Lazy_Persist
:用于在内存中写入具有单个副本的块。首先将副本写入RAM_DISK,然后将其延迟保存在DISK中。
hdfs storagepolicies -setStoragePolicy -path -policy
hdfs storagepolicies -setStoragePolicy -path /had/data -policy WARM
取消存储策略
hdfs storagepolicies -unsetStoragePolicy -path
hdfs storagepolicies -unsetStoragePolicy -path /had/data
查看存储策略
hdfs storagepolicies -getStoragePolicy -path
hdfs storagepolicies -getStoragePolicy -path /had/data
下面通过一个案例来深入了解存储策略,首先配置 DataNode
的存储目录为多个介质类型,如下:
存储目录 | 类型 |
---|---|
file://${hadoop.tmp.dir}/dfs/data | DISK |
file://${hadoop.tmp.dir}/dfs/data/archive | ARCHIVE |
然后在 HDFS 中规划三个目录,分别存 热、温、冷
数据:
目录 | 类型 |
---|---|
hdfs://had/data/hot | 热数据 |
hdfs://had/data/warm | 温数据 |
hdfs://had/data/cold | 冷数据 |
下面开始实施
hdfs-site.xml
文件,增加 DataNode
的存储目录:vi hdfs-site.xml
<property>
<name>dfs.datanode.data.dirname>
<value>[DISK]file://${hadoop.tmp.dir}/dfs/data,[ARCHIVE]file://${hadoop.tmp.dir}/dfs/data/archivevalue>
property>
重启 HDFS 后,到 web 管理页面验证是否生效:
热、温、冷
目录:hadoop fs -mkdir -p /had/data/hot
hadoop fs -mkdir -p /had/data/warm
hadoop fs -mkdir -p /had/data/cold
hdfs storagepolicies -setStoragePolicy -path /had/data/hot -policy HOT
hdfs storagepolicies -setStoragePolicy -path /had/data/warm -policy WARM
hdfs storagepolicies -setStoragePolicy -path /had/data/cold -policy COLD
hdfs storagepolicies -getStoragePolicy -path /had/data/hot
hdfs storagepolicies -getStoragePolicy -path /had/data/warm
hdfs storagepolicies -getStoragePolicy -path /had/data/cold
echo "hello" > test.txt
hadoop fs -put test.txt /had/data/hot
hadoop fs -put test.txt /had/data/warm
hadoop fs -put test.txt /had/data/cold
热数据
文件的 block
位置hdfs fsck /had/data/hot/test.txt -files -blocks -locations
温数据
文件的 block
位置hdfs fsck /had/data/warm/test.txt -files -blocks -locations
可以看到存储在了 DISK
类型的磁盘中,由于我这里就一个 DataNode
节点,所以存在 DISK
中了,如果再来一个,就会看到存在了 ARCHIVE
类型。
冷数据
文件的 block
位置hdfs fsck /had/data/cold/test.txt -files -blocks -locations
当设置为 LAZY PERSIST
类型 DataNode
异步地将内存中数据刷新到磁盘,从而减少代价较高的磁盘IO
操作,注意:该特性从Apache Hadoop 2.6.0开始支持。
mkdir -p /data/tmp
/data/tmp
中的文件,实际存在了内存中mount -t tmpfs -o size=1g tmpfs /data/tmp
hdfs-site.xml
文件,增加存储目录:vi hdfs-site.xml
<property>
<name>dfs.storage.policy.enabledname>
<value>truevalue>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>[DISK]file://${hadoop.tmp.dir}/dfs/data,[ARCHIVE]file://${hadoop.tmp.dir}/dfs/data/archive,[RAM_DISK]file://data/tmpvalue>
property>
<property>
<name>dfs.datanode.max.locked.memoryname>
<value>65536value>
property>
修改后重启 hadoop ,到web管理页面查看是否生效:
hadoop fs -mkdir -p /had/data/lazy/
hdfs storagepolicies -setStoragePolicy -path /had/data/lazy/ -policy LAZY_PERSIST