1.纠删码

HDFS默认情况下,一个文件存在多个副本,这样提高了数据的可靠性,但是也占用了更多的存储空间。所以,在Hadoop3.x中引入了纠删码,采用计算的方式,牺牲一部分算力,节约大量的存储空间。

* 纠删码相关操作命令

使用命令 hdfs ec 查看纠删码相关的操作命令

[admin@hadoop102 ~]$ hdfs ec
Usage: bin/hdfs ec [COMMAND]
          [-listPolicies]
          [-addPolicies -policyFile <file>]
          [-getPolicy -path <path>]
          [-removePolicy -policy <policy>]
          [-setPolicy -path <path> [-policy <policy>] [-replicate]]
          [-unsetPolicy -path <path>]
          [-listCodecs]
          [-enablePolicy -policy <policy>]
          [-disablePolicy -policy <policy>]
          [-help <command-name>]

命令说明
-listPolicies :查看当前支持的纠删码策略。
-addPolicies :增加纠删码策略
-getPolicy :查看某一路径设置的策略
-removePolicy :删除支持的纠删码策略
-setPolicy :给某一路径设置指定的纠删码策略
-unsetPolicy :取消某一路径设置的策略
-listCodecs :查看支持的策略的编码方式
-enablePolicy :启用某一策略
-disablePolicy :禁用某一策略
-help :查看帮助文档

* 当前支持的纠删码策略

使用命令 hdfs ec -listPolicies 查看当前支持的纠删码策略

[admin@hadoop102 ~]$ hdfs ec -listPolicies
Erasure Coding Policies:
ErasureCodingPolicy=[Name=RS-10-4-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=10, numParityUnits=4]], CellSize=1048576, Id=5], State=DISABLED
ErasureCodingPolicy=[Name=RS-3-2-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=3, numParityUnits=2]], CellSize=1048576, Id=2], State=DISABLED
ErasureCodingPolicy=[Name=RS-6-3-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=6, numParityUnits=3]], CellSize=1048576, Id=1], State=ENABLED
ErasureCodingPolicy=[Name=RS-LEGACY-6-3-1024k, Schema=[ECSchema=[Codec=rs-legacy, numDataUnits=6, numParityUnits=3]], CellSize=1048576, Id=3], State=DISABLED
ErasureCodingPolicy=[Name=XOR-2-1-1024k, Schema=[ECSchema=[Codec=xor, numDataUnits=2, numParityUnits=1]], CellSize=1048576, Id=4], State=DISABLED

策略 RS-6-3-1024k 默认是启用状态的,其他策略都默认是禁用状态。

* 纠删码策略说明

下面以策略 RS-6-3-1024k 为例说明纠删码策略的含义:
(1)RS 是一种编码方式(RS-LEGACY 和 XOR 也是编码方式)。
(2)6-3 表示每6个数据单元,生成3个校验单元,共9个单元。
(3)一共9个单元中(集群至少需要有9个节点),只要有任意6个单元存在(不论是数据单元还是校验单元),就可以通过计算得到原始数据。
(4)1024k 表示每个单元的大小为1024kb。

例如:一个300M大小的文件,使用 RS-6-3-1024k 策略,会被分成300个数据单元,每个数据单元1M,其中每50(300 / 6)个数据单元存储在一个节点,同时会在其他3个节点,生成对应的校验单元(所以,使用该策略的集群最少需要有9个节点)。

* 设置纠删码策略的步骤

纠删码的设置是具体到某一个路径的。所有往此路径下存储的文件,都会执行此策略。

(1)设置纠删码之前要确保想要设置的策略是启用的,若不是启用的,则先执行命令启用策略。例如启用策略 RS-3-2-1024k :

hdfs ec -enablePolicy -policy RS-3-2-1024k

(2)给某一个具体路径设置策略。例如给路径 /input 设置策略 RS-3-2-1024k :

hdfs ec -setPolicy -path /input -policy RS-3-2-1024k

完成。


2.异构存储(冷热数据分离)

异构存储主要解决,不同的数据,存储在不同类型的介质(内存、硬盘)中,达到最佳性能的问题。其中,热数据指经常会被用到的数据,冷数据指不常被用的数据。

