vlambda博客
学习文章列表

HDFS中的存档存储、SSD 和内存

以下内容均翻译自官方文档.

介绍

存档存储是将不断增长的存储容量与计算容量分离的解决方案。具有更高密度和成本较低的存储且具有低计算能力节点的节点正在变得可用,并可用作集群中的冷存储。根据策略,热数据可以移动到冷存储。向冷存储添加更多节点可以独立于集群中的计算容量来扩展存储。

异构存储和存档存储提供的框架概括了 HDFS 体系结构,包括其他类型的存储介质,包括 SSD 和内存。用户可以选择将其数据存储在 SSD 或内存中,以提供更好的性能。

存储类型和存储策略

存储类型:存档、磁盘、SSD 和RAM_DISK

异构存储 (HDFS-2832) 的第一阶段将数据输入存储模型从单个存储(可能对应于多个物理存储介质)更改为每个存储对应物理存储介质的存储集合。它还添加了存储类型、磁盘和 SSD 的概念,其中 DISK 是默认存储类型。

添加了一种新的存储类型 ARCHIVE,它具有高存储密度(PB 存储),但计算能力很小,用于支持存档存储。

添加了另一种新的RAM_DISK,用于支持在内存中写入单个副本文件。

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

引入了存储策略的新概念,以便根据存储策略将文件存储在不同的存储类型中。

我们有以下存储策略:

  • Hot - 用于存储和计算。流行以及仍然用于处理的数据,将采用此策略。当块是Hot的时,所有副本都存储在 DISK 中。

  • Cold  - 仅适用于计算有限的存储。不再使用的数据或需要存档的数据从Hot存储移动到Cold存储。当块为Cold时,所有副本都存储在存档中。

  • Warm  - 部分Hot和部分Cold。当块是Warm时,其某些副本存储在 DISK 中,其余副本存储在存档中。

  • All_SSD - 用于将所有副本存储在 SSD 中。

  • One_SSD - 用于将其中一个副本存储在 SSD 中。其余副本存储在 DISK 中。

  • Lazy_Persist - 用于写入内存中具有单个副本的块。副本首先以RAM_DISK,然后延迟地保存到 DISK 中。

  • Provided - 用于在 HDFS 之外存储数据。

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

  1. 策略 ID

  2. 策略名称

  3. 用于块放置的存储类型列表

  4. 用于文件创建的回退存储类型列表

  5. 用于复制的回退存储类型列表

当有足够的空间时,块副本将存储在#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策略仅对单个副本块有用。对于具有多个副本的块,所有副本都将写入 DISK,因为仅将其中一个副本写入RAM_DISK不会提高整体性能。

注2:对于具有条带化布局的擦除编码文件,适合的存储策略是All_SSD、Hot、Cold。因此,如果用户为除上述策略以外的条带化 EC 文件设置策略,则在创建或移动块时,它不会遵循该策略。

存储策略解析

创建文件或目录时,其存储策略未指定。可以使用"storagepolicies -setStoragePolicy"命令指定存储策略。文件或目录的有效存储策略通过以下规则解决。

  1. 如果使用存储策略指定文件或目录,请返回它。

  2. 对于未指定的文件或目录,如果是根目录,则返回默认存储策略。否则,返回其父级的有效存储策略。

有效的存储策略可以通过"storagepolicies -getStoragePolicy"命令进行检索。

