0%

HDFS 异构存储

HDFS Archival Storage 是 Hadoop-2.6.0 新增的一个特性,是Hadoop异构存储中的一部分


介绍

在大多数Hadoop集群中,随着越来越多的数据被存储更长的时间,对存储的需求已经超过了计算。Hadoop需要一种经济高效且易于管理的解决方案来满足这种存储需求。

Archival Storage 之前的解决方案

  • 删除旧的未使用数据,这是以人工识别筛选不必要数据并手动删除它们的操作成本为代价
  • 将更多节点添加到集群,这是单纯解决存储容量而为群集增加了不必要的计算容量

Hadoop 需要一种解决方案,以使不断增长的存储容量与计算容量脱钩。具有更高密度和价格便宜,计算能力低的存储节点正变得可用,并且可以用作集群中的冷存储。

根据策略,可以将热存储中的数据移至冷存储中。将更多节点添加到冷存储可以独立于群集中的计算容量来扩展存储。

Archival Storage, SSD & Memory

HDFS Archival Storage 是 Hadoop-2.6.0 新增的一个特性,详情请参考HDFS-6584

存储类型

ARCHIVE,DISK,SSD 和 RAM_DISK

异构存储HDFS-2832将数据节点存储模型从单个存储(可能对应于多个物理存储介质)更改为存储的集合,每个存储都对应于一个物理存储介质。还添加了存储类型DISK和SSD的概念,其中DISK是默认存储类型,不填默认是为disk。

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

添加了另一个新的存储类型RAM_DISK,以支持在内存中写入单个副本文件

存储策略

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

  • Hot - 用于存储和计算。流行且仍用于处理的数据将保留在此策略中。块热时,所有副本都存储在DISK中
  • Cold - 仅适用于计算量有限的存储。不再使用的数据或需要归档的数据从热存储移动到冷存储。当块处于冷状态时,所有副本都存储在ARCHIVE中
  • Warm - 部分热和部分冷。当一个块变热时,其某些副本存储在DISK中,其余副本存储在ARCHIVE中。
  • All_SSD - 用于将所有副本存储在SSD中
  • One_SSD - 用于将副本之一存储在SSD中。其余副本存储在DISK中
  • Lazy_Persist - 用于在内存中写入具有单个副本的块。首先将副本写入RAM_DISK,然后将其延迟保存在DISK中

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

  1. 策略编号
  2. 策略名称
  3. 块放置的存储类型列表
  4. 用于文件创建的后备存储类型列表
  5. 用于复制的后备存储类型列表

当有足够的空间时,将根据#3中指定的存储类型列表存储块副本。当列表#3中的某些存储类型空间不足时,在#4和#5中指定的后备存储类型列表将分别用于替换空间不足的存储类型,以用于文件创建和复制

以下是典型的存储策略表

请注意,Lazy_Persist 策略仅对单个副本块更有效果。对于具有多个副本的块,所有副本将被写入DISK,因为仅将一个副本写入RAM_DISK不会提高整体性能。

Lazy_Persist 是从 Apache Hadoop 2.6.0 开始支持,详情参考 HDFS-6581

配置

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

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

A datanode storage location /grid/dn/disk0 on DISK should be configured with [DISK]file:///grid/dn/disk0

A datanode storage location /grid/dn/ssd0 on SSD can should configured with [SSD]file:///grid/dn/ssd0

A datanode storage location /grid/dn/archive0 on ARCHIVE should be configured with [ARCHIVE]file:///grid/dn/archive0

A datanode storage location /grid/dn/ram0 on RAM_DISK should be configured with [RAM_DISK]file:///grid/dn/ram0

修改hdfs-site.xml配置文件,在原路径前增加存储属性,如下

1
2
3
4
<property>
<name>dfs.datanode.data.dir</name>
<value>[ARCHIVE]file:///opt/hadoop/dfs.data</value>
</property>

如果数据节点存储位置的默认存储类型没有显式标记的存储类型,则它将为DISK

目前Hadoop-2.6.0可以配置的存储属性包括[DISK]、[ARCHIVE],Hadoop-2.7.0开始支持[SSD]和[RAM_DISK]

修改完之后重启DataNode,最好两台两台的滚动重启

Mover

一种新的数据迁移工具

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

Command 如下

1
hdfs mover [-p <files/dirs> | -f <local file name>]

-p <文件/目录> 指定以空格分隔的要迁移的HDFS文件/目录列表
-f <本地文件> 指定一个本地文件,其中包含要迁移的HDFS文件/目录的列表

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

1
2
3
4
5
6
7
8
9
10
11
# 列出存储策略
# 列出所有存储策略
hdfs storagepolicies -listPolicies

# 设置存储策略
# 将存储策略设置为文件或目录
hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>

# 获取存储策略
# 获取文件或目录的存储策略
hdfs storagepolicies -getStoragePolicy -path <path>

应用程序的使用

从Apache Hadoop 2.8.0 ,应用程序可以在程序中使用 FileSystem.setStoragePolicy 方法设置存储策略

1
fs.setStoragePolicy(path, "LAZY_PERSIST");

参考链接