HDFS的Federation机制提高存储能力及读写性能的实现原理和Erasure Coding节省存储空间的原理

Federation机制的实现原理

HDFS提供了一种Federation(联邦)机制,该机制允许单个HDFS存在多个NameNode,从而不仅解决了HDFS的存储能力受单个NameNode的内存限制问题,而且可以提高HDFS读写数据效率。

1.HDFS的分层图解

在单个NameNode节点的HDFS中,HDFS一共分为两层。NameSpace层和Block Storage层。

在这里插入图片描述

(1)NameSpace

NameSpace是HDFS文件系统的命名空间,它主要由目录、文件和Block组成,支持所有与命名空间相关的文件系统操作,如创建、删除、修改和列出文件和目录。NameSpace由NameNode负责管理维护,任何对NameSpace的操作都将被NameNode记录下来。

(2)Block Storage

Block Storage(数据块存储)主要用于管理和存储HDFS的Block,由Block Management(数据块管理器)和Storage(物理存储)两部分组成,有关这两部分的介绍如下。

1)Block Management

Block Management由NameNode负责管理,它主要包含以下几点功能:

  • 通过控制注册和定期的心跳来保证DataNode正常运行。
  • 处理Block的报告并维护Block的位置。
  • 支持与Block相关的操作。
  • 管理Block的副本,针对未完成复制的Block进行复制,并删除过度复制的Block。
2)Storage

Storage由DataNode负责管理,它可以在本地文件系统上存储Block,并且提供对Block进行读写的操作。

为了横向扩展NameSpace,Federation机制使用多个独立的NameNode,每个NameNode是相互独立的,各自管理自己的NameSpace,且不需要互相协调。DataNode要向所有NameNode注册,且周期性地向所有NameNode发送心跳信息和Block状态报告,并执行来着所有NameNode的命令。

Federation功能图解

  • HDFS包含多个NameNode。

  • Block Pool主要负责管理对应NameSpace的Block。

  • 一个NameSpace和对应的Block Pool被称为命名空间卷,它是一个独立的管理单元。
    在这里插入图片描述
    由上图可知,应用Federation机制的HDFS包含多个NameNode,每个NameNode都有自己的NameSpace,每个NameSpace对应一个Block Pool(数据块池)。Block Pool主要负责管理对应NameSpace的Block,每个Block Pool都是独立管理的,不会与其他Block Pool进行交互。不过,DataNode会存储所有Block Pool管理的Block,这样即使其中一个NameNode无法使用,DataNode也可以为其他NameNode提供服务。由于每个BlockPool相互独立,所以允许NameSpace在不通知其他NameNode的情况下,为新创建的Block生成新的Block ID。

    一个NameSpace和对应的Block Pool称为命名空间卷(NameSpace Volume),它是一个独立的管理单元,当一个NameNode或者NameSpace被删除时,DataNode上对应的Block Pool也会被删除。在集群升级期间,每个命名空间卷都将作为一个单元进行升级。

2.Federation机制的优点

1.NameSpace的可扩展性

NameSpace通过水平扩展,在集群中增加更多的NameNode,提供读写和内存存储。

2.高性能

文件系统吞吐量不受单个NameNode的限制,在集群中添加更多的NameNode可以扩展文件系统读写的吞吐量。

3.隔离机制

单个NameNode对多用户环境不提供隔离,使用多个NameNode,可以将不同类别的应用和用户隔离到不同的命名空间。

3.Federation机制的缺点

1.交叉访问

如果某个应用要交叉访问存储在HDFS的多个文件,而这些文件存在于不同的NameSpace中,那么将不可避免的产生交叉访问不同NameSpace的情况。

2.数据移动效率低

不同NameSpace之间移动文件非常繁琐,无法简单地通过HDFS Shell子命令dfs的子命令选项-cp或-mv实现。

Federation机制的实现,主要是通过修改Hadoop的自定义配置文件hdfs-site.xml实现,该配置文件存在参数dfs.nameservices用于指定多个NameNode中不同NameSpace的唯一标识符,通过NameSpace的唯一标识符可以指定不同NameNode的配置信息,例如NameNode的RPC通信地址、Http通信地址等。

接下来,演示基于完全分布式模式部署的Hadoop为基础实现Federation机制,所以要先关闭Hadoop的YARN和HDFS,以及删除HDFS的数据及元数据。这里分别指定虚拟机Hadoop1和Hadoop2运行NameNode。

4.Federation机制的实现

(1)前提准备

1)关闭Hadoop的HDFS和YARN