配置

  • dfs.storage.policy.enabled:用于启用/禁用存储策略功能。默认值为 true。

  • dfs.datanode.data.dir:在每个数据节点上,应使用逗号分隔的存储位置标记其存储类型。这允许存储策略根据策略将块放在不同的存储类型上。例如

    • datanode存储在磁盘上的位置 /grid/dn/disk0 应配置[DISK]文件: ///grid/dn/disk0
    • datanode存储在SSD 上的位置/grid/dn/ssd0 应配置 [SSD] 文件: ///grid/dn/ssd0
    • datanode存储在存档上的位置 /grid/dn/archive0 应配置 [存档] 文件: ///grid/dn/archive0
    • datanode存储在RAM_DISK上的位置 /grid/dn/ram0 应配置[RAM_DISK文件: ///grid/dn/ram0
        如果数据输入存储位置的默认存储类型没有显式标记存储类型,则该存储类型将为 DISK。

基于存储策略的数据移动

在现有文件/目录 上设置新的存储策略将在 Namespace 中更改策略,但不会跨存储介质物理移动块。以下 2 个选项将允许用户根据新策略集移动块。因此,一旦用户更改/设置到文件/目录上的新策略,用户还应执行以下选项之一以实现所需的数据移动。请注意,不能允许两个选项同时运行。

存储策略服务 (SPS)

当用户更改文件/目录上的存储策略时,用户可以调用 HdfsAdmin API satisfyStoragePolicy() 来根据新策略集移动块。运行在Namenode外部的 SPS 工具会定期扫描新策略集和放置的物理块之间的存储是否匹配。这将仅跟踪用户调用 satisfyStoragePolicy 的文件/目录。如果 SPS 标识一些块将会因为某个文件被移动,则它将调度块移动任务到 datanodes。如果在移动中有任何故障,SPS 将重新尝试发送新的块移动任务。

可以在 Namenode 之外作为外部服务启用 SPS,也可以动态禁用,而无需重新启动 Namenode。

详细的设计文档可以在存储策略服务 (SPS) (HDFS-10285) 找到:

  • 注意:当用户调用目录上的satisfyStoragePolicy() API 时,SPS 将扫描所有子目录并考虑所有文件以满足策略。

  • HdfsAdmin API :公共空白满足存储政策 (最终路径) 抛出 IO 例外

  • 参数:

    参数名 说明
    path 需要块存储移动的路径。
配置
  • dfs.storage.policy.satisfier.mode:用于在 NN 外部启用外部服务或禁用 SPS。支持以下字符串值 -external,none。配置external值表示 SPS 已启用,并且没有禁用。默认值为 none。

  • dfs.storage.policy.satisfier.recheck.timeout.millis:从 Datanodes 重新检查已处理的块存储移动命令的超时。

  • dfs.storage.policy.satisfier.self.retry.timeout.millis:如果在此配置的超时中没有从Datanode报告块移动结果,则重试超时。

Mover - 新的数据迁移工具

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

  • 命令:

    hdfs mover [-p | -f ]

  • 参数

    参数名 说明
    -p 指定要迁移的 HDFS 文件/目录 的空格分隔列表。
    -f 指定包含要迁移的 HDFS 文件/目录列表的本地文件。

请注意,当省略 -p 和 -f 选项时,默认路径是根目录。

Administrator notes:

StoragePolicySatisfier和 Mover工具不能同时运行。如果 Mover实例已触发并运行,则启动时将禁用 SPS。在这种情况下,管理员应确保 Mover 执行完成,然后再次启用外部 SPS 服务。同样,当已启用 SPS 时,无法运行 Mover。如果管理员希望显式运行 Mover 工具,则他/她应确保首先禁用 SPS,然后运行 Mover。请查看命令部分,了解如何在 NN 之外启用外部服务或动态禁用 SPS。

存储策略命令

列出存储策略

列出所有存储策略。

  • 命令:

    hdfs storagepolicies -listPolicies

  • 参数:无

设置存储策略

将存储策略设置为文件或目录。

  • 命令:

    hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>

  • 参数

    参数名 说明
    -path <path> 引用目录或文件的路径。
    -policy 存储策略的名称。

取消设置存储策略

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

  • 命令:

    hdfs storagepolicies -unsetStoragePolicy -path

  • 参数

    参数名 说明
    -path <path> 引用目录或文件的路径。

获取存储策略

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

  • 命令:

    hdfs storagepolicies -getStoragePolicy -path

  • 参数

    参数名 说明
    -path <path> 引用目录或文件的路径。

满足存储策略

根据文件/目录的当前存储策略计划要移动的块。

  • 命令:

    hdfs storagepolicies -satisfyStoragePolicy -path

  • 参数

    参数名 说明
    -path <path> 引用目录或文件的路径。

启用NN外部服务或禁用SPS而无需重启Namenode

如果管理员希望在 Namenode 运行时切换 SPS 功能的模式,则首先需要更新配置文件(hdfs-site.xml) 中配置项 dfs.storage.policy.satisfier.mode 的所需值(external or none),然后运行以下 Namenode reconfig 命令.

  • 命令:

    hdfs dfsadmin -reconfig namenode host:ipc_port start

启动外部 SPS 服务

如果管理员想要启动外部 SPS,则首先需要在配置文件(hdfs-site.xml)中配置属性 dfs.storage.policy.satisfier.mode具有external值,然后运行 Namenode reconfig 命令。请确保配置文件中的网络拓扑配置与Namenode相同,此集群将用于匹配目标节点。在此之后,使用以下命令启动外部 SPS 服务。

  • 命令

    hdfs –daemon start sps