HDFS 异构存储

介绍

  归档存储(Archival Storage)是一种将不断增长的存储容量和计算容量分离的解决方案。密度更高、存储成本更低、计算能力更低的节点正变得可用,并可在集群中用作冷存储。根据策略,热数据可以移动到冷数据。向冷存储中添加更多的节点可以独立于集群中的计算容量来增加存储。
  异构存储(Heterogeneous Storage)和归档存储(Archival Storage)提供的框架概括了HDFS体系结构,该结构包括其他类型的存储介质,包括SSD和内存。用户可以选择将数据存储在SSD或内存中以获得更好的性能。

存储类型和存储策略

存储类型:ARCHIVE,DISK,SSD 和RAM_DISK

  异构存储(HDFS-2832)的第一阶段是将DataNode的存储模式从一个存储(可能对应多个物理存储介质)更改为一组存储(每个存储对应一个物理存储介质)。它还增加了存储类型、DISK和SSD的概念,其中DISK是默认的存储类型。
  为了支持archival storage,增加了一种新的存储类型 ARICHIVE,该存储类型具有高存储密度(PB)和低计算能力的特性。
  另一种新的存储类型 RAM_DISK 的增加是为了支持在内存中写入单个存储副本文件。

存储策略:Hot,Warm,Cold,All_SSD,One_SSD,Lazy_Persist 和 Provided

引入存储策略的这个新概念,为的是根据存储策略将文件存储在不同的存储类型中。
当前有如下存储策略:

  • Hot - 用于存储和计算。受欢迎且仍用于处理的数据将保留在此策略中。当块处于Hot状态时,所有副本都存储在DISk中。
  • Cold - 仅用于有限计算的存储。不再使用的数据或需要存档的数据从热存储移动到冷存储。当块是Cold状态时,所有副本都存储在ARCHIVE中。
  • Warm - 部分热,部分冷。当块处于热状态时,它的一些副本存储在DISK中,其余的副本存储在ARCHIVE中。
  • All_SSD - 将所有副本存储在SSD中。
  • One_SSD -将其中一个副本存储在SSD中。其余的副本存储在磁盘中。
  • Lazy_Persist -用于在内存中写入具有单个副本的block。副本首先写在RAM_DISK中,然后惰性地持久化到磁盘中。
  • Provided -用于在HDFS之外存储数据。参考 HDFS Provided Storage

  更正式地说,存储策略由以下字段组成:

  • 策略 ID
  • 策略名称
  • 块放置的存储类型列表
  • 文件创建的回退存储类型列表
  • 副本的回退存储类型列表

  当空间足够时,block副本将会按照 #3 中的存储类型列表存放。当 #3 中的某些存储类型的空间不足时,则分别使用 #4 和 #5 中指定的回退存储类型列表来替换空间不足的存储类型以创建和复制文件。
  下面是一个典型的存储策略表:

Policy ID Policy Name Block Placement (n replicas) Fallback storages for creation Fallback storages for replication
15 Lazy_Persist RAM_DISK: 1, DISK: n-1 DISK DISK
12 All_SSD SSD: n DISK DISK
10 One_SSD SSD: 1, DISK: n-1 SSD, DISK SSD, DISK
7 Hot (default) DISK: n <none> ARCHIVE
5 Warm DISK: 1, ARCHIVE: n-1 ARCHIVE, DISK ARCHIVE, DISK
2 Cold ARCHIVE: n <none> <none>
1 Provided PROVIDED: 1, DISK: n-1 PROVIDED, DISK PROVIDED, DISK

  注意1: Lazy_Persist 策略只用于存储单个副本的blocks。对于超过单个副本的block而言,所有的副本都会写入到DISK中,因为只是将其中的一个副本写入到 RAM_DISK 并不会提高整体的性能。
  注意2: 对于striping布局的纠删码化的文件,合适的存储策略是ALL_SSD,Hot,Cold。如果用户对于striped EC 文件设置了上述其他的存储策略,则它不会按照策略来创建和移动block。

存储策略解析

  当一个目录或者文件创建的时候,它的存储策略是未指定的。存储策略可以通过使用 “storagepolicies -setStoragePolicy” 命令来指定。文件或目录的有效存储策略按照以下规则解析:

  1. 如果使用存储策略指定了文件或目录,则返回它。
  2. 对于一个未指定的文件或目录,如果是root目录,返回默认的存储策略。否则返回它的父目录的有效存储策略。