在虚拟机Hadoop1依次执行stop-yarn.shstop-dfs.sh命令关闭Hadoop的YARN和HDFS。

2)删除HDFS的数据和元数据

Hadoop配置文件core-site.xml的参数hadoop.tmp.dir可以指定存储HDFS数据和元数据的目录,由于我在基于完全分布式部署Hadoop时,指定参数hadoop.tmp.dir的值为/export/data/hadoop-3.3.0/,所以需要在虚拟机Hadoop1、Hadoop2和Hadoop3中删除目录/export/data/hadoop-3.3.0/下的内容。

rm -fr /export/data/hadoop-3.3.0/*

(2)修改hdfs-site.xml配置文件

进入虚拟机Hadoop1的/export/servers/hadoop-3.3.0/etc/hadoop/目录,在该目录下执行vi hdfs-site.xml命令编辑hdfs-site.xml配置文件,修改为如下内容。

<property>
     <name>dfs.replication</name>
     <value>2</value>
</property>
<property>
    <name>dfs.nameservices</name>
    <value>ns1,ns2</value>
</property>
<property>
    <name>dfs.namenode.rpc-address.ns1</name>
    <value>hadoop1:9000</value>
</property>
<property>
    <name>dfs.namenode.http-address.ns1</name>
    <value>hadoop1:9870</value>
</property>
<property>
    <name>dfs.namenode.secondary.http-address.ns1</name>
    <value>hadoop1:9880</value>
</property>
<property>
    <name>dfs.namenode.rpc-address.ns2</name>
    <value>hadoop2:9000</value>
</property>
<property>
    <name>dfs.namenode.http-address.ns2</name>
    <value>hadoop2:9870</value>
</property>
<property>
    <name>dfs.namenode.secondary.http-address.ns2</name>
    <value>hadoop2:9880</value>
</property>

在这里插入图片描述
在这里插入图片描述

(3)分发hdfs-site.xml配置文件

通过scp命令将虚拟机Hadoop1的hdfs-site.xml配置文件分发至虚拟机Hadoop2和Hadoop3的/export/servers/hadoop-3.3.0/etc/hadoop/目录。

将配置文件分发至虚拟机hadoop2

scp /export/servers/hadoop-3.3.0/etc/hadoop/hdfs-site.xml hadoop2:/export/servers/hadoop-3.3.0/etc/hadoop/

将配置文件分发至虚拟机hadoop3

scp /export/servers/hadoop-3.3.0/etc/hadoop/hdfs-site.xml hadoop3:/export/servers/hadoop-3.3.0/etc/hadoop/

(4)格式化HDFS文件系统

在HDFS中实现Federation机制,需要分别指定虚拟机Hadoop1和Hadoop2运行NameNode,分别在这两台虚拟机进行格式化HDFS文件系统的操作。为确保这两个NameNode处于同一HDFS中,在执行格式化HDFS文件系统的命令时,需要在虚拟机Hadoop1和Hadoop2执行使用子命令的选项-clusterId指定相同的clusterId。

hdfs namenode -format -clusterId CHQ

如果Hadoop1和Hadoop2出现“successfully format.”则说明HDFS文件系统格式化成功。

(5)启动Hadoop集群

  • 在虚拟机Hadoop1分别执行start-dfs.shstart-yarn.sh命令启动Hadoop的HDFS和YARN;
  • Hadoop启动完成后,分别在虚拟机Hadoop1、Hadoop2和Hadoop3执行jps命令查看每台虚拟机运行的进程。

在这里插入图片描述

(6)使用不同的NameNode

实现Federation机制的HDFS,每个NameNode中的NameSpace相互独立,也就是说,在某个NameSpace创建的目录不会影响其他NameSpace的目录结构。默认情况下,当通过HDFS Shell子命令的dfs通过子命令选项操作HDFS的文件目录时,会连接core-site.xml配置文件中的参数fs.defsultFS指定NameNode的RPC统信地址。

通过命令dfs的子命令选项-fs,指定虚拟机Hadoop2运行NameNode的RPC通信地址,对其NameSpace进行操作,创建目录/ns2data。

hdfs dfs -fs hdfs://hadoop2:9000 -mkdir /ns2data

执行完上述命令后,分别通过HDFS Shell通过的命令查看Hadoop1和Hadoop2运行的NameNode管理的NameSpace跟目录,如下。
在这里插入图片描述

Erasure Coding

Erasure Coding节省存储空间的原理

在Hadoop 3.x版本中,HDFS新增了Erasure Coding(纠删码),简称EC。Erasure Coding是一种编码技术,它在廉价磁盘冗余阵列(Redundant Arrays of Inexpensive Disks,缩写RAID)中广泛应用,RAID通过条带化技术实现Erasure Coding。

条带化技术是一种自动将I/O的负载均衡到多个物理磁盘上的技术,原理就是将逻辑上连续的数据(如文件)划分为较小的单位,并将连续的单位存储到不同的磁盘上。

HDFS同样通过条带化技术实现Erasure Coding,将逻辑上连续的数据(如文件)划分为较小的条带化单元(默认大小为1024K),并将连续的条带化单元存储到不同的Block上,对于条带化单元形成的每个条带,都会计算并存储一定数量的奇偶校验单元,奇偶校验单元会写入到Block,从而确保数据的容错性。与HDFS的副本机制相比Erasure Coding可以节省占用的存储空间。

接下来,展示应用Erasure Coding的HDFS如何存储文件,以存储大小为300MB的文件为例。

1.Erasure Coding存储文件的示意图

  • 通过Erasure Coding存储的文件由数据和奇偶校验码两部分组成,这两部分存储在不同的Block中。
  • HDFS为了便于查找数据对应的奇偶校验码,会根据Erasure Coding策略将相关联的Block放入到同一数据块组。
    在这里插入图片描述

常用的Erasure Coding策略有RS-10-4-1024k、RS-6-3-1024k 和 RS-3-2-1024k,这3种策略都是通过Reed-Solomon(里德-所罗门)编码实现,又称RS编码,关于这3种策略的介绍如下。

  • RS-10-4-1024k策略中的10表示10个存储条带化单元的Block;4表示4个存储奇偶校验单元的Block;1024K表示条带化单元的大小。整体含义是每生成10个存储条带化单元的Block,便生成4个存储对应奇偶校验单元的Block,并把这14个Block放入到一个数据块组。
  • RS-6-3-1024k策略中的6表示6个存储条带化单元的Block;3表示3个存储奇偶校验单元的Block;1024K表示条带化单元的大小。整体含义是每生成6个存储条带化单元的Block,便生成3个存储对应奇偶校验单元的Block,并把这9个Block放入到一个数据块组,该策略是Erasure Coding默认的策略。
  • RS-3-2-1024k策略中的3表示3个存储条带化单元的Block;2表示2个存储奇偶校验单元的Block;1024K表示条带化单元的大小。整体含义是每生成3个存储条带化单元的Block,便生成2个存储对应奇偶校验单元的Block,并把这5个Block放入到一个数据块组。

在HDFS中,可以通过Admin Commands类型的HDFS Shell子命令ec应用Erasure Coding来存储文件,接下来,介绍子命令ec常用的一些子命令选项。

2.-enablePolicy

子命令选项-enablePolicy用于开启Erasure Coding并指定Erasure Coding策略,语法格式如下。

hdfs ec -enablePolicy -policy <policyName>

  • 参数-policy:用于指定Erasure Coding策略;
  • 参数policyName:用于指定Erasure Coding策略的名称。

开启Erasure Coding并指定Erasure Coding策略为RS-3-2-1024k。

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

在这里插入图片描述

3.-setPolicy

子命令选项-setPolicy用于在指定目录上设置Erasure Coding策略,语法格式如下。

hdfs ec -setPolicy -path <path> -policy <policyName>

  • 参数-path:用于指定目录。
  • 参数path:用于指定目录名称。

为HDFS的目录/EC指定Erasure Coding策略为RS-3-2-1024k。

hdfs ec -setPolicy -path /EC -policy RS-3-2-1024k
在这里插入图片描述

4.-getPolicy

子命令选项-getPolicy用于查看指定目录上的Erasure Coding策略,语法格式如下。

hdfs ec -getPolicy -path <path>

查看HDFS中目录/EC的Erasure Coding策略

hdfs ec -getPolicy –path /EC
在这里插入图片描述

5.-unsetPolicy

子命令选项-unsetPolicy用于在指定目录上取消Erasure Coding策略,语法格式如下。

hdfs ec -unsetPolicy -path <path>

取消目录/EC的Erasure Coding策略。

hdfs ec -unsetPolicy -path /EC
在这里插入图片描述

6.-disablePolicy

子命令选项-disablePolicy用于关闭Erasure Coding及指定的Erasure Coding策略,语法格式如下。

hdfs ec -disablePolicy -policy <policyName>

关闭Erasure Coding及指定的Erasure Coding策略RS-3-2-1024k。

hdfs ec -disablePolicy -policy RS-3-2-1024k
在这里插入图片描述