登 录
注 册
< 大 数 据
Flink
Hadoop
Spark
Hive
HBase
Kafka
其他框架
Kerberos服务介绍与部署
Hadoop HA简介
HDFS手动故障转移
HDFS手动故障转移示例
HDFS自动故障转移
YARN自动故障转移
Hadoop白名单与扩容
HDFS存储优化-纠删码
HDFS冷热存储分离
HDFS慢磁盘监控
HDFS小文件归档
源码分析-NN启动(一)
源码分析-NN启动(二)
源码分析-NN启动(三)
热门推荐>>>
中台架构
中台建设与架构
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
Hadoop
>>
HDFS冷热存储分离
HDFS冷热存储分离
2021-07-25 08:52:32 星期日 阅读:1517
HDFS异构存储也叫冷热数据存储分离,是Hadoop3.x的新特性。 **`异构存储主要解决,不同的数据,存储在不同类型的介质中(内存、HDD、SSD等),以达到最佳性能的问题。目前Hadoop3.x支持HDFS目录级别配置异构存储`** #### 存储类型 Hadoop3.x支持的存储类型有以下几种 | 存储类型 | 说明 | | ------------ | ------------ | | RAM_DISK | 内存镜像文件系统 | | SSD |固态硬盘 | | DISK | 普通磁盘(Hadoop默认存储类型) | | ARCHIVE | 没有特指哪种存储介质,主要指的是计算能力比较弱而存储密度比较高的存储介质,用来解决数据量的容量扩增问题,一般用于归档 | #### 存储策略 Hadoop3.x支持的存储策略有以下几种 `从Lazy_Persist到Cold,设备的访问速度从快到慢` | 策略ID | 策略名称 | 副本分布 | 解释说明 | | ------------ | ------------ | ------------ | ------------ | | 15 | Lazy_Persist | RAM_DISK: 1, DISK: n-1 | 一个副本保存在内存中,其余副本保存在磁盘上 | | 12 | ALL_SSD | SSD: n | 所有副本保存在固态硬盘上 | | 10 | One_SSD | SSD: 1, DISK: n - 1 | 一个副本保存在固态硬盘,其余副本保存在磁盘上 | | 7 | Hot(default) | DISK: n | 所有副本保存在磁盘上 | | 5 | Warm | DISK: 1, ARCHIVE: n - 1 | 一个副本保存在磁盘,其余副本保存在归档存储上 | | 2 | Cold | ARCHIVE: n | 所有副本都保存在归档存储上| #### 存储策略常用shell操作 查看当前有哪些存储策略可以用 ``` hdfs storagepolicies -listPolicies ``` 为指定路径(数据存储目录)设置指定的存储策略 ``` hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx ``` 获取指定路径(数据存储目录或文件)的存储策略 ``` hdfs storagepolicies -getStoragePolicy -path xxx ``` 取消存储策略;执行改命令之后该目录或者文件,以其上级的目录为准,如果是根目录,那么就是HOT ``` hdfs storagepolicies -unsetStoragePolicy -path xxx ``` 查看文件块的分布。该命令可看到指定路径下的每个一个文件块存储在哪台机器上,以及每个块的存储介质是什么 ``` bin/hdfs fsck xxx -files -blocks -locations ``` >[DatanodeInfoWithStorage[192.168.10.104:9866,DS-0b133854-7f9e-48df-939b-5ca6482c5afb,DISK], DatanodeInfoWithStorage[192.168.10.103:9866,DS-ca1bd3b9-d9a5-4101-9f92-3da5f1baa28b,DISK]] #### 存储类型配置 要让Hadoop知道当前服务器都有哪些存储类型,则需要在hdfs-site.xml文件中声明哪些目录是DISK、哪些目录是SSD等。 **`由于在生产环境中,每台DataNode的存储介质可能不尽相同,所以每台节点的hdfs-site.xml文件配置的内容可能不一样`** ```xml <!-- 开启hdfs的存储策略 --> <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,DISK]file:///opt/module/hadoop-3.1.3/hdfsdata/disk,[ARCHIVE]file:///opt/module/hadoop-3.1.3/hdfsdata/archive</value> </property> ``` 注意:修改完需要重启集群才生效 #### 存储策略案例 准备一个文件并上传到hdfs测试路径,这里假设测试路径为/storagetest ``` hadoop fs -put /tmp/notice.txt /storagetest ``` ##### HOT 存储策略(默认) 在未设置存储策略的情况下,上面上传的文件使用的就是此策略,可通过如下命令查看该路径下的存储策略是什么 ``` hdfs storagepolicies -getStoragePolicy -path /storagetest ``` 查看上传的文件块分布 ``` hdfs fsck /hdfsdata-files -blocks -locations ``` >DatanodeInfoWithStorage[192.168.10.104:9866,DS-0b133854-7f9e-48df-939b-5ca6482c5afb,DISK], DatanodeInfoWithStorage[192.168.10.103:9866,DS-ca1bd3b9-d9a5-4101-9f92-3da5f1baa28b,DISK]] 所有的块都在磁盘上 ##### WARM存储策略 修改/storagetest目录下的存储策略为warm ``` hdfs storagepolicies -setStoragePolicy -path /storagetest -policy WARM ``` 使用mover命令触发数据块按照刚才配置的策略移动 ``` hdfs mover /storagetest ``` 再次查看文件块分布 >[DatanodeInfoWithStorage[192.168.10.105:9866,DS-d46d08e1-80c6-4fca-b0a2-4a3dd7ec7459,ARCHIVE], DatanodeInfoWithStorage[192.168.10.103:9866,DS-ca1bd3b9-d9a5-4101-9f92-3da5f1baa28b,DISK]] 可以看到文件块只有一个在磁盘上,另一个再archive上 ##### 其他存储策略 同理,其他存储策略也一样,直接改变policy参数的值即可 ```shell hdfs storagepolicies -setStoragePolicy -path /storagetest -policy COLD hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy One_SSD hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy All_SSD hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy lazy_persist ``` ##### 注意事项 如果存储策略为LAZY_PERSIST时,文件块副本都存储在DISK上,而不是有一个在内存中,原因有如下两点: 1、当客户端所在的DataNode节点没有RAM_DISK时,则会写入客户端所在的DataNode节点的DISK磁盘,其余副本会写入其他节点的DISK磁盘。 2、当客户端所在的DataNode有RAM_DISK,但“dfs.datanode.max.locked.memory”参数值未设置或者设置过小(小于“dfs.block.size”参数值)时,则会写入客户端所在的DataNode节点的DISK磁盘,其余副本会写入其他节点的DISK磁盘。