通过“storagepolicies -getStoragePolicy” 命令可以获取有效的存储策略。

配置

  • dfs.storage.policy.enabled - 启用/禁用存储策略特性。默认是true,即启用。
  • dfs.datanode.data.dir - DataNode的数据存储路径,逗号分隔的存储位置使用标记来表示其存储类型 。
    1. 存储位置/grid/dn/disk0,存储类型为DISK,配置为:[DISK]file:///grid/dn/disk0
    2. 存储位置/grid/dn/ssd0,存储类型为SSD,配置为:[SSD]file:///grid/dn/ssd0
    3. 存储位置/grid/dn/archive0,存储类型为ARCHIVE,配置为:[ARCHIVE]file:///grid/dn/archive0
    4. 存储位置/grid/dn/ram0,存储类型为RAM_DISK,配置为:[RAM_DISK]file:///grid/dn/ram0

如果没有显式的标记存储类型,则默认的存储类型是DISK。

Mover——新的数据移动工具

  HDFS添加了一个新的数据迁移工具用于存档数据。该工具类似于Balancer。它定期扫描HDFS中的文件,以检查块位置是否满足存储策略。对于违反存储策略的块,它会将副本移动到不同的存储类型以满足存储策略要求。请注意,只要可能,它总是尝试在同一节点内移动块副本。如果这是不可能的(例如,当一个节点没有目标存储类型时),那么它会通过网络将块副本复制到另一个节点。

hdfs mover [-p <files/dirs> | -f <local file name>]
选项 含义
-p <files/dirs> 指定要迁移的HDFS文件/目录的空间分隔列表。
-f <local file> 指定包含要迁移的HDFS文件/目录列表的本地文件。

  如果 -p 和 -f 选项都省略了,那么默认的路径就是root目录。

存储策略命令

命令帮助信息

$ hdfs storagepolicies -help
[-listPolicies]

List all the existing block storage policies.

[-setStoragePolicy -path <path> -policy <policy>]

Set the storage policy to a file/directory.

<path>    The path of the file/directory to set storage policy 
<policy>  The name of the block storage policy                 

[-getStoragePolicy -path <path>]

Get the storage policy of a file/directory.

<path>  The path of the file/directory for getting the storage policy 

[-unsetStoragePolicy -path <path>]

Unset the storage policy set for a file/directory.

<path>  The path of the file/directory from which the storage policy will be   
        unset.                                                                 

可以看到HDFS storagepolicies 有4个操作:

[-listPolicies]
[-setStoragePolicy -path <path> -policy <policy>]
[-getStoragePolicy -path <path>]
[-unsetStoragePolicy -path <path>]

列出存储策略

列出所有的可用存储策略

hdfs storagepolicies -listPolicies

使用示例

$ 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 -setStoragePolicy -path /data/lib -policy WARM
Set storage policy WARM on /data/lib

获取存储策略

获取文件或目录的存储策略

hdfs storagepolicies -getStoragePolicy -path <path>
选项 含义
-path <path> 目录或文件的路径

使用示例

$ hdfs storagepolicies -getStoragePolicy -path /data/lib
The storage policy of /data/lib:
BlockStoragePolicy{WARM:5, storageTypes=[DISK, ARCHIVE], creationFallbacks=[DISK, ARCHIVE], replicationFallbacks=[DISK, ARCHIVE]}

取消设置存储策略

取消文件或目录的存储策略设置。在unset命令之后,将应用最近祖先的存储策略,如果任何祖先上没有策略,则将应用默认存储策略。

hdfs storagepolicies -unsetStoragePolicy -path <path>
选项 含义
-path <path> 目录或文件的路径

使用示例

$ hdfs storagepolicies -unsetStoragePolicy -path /data/lib 
Unset storage policy from /data/lib
$ hdfs storagepolicies -getStoragePolicy -path /data/lib  
The storage policy of /data/lib is unspecified

参考

https://hadoop.apache.org/docs/r3.1.1/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html
https://blog.csdn.net/androidlushangderen/article/details/51105876

发布了57 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/CPP_MAYIBO/article/details/97691474