目录
- Federation机制的实现原理
- 1.HDFS的分层图解
- (1)NameSpace
- (2)Block Storage
- 1)Block Management
- 2)Storage
- 2.Federation机制的优点
- 3.Federation机制的缺点
- 4.Federation机制的实现
- (1)前提准备
- (2)修改hdfs-site.xml配置文件
- (3)分发hdfs-site.xml配置文件
- (4)格式化HDFS文件系统
- (5)启动Hadoop集群
- (6)使用不同的NameNode
- Erasure Coding
- 1.Erasure Coding存储文件的示意图
- 2.-enablePolicy
- 3.-setPolicy
- 4.-getPolicy
- 5.-unsetPolicy
- 6.-disablePolicy
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.sh
和stop-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.sh
和start-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