* 存储类型

  • RAM_DISK:内存镜像文件系统。
  • SSD:SSD固态硬盘。
  • DISK:普通磁盘,在HDFS中,如果没有主动声明数据目录存储类型默认都是DISK。
  • ARCHIVE:没有特指哪种存储介质,主要的指的是计算能力比较弱而存储密度比较高的存储介质,用来解决数据量的容量扩增的问题,一般用于归档。

* 存储策略

策略id

策略名称

副本分布

副本副本说明

15

Lazy_Persist

RAM_DISK:1,DISK:n-1

一个副本保存在内存RAM_DISK中,其余副本保存在磁盘中。

12

All_SSD

SSD:n

所有副本都保存在SSD中。

10

One_SSD

SSD:1,DISK:n-1

一个副本保存在SSD中,其余副本保存在磁盘中。

7

Hot (default)

DISK:n

所有副本保存在磁盘中,这也是默认的存储策略。

5

Warm

DSIK:1,ARCHIVE:n-1

一个副本保存在磁盘上,其余副本保存在归档存储上。

2

Cold

ARCHIVE:n

所有副本都保存在归档存储上。

注:
表格中的策略从上到下,访问速度由快到慢。

* 异构存储相关的Shell操作

(1)查看当前支持的存储策略

hdfs storagepolicies -listPolicies

(2)为指定路径(数据存储目录)设置指定的存储策略

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

(3)查看指定路径(数据存储目录或文件)的存储策略

hdfs storagepolicies -getStoragePolicy -path <path>

(4)取消存储策略(执行该命令之后该目录或者文件,以其上级的目录为准,如果是根目录,那么就是 HOT)

hdfs storagepolicies -unsetStoragePolicy -path <path>

(5)查看文件块的分布

hdfs fsck <path> -files -blocks -locations

(6)让HDFS根据存储策略移动文件块(改变某一路径的存储策略后,HDFS不会自动移动文件块,需要执行该命令通知HDFS移动)

hdfs mover <path>

(7)查看集群节点

hadoop dfsadmin -report

* 异构存储相关配置

  • 配置文件:hdfs-site.xml
  • 配置参数:

(1)开启存储策略(默认就是开启的)

<property>
  <name>dfs.storage.policy.enabled</name>
  <value>true</value>
</property>

(2)配置DataNode的存储路径,为存储路径指定 [存储类型]。

<property>
    <name>dfs.datanode.data.dir</name>
    <value>[RAM_DISK]file:///opt/module/hadoop-3.1.3/hdfsdata/ram_disk,[SSD]file:///opt/module/hadoop-3.1.3/hdfsdata/ssd,[DISK]file:///opt/module/hadoop-3.1.3/hdfsdata/disk,[ARCHIVE]file:///opt/module/hadoop-3.1.3/hdfsdata/archive</value>
</property>

* 注意事项

(1)往设置存储策略为 COLD 的目录上传文件时,若我们未配置 ARCHIVE 存储路径,则会上传失败,并报出异常。

(2)往设置存储策略为 LAZY_PERSIST 的目录上传文件时,若发现所有副本都存储在 DISK 存储路径中,则原因有如下两点:

  • 当客户端所在的 DataNode 节点没有 RAM_DISK 时,则会写入客户端所在的 DataNode 节点的 DISK磁盘,其余副本会写入其他节点的 DISK 磁盘。
  • 当客户端所在的 DataNode 节点有 RAM_DISK,但 dfs.datanode.max.locked.memory 参数值未设置或者设置过小(小于 dfs.block.size 参数值)时,则会写入客户端所在的 DataNode 节点的 DISK 磁盘,其余副本会写入其他节点的 DISK 磁盘。
    另外,如果是用虚拟机搭建的环境,由于虚拟机的 max locked memory 为 64KB,所以若参数配置过大,还会报以下错误:
ERROR org.apache .hadoop.hdfs.server.datanode.DataNode: Exception in secureMain java.lang.RuntimeException: Cannot start datanode because the configured max locked memory size (dfs.datanode.max.locked.memory) of 209715200 bytes is more than the datanode's available RLIMIT_ MEMLOCK ulimit of 65536 bytes.

可通过命令 ulimit -a 查看 max locked memory 的值。