异构存储
3.1存储类型:
Storage Type:
RAM_DISK:内存存储类型
SSD:
DISK:硬盘存储类型
ARCHIVE:高密度存储类型
图 HDFS 存储介质类型
3.2 异构存储原理
1.DataNode通过心跳汇报自身数据存储目录的StorageType给NameNode
2.NameNode进行汇总并更新集群内各个节点的存储类型情况
3.待复制文件根据自身设定的存储策略信息向NameNode请求DataNode
1) DataNode 存储目录汇报
图 DataNode存储目录汇报流程图
2) 存储心跳信息的更新处理
图 存储心跳信息更新处理流程图
3) 目标存储介质类型节点的请求
图 获取存储节点的请求
3.3 块存储类型选择策略
BlockStoragePolicy#chooseStorageTypes()
fallback情况,当存储类型不可用时,退一级选择使用的存储类型。
从BlockStoragePolicySuite策略集合中获取策略。
3.4 块策略集合
BlockStoragePolicySuite#createDefaultSuite()
LAZY_PERSIST (RAM_DISK, DISK)
ALL_SSD (SSD)
ONE_SSD (SSD, DISK)
HOT (DISK)
WARN (DISK, ARCHIVE)
COLD (ARCHIVE)
从上往下,速度由快到慢,同一个策略的选择存储类型是:从左往右,只有第一块是第一个位置上的存储策略,其他的是第二个位置上的存储策略。
默认的是HOT存储策略。
3.5 块存储策略的调用
图 异构存储策略总的调用过程
3.6 异构存储策略不足之地
当文件目录存储策略做出变更时不会自动的数据迁移,有两种情况:
- 原先未设置 toragePolicy ,后来进行了设置。
- 原先设置了A策略,后来又设置了B策略。
社区目前已经有相关的 JIRA 在解决这个问题, HDFS-10285 ( Storage
Policy Satisfier in Namenode )
3.7 HDFS 存储策略的使用
hdfs storagepolicies -help
-listPolicies
-getStoragePolicy -path path
-setStoragePolicy -path path -policy poliy
hdfs mover -help
[usage] hdfs mover [-p <files/dirs> | -f <local file>]
案例:
1.上层目录没有设置存储策略,新创建的目录/文件默认是unspecified
2.在已经存在的目录(该目录没有设置过存储策略)上设置存储策略,该目录及其子目录和文件都会继承该存储策略。
3.如果上层目录有设置存储策略,新创建的目录在没有设置存储策略的情况下也会继承该存储策略。(文件上传到设置了存储策略目录下的问题,如错误1)
4.修改已经设置了存储策略的目录,该目录下的文件会自动修改为和目录相同的存储策略;但是该目录的子目录及子目录下的文件不会修改。
5.已经设置存储策略的文件,在移动到已经设置存储策略的目录下时,文件的存储策略会修改为和目录相同的存储策略。
6.文件的存储策略可以设置为和上层目录不同的存储策略。
错误:
- 上传文件到hdfs目录(已设置存储策略)下,报错
put: File /a/a1/a11/a112/a112f1._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and no node(s) are excluded in this operation.
处理方案:先将本地文件上传到没有设置存储策略的目录下,然后移动到有存储策略的目录下。