配额与存储策略
文章目录
- 配额与存储策略
- 配额
- Name Quotas
- Space Quotas
- Storage Type Quotas
- 管理命令
- Reporting 命令
- 档案存储
- 存储类型与存储策略
- 存储类型: ARCHIVE, DISK, SSD and RAM_DISK
- 存储策略: Hot, Warm, Cold, All_SSD, One_SSD, Lazy_Persist and Provided
- 存储策略的生效机制
- 相关配置
- 基于存储策略的数据移动
- Storage Policy Satisfier (SPS)
- 相关配置:
- Mover工具
- 注意点:
- 存储策略命令
- 查询策略列表
- 配置存储策略
- 解除存储策略
- 查询存储策略
- Satisfy Storage Policy
- 在NN之外启用外部服务或在不重启Namenode的情况下禁用SPS
- 启动外部SPS服务。
配额
Hadoop 分布式文件系统 (HDFS) 允许管理员为各个目录使用的名称数量和空间容量设置配额。 名称配额和空间配额分别独立控制,但两类配额的管理和实施可以紧密并行。
Name Quotas
目录下文件与目录数量的配额限制。
名称配额是对以该目录为根的树中文件和目录名称数量的硬性限制。 如果超出配额,文件和目录创建将失败。 配额与重命名的目录保持一致; 如果重命名操作会导致配额违规,则重命名操作将失败。 即使目录违反了新的配额,设置配额的尝试仍然会成功。 新创建的目录没有关联的配额。 最大配额是Long.Max_Value
。 配额为 1 会强制目录保持为空。(目录本身占用配额!)
配额与 fsimage 保持一致。 启动时,如果 fsimage 立即违反配额(可能 fsimage 被秘密修改),则会针对每次此类违规打印一条警告。 设置或删除配额会创建日记条目。
Space Quotas
对目录下的全部文件的存储大小做配额管理,与块相关,若剩余容量不足支撑一个完整的块,则无法新建一个块。
空间配额是对以该目录为根的树中的文件使用的字节数的硬性限制。 如果配额不允许写入完整块,则块分配会失败。 块的每个副本都会计入配额。 配额与重命名的目录保持一致; 如果重命名操作会导致配额违规,则该操作将失败。 新创建的目录没有关联的配额。 最大配额是Long.Max_Value
。 配额为零仍允许创建文件,但不能向文件添加任何块。 目录不使用主机文件系统空间,也不计入空间配额。 用于保存文件元数据的主机文件系统空间不计入配额。 配额按文件的预期复制因子收费; 更改文件的复制因子将贷记或借记配额。
配额与 fsimage 保持一致。 启动时,如果 fsimage 立即违反配额(可能 fsimage 被篡改),则会针对每次此类违规打印一条警告。 设置或删除配额会创建日记条目。
Storage Type Quotas
存储类型配额是对以目录为根的树中的文件使用特定存储类型(SSD、DISK、ARCHIVE)的硬性限制。 它在许多方面与存储空间配额类似,但提供对集群存储空间使用的细粒度控制。 要对目录设置存储类型配额,必须在目录上配置存储策略,以便允许文件根据存储策略存储在不同的存储类型中。 有关更多信息,请参阅 HDFS 存储策略文档。
存储类型配额可以与空间配额、名称配额相结合,有效管理集群存储使用情况。 例如,
- 对于配置了存储策略的目录,管理员应为资源受限存储类型(例如 SSD)设置存储类型配额,并为其他存储类型和整体空间配额保留限制较少的值或默认无限制。 HDFS将根据存储策略和总体空间配额从两种目标存储类型中扣除配额。
- 对于没有配置存储策略的目录,管理员不应配置存储类型配额。 即使特定存储类型不可用(或可用但未正确配置存储类型信息),也可以配置存储类型配额。 但是,在这种情况下,建议使用总体空间配额,因为存储类型信息对于存储类型配额实施不可用或不准确。
- DISK 上的存储类型配额的用途有限,除非 DISK 不是主要存储介质。 (例如,主要具有 ARCHIVE 存储的集群)。
管理命令
配额由一组仅管理员可用的命令进行管理。
-
hdfs dfsadmin -setQuota <N> <directory>...<directory>
将每个目录的名称配额设置为 N。 如果 N 不是正长整数、目录不存在或者是文件,或者目录将立即超出新的配额,则报告错误。
-
hdfs dfsadmin -clrQuota <directory>...<directory>
清空目录的任何名称配额。 如果该目录不存在或者是一个文件,则会报告错误。 如果目录没有配额,也不是故障。
-
hdfs dfsadmin -setSpaceQuota <N> <directory>...<directory>
将每个目录的空间配额设置为 N 字节。 这是对目录树下所有文件的总大小的硬性限制。 空间配额包含了所有的副本,即复制 3 次的 1 GB 数据消耗 3 GB 配额。 为了方便起见,N 也可以用二进制前缀指定,例如 50g 表示 50 GB,2t 表示 2 TB 等。如果 N 既不是零也不是正整数,目录不存在或者是文件,或者目录将立即超出新配额,则报告错误 。
-
hdfs dfsadmin -clrSpaceQuota <directory>...<directory>
删除每个目录的任何空间配额。如果该目录不存在或者是一个文件,则会报告错误。 如果目录没有配额,也不是故障。
-
hdfs dfsadmin -setSpaceQuota <N> -storageType <storagetype> <directory>...<directory>
将存储类型配额设置为为每个目录指定的存储类型的N个字节。 这是对目录树下所有文件的总存储类型使用量的硬性限制。 存储类型配额使用情况反映了基于存储策略的预期使用情况。 例如,1 GB 数据,复制数为 3,且
ALL_SSD
存储策略将消耗 3 GB SSD 配额。 为了方便起见,N 也可以用二进制前缀指定,例如 50g 表示 50 GB,2t 表示 2 TB 等。如果 N 既不是零也不是正整数,目录不存在或者是文件,或者目录将立即超出新配额,则报告错误 。 当指定-storageType
选项时,会设置特定于存储类型的配额。 可用的存储类型有 DISK、SSD、ARCHIVE、PROVIDED。 -
hdfs dfsadmin -clrSpaceQuota -storageType <storagetype> <directory>...<directory>
删除为每个目录指定的存储类型配额。如果该目录不存在或者是一个文件,则会报告错误。 如果目录没有指定存储类型的存储类型配额,则不是故障。 指定
-storageType
选项时,将清除特定于存储类型的配额。 可用的存储类型有DISK
、SSD
、ARCHIVE
、PROVIDED
。
Reporting 命令
HDFS shell 的 count 命令的扩展报告配额值以及当前使用的名称和字节数。
-
hadoop fs -count -q [-h] [-v] [-t [comma-separated list of storagetypes]] <directory>...<directory>
使用 -q 选项,还可以报告为每个目录设置的名称配额值、剩余的可用名称配额、设置的空间配额值以及剩余的可用空间配额。 如果目录没有设置配额,则报告值为“none”和“inf”。 -h 选项以人类可读的格式显示大小。 -v 选项显示标题行。 -t 选项显示每个存储类型的配额集以及每个目录剩余的可用配额。 如果在-t选项后给出了特定的存储类型,则仅显示指定类型的配额和剩余配额。 否则,将显示所有支持配额的存储类型的配额和剩余配额。
档案存储
存算分离的一种方案。读取频率低的数据存入冷节点。
档案存储是一种将不断增长的存储容量与计算容量分离的解决方案。 具有较高密度和较低计算能力的较便宜存储的节点正在变得可用,并且可以用作集群中的冷存储。 根据策略,可以将热数据移至冷数据。 向冷存储添加更多节点可以独立于集群中的计算容量来增加存储。
异构存储和档案存储提供的框架概括了 HDFS 架构,以包括其他类型的存储介质,包括 SSD 和 内存。 用户可以选择将数据存储在SSD或内存中以获得更好的性能。
存储类型与存储策略
存储类型: ARCHIVE, DISK, SSD and RAM_DISK
异构存储(HDFS-2832)第一阶段改变了datanode存储模型,从单一存储,可能对应多个物理存储介质, 存储的集合,每个存储对应一个物理存储介质。 它还添加了存储类型 DISK 和 SSD 的概念,其中 DISK 是默认存储类型。在版本2.3.0开始支持。
添加了新的存储类型ARCHIVE,它具有高存储密度(PB 级存储)但计算能力较低,用于支持归档存储。
添加了另一个新的存储类型RAM_DISK,用于支持在内存中写入单个副本文件。
存储介质有:机械硬盘、固态硬盘、闪存,那ARCHIVE使用哪种存储介质?高密度低成本存储介质?有哪些?
存储策略: Hot, Warm, Cold, All_SSD, One_SSD, Lazy_Persist and Provided
引入了存储策略的新概念,以便允许文件根据存储策略存储在不同的存储类型中。
我们有以下存储政策:
- Hot - 用于存储和计算。 极其常用且仍在用于处理的数据将保留在此策略中。 当一个块是热块时,所有副本都存储在 DISK 中。
- Cold - 仅适用于计算有限的存储。 不再使用的数据或需要归档的数据从热存储移至冷存储。 当块是冷块时,所有副本都存储在 ARCHIVE 中。
- Warm - 部分热,部分冷。 当块处于热状态时,其一些副本存储在 DISK 中,其余副本存储在 ARCHIVE 中。
- All_SSD - 用于将所有副本存储在 SSD 中。
- One_SSD - 用于将副本之一存储在 SSD 中。 剩余的副本存储在 DISK 中。
- Lazy_Persist - 用于在内存中写入具有单个副本的块。 副本首先写入 RAM_DISK,然后延迟保留在 DISK 中。
- Provided - 用于在 HDFS 外部存储数据。 另请参阅HDFS 提供的存储。是 HDFS 中的一项实验性功能。
存储策略由以下字段组成:
- Policy ID
- Policy name
- 用于块放置的存储类型列表
- 用于文件创建的后备存储类型列表
- 用于复制的后备存储类型列表
当有足够的空间时,块副本将根据#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 | ARCHIVE | |
5 | Warm | DISK: 1, ARCHIVE: n-1 | ARCHIVE, DISK | ARCHIVE, DISK |
2 | Cold | ARCHIVE: n | ||
1 | Provided | PROVIDED: 1, DISK: n-1 | PROVIDED, DISK | PROVIDED, DISK |
注 1:Lazy_Persist
策略仅对单个副本块有用。 对于具有多个副本的块,所有副本都将写入 DISK,因为仅将其中一个副本写入 RAM_DISK 不会提高整体性能。
注2:对于stripe布局的纠删码文件,合适的存储策略为All_SSD、Hot、Cold。 因此,如果用户为stripe EC文件设置了除上述策略之外的策略,则在创建或移动块时将不会遵循该策略。
存储策略的生效机制
创建文件或目录时,其存储策略是未指定。 可以使用“storagepolicies -setStoragePolicy
”命令指定存储策略。 文件或目录的有效存储策略由以下规则决定。
- 如果文件或目录指定了存储策略,则应用这个策略。
- 对于未指定的文件或目录,如果是根目录,则返回默认存储策略。 否则,返回其父级的有效存储策略。
有效的存储策略可以通过“storagepolicies -getStoragePolicy
”命令检索 。
相关配置
-
dfs.storage.policy.enabled - 用于启用/禁用存储策略功能。 默认值为
true
。 -
dfs.datanode.data.dir - 在每个数据节点上,逗号分隔的存储位置应标有其存储类型。 这允许存储策略根据策略将块放置在不同的存储类型上。 例如:
- DISK 上的 datanode 存储位置 /grid/dn/disk0 应配置为
[DISK]file:///grid/dn/disk0
- SSD 上的数据节点存储位置 /grid/dn/ssd0 可以配置为
[SSD]file:///grid/dn/ssd0
- ARCHIVE 上的 datanode 存储位置 /grid/dn/archive0 应配置为
[ARCHIVE]file:///grid/dn/archive0
- RAM_DISK 上的 datanode 存储位置 /grid/dn/ram0 应配置为
[RAM_DISK]file:///grid/dn/ram0
如果数据节点存储位置没有显式标记的存储类型,则其默认存储类型将为
DISK
。 - DISK 上的 datanode 存储位置 /grid/dn/disk0 应配置为
基于存储策略的数据移动
在现有文件/目录上设置新的存储策略将更改命名空间中的策略,但不会跨存储介质物理移动块。 以下 2 个选项将允许用户根据新的策略集移动块。 因此,一旦用户更改/设置文件/目录的新策略,用户还应该执行以下选项之一以实现所需的数据移动。 请注意,两个选项不能同时运行。
Storage Policy Satisfier (SPS)
当用户更改文件/目录的存储策略时,用户可以调用 HdfsAdmin
API satisfyStoragePolicy()
来根据新策略集移动块。 在 namenode 外部运行的 SPS 工具会定期扫描新策略集与放置的物理块之间的存储不匹配情况。 这只会跟踪用户调用 SaturationStoragePolicy 的文件/目录。 如果SPS识别出某个文件需要移动一些块,那么它将把块移动任务调度到数据节点。 如果移动失败,SPS将通过发送新的块移动任务来重新尝试。
SPS 可以作为 Namenode 的外部服务启用,也可以在不重新启动 Namenode 的情况下动态禁用。
详细的设计文档可以在存储策略满足(SPS) (HDFS-10285)中找到
- 注意:当用户在目录上调用
satisfyStoragePolicy()
API 时,SPS 将扫描所有子目录并考虑所有文件是否满足策略。 - HdfsAdmin API:
public void SaturationStoragePolicy(final Path pat)抛出 IOException
- 参数:
path
:需要块存储移动的路径。
相关配置:
- dfs.storage.policy.satisfier.mode - 用于启用 NN 外部的外部服务或禁用 SPS。 支持以下字符串值 -
external
、none
。 配置external
值表示启用 SPS,none
表示禁用。 默认值为none
。 - dfs.storage.policy.satisfier.recheck.timeout.millis - 重新检查来自数据节点的已处理块存储移动命令的超时时长。
- dfs.storage.policy.satisfier.self.retry.timeout.millis - 如果在此配置的超时时间内 Datanode 没有报告块移动结果,则重试超时。
Mover工具
添加了新的数据迁移工具用于归档数据。 该工具类似于Balancer。 它定期扫描HDFS中的文件以检查块放置是否满足存储策略。 对于违反存储策略的块,它将副本移动到不同的存储类型以满足存储策略要求。 请注意,只要有可能,它总是尝试在同一节点内移动块副本。 如果这是不可能的(例如,当节点没有目标存储类型时),那么它将通过网络将块副本复制到另一个节点。
-
命令:
hdfs mover [-p <files/dirs> | -f <local file name>]
-
参数:
-p <files/dirs>
:指定一个以空格分隔的要迁移的HDFS文件/目录的列表。-f <local file>
:指定一个包含要迁移的HDFS文件/目录列表的本地文件。
请注意,当 -p 和 -f 选项均省略时,默认路径为根目录。
注意点:
StoragePolicySatisfier
和 Mover tool
不能同时运行。 如果 Mover 实例已触发并正在运行,SPS 将在启动时禁用。 在这种情况下,管理员应确保 Mover 执行完成,然后再次启用外部 SPS 服务。 同样,当 SPS 已启用时,Mover 无法运行。 如果管理员希望显式运行 Mover 工具,那么他/她应确保首先禁用 SPS,然后再运行 Mover。 请查看命令部分以了解如何启用 NN 外部的外部服务或动态禁用 SPS。
存储策略命令
查询策略列表
-
Command:
hdfs storagepolicies -listPolicies
配置存储策略
-
Command:
hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>
-
参数:
-path <path>
:指的是一个目录或一个文件的路径。-policy <policy>
:存储策略的名称。
解除存储策略
取消对一个文件或目录的存储策略。在unset命令之后,最近的上级目录的存储策略将被应用,如果任何上级目录上没有策略,那么默认的存储策略将被应用。
-
Command:
hdfs storagepolicies -unsetStoragePolicy -path <path>
-
参数:
-path <path>
:指的是一个目录或一个文件的路径。
查询存储策略
查询对一个文件或目录的存储策略。
-
Command:
hdfs storagepolicies -getStoragePolicy -path <path>
-
参数:
-path <path>
:指的是一个目录或一个文件的路径。
Satisfy Storage Policy
根据文件/目录的当前存储策略,安排块的移动。
-
Command:
hdfs storagepolicies -satisfyStoragePolicy -path <path>
-
参数:
-path <path>
:指的是一个目录或一个文件的路径。
在NN之外启用外部服务或在不重启Namenode的情况下禁用SPS
如果管理员想在 Namenode 运行时切换 SPS 功能的模式,首先他/她需要更新配置文件(hdfs-site.xml
)中dfs.storage.policy.satisfier.mode
的配置项的预期值(外部或无),然后运行以下 Namenode 重新配置命令:
-
Command:
hdfs dfsadmin -reconfig namenode [host:ipc_port](host:ipc_port) start
启动外部SPS服务。
如果管理员想启动外部 sps,首先需要在配置文件(hdfs-site.xml
)中用external
值配置属性dfs.storage.policy.satisfier.mode
,然后运行 Namenode reconfig
命令。请确保配置文件中的网络拓扑配置与 namenode 相同,这个集群将用于匹配目标节点。在这之后,使用以下命令启动外部 sps 服务
-
Command:
hdfs –daemon start sps