HDFS存储策略用于根据数据的访问频率、性能需求、成本限制等因素,定义数据块的存储介质分布(如SSD、DISK、ARCHIVE等)。通过合理设置存储策略,可在数据可靠性、访问性能、存储成本之间实现平衡。
存储策略的实施依赖于DataNode的存储类型定义(即DataNode各存储目录的介质类型)。需在hdfs-site.xml中为每个DataNode的dfs.datanode.data.dir属性配置存储类型,格式为[STORAGE_TYPE]path(STORAGE_TYPE为介质类型,path为存储路径)。
hdfs-site.xml)<property>
<name>dfs.datanode.data.dir</name>
<value>
[DISK]/opt/hadoop/disk1, <!-- 普通磁盘(默认存储类型) -->
[SSD]/opt/hadoop/ssd1, <!-- 固态硬盘(高性能) -->
[ARCHIVE]/opt/hadoop/archive1 <!-- 归档存储(高容量、低性能) -->
</value>
</property>
说明:
DISK:默认存储类型,适用于普通数据;SSD:适用于热数据(高频访问),提供低延迟;ARCHIVE:适用于冷数据(极少访问),成本低但性能低;HDFS内置多种存储策略,核心策略及适用场景如下:
| 策略名称 | 策略ID | 块分布规则 | 适用场景 |
|---|---|---|---|
| HOT(热存储) | 7 | 所有副本存储在DISK介质 |
频繁访问的实时数据(如实时分析、OLTP业务) |
| WARM(温存储) | 5 | 1个副本存储在DISK,其余副本存储在ARCHIVE |
偶尔访问的历史数据(如日志分析、定期备份) |
| COLD(冷存储) | 2 | 所有副本存储在ARCHIVE介质 |
极少访问的归档数据(如法律法规要求的长期保存、灾难恢复) |
| ALL_SSD | 12 | 所有副本存储在SSD介质 |
对性能要求极高的热数据(如高频查询的数仓表、实时推荐系统) |
| ONE_SSD | 10 | 1个副本存储在SSD,其余副本存储在DISK |
需要兼顾性能与成本的场景(如部分热数据的备份) |
| LAZY_PERSIST | 15 | 1个副本存储在RAM_DISK(内存),其余副本异步持久化到DISK |
超高频写入的小文件(如实时日志流),利用内存提升写入性能 |
注意:
LAZY_PERSIST仅适用于单副本文件(多副本文件会将所有副本写入DISK);ALL_SSD、ONE_SSD需要集群中有足够的SSD资源;COLD策略的副本无法参与计算(除非手动迁移至DISK)。确保hdfs-site.xml中dfs.storage.policy.enabled属性设置为true(默认开启):
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
修改后需重启NameNode和DataNode。
使用hdfs storagepolicies命令设置策略,语法如下:
# 设置目录/文件的存储策略
hdfs storagepolicies -setStoragePolicy -path <HDFS_PATH> -policy <POLICY_NAME>
# 示例:将目录设置为WARM策略
hdfs storagepolicies -setStoragePolicy -path /data/history -policy WARM
hdfs storagepolicies -getStoragePolicy -path <HDFS_PATH>
hdfs storagepolicies -listPolicies
若目录已存在数据,设置策略后需使用HDFS Mover工具迁移数据至目标存储介质:
hdfs mover -p <HDFS_PATH>
Mover会自动将数据块迁移至符合策略的存储目录。
SSD、ARCHIVE等介质资源(如ALL_SSD策略需要足够的SSD空间);RAM_DISK(LAZY_PERSIST)虽能提升写入性能,但内存资源有限,需避免过度使用;通过以上步骤,可根据数据特性合理设置HDFS存储策略,优化集群的存储成本与性能。