HDFS联邦(Federation)

Posted 程序猿码码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS联邦(Federation)相关的知识,希望对你有一定的参考价值。


Apache Hadoop 2.9.0

请查看原文:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/Federation.html

(如果转发,请标明出处)

 

本指南提供了HDFS联邦概述以及如何配置和管理联邦集群。

背景

 



HDFS主要包含2层:

1) Namespace

      由一堆目录、文件、块组成。

      支持所有与namespace 相关的文件系统操作,例如创建、删除、修改、列出文件和目录。

2) 块存储服务(Block Storage Service),主要由2部分:

① 块管理(Block Management )(主要是NameNode完成)

通过注册和周期性心跳来管理Datanodes 

处理块报告,并且维护块位置信息。

支持块相关操作,例如创建、删除、修改和获取块位置信息。

管理副本放置、副本数量不够情况下的块复制,并删除超过副本因子数量的

② 存储 Storage - Datanodes 来完成,Datanodes 存储块到本地文件系统并且允许读写操作。

 

现有的HDFS体系结构只允许整个集群使用一个namespace 配置中,单个Namenode管理命名空间。HDFS联邦通过向HDFS添加多个Namenodes/namespaces的支持来解决此限制。

多个Namenodes/Namespaces

为了横向扩展名称服务,联邦使用多个独立的Namenodes/namespaces

Namenodes 是联合的,Namenodes 之间相互独立,彼此之间不需要协调。Datanodes被所有Namenodes 用作块的公共存储。每个Datanode 向集群中所有的Namenodes 进行注册。Datanodes 周期性的发送心跳和块报告,同时处理来自Namenodes 的命令。

用户可以使用ViewFs来创建个性化命名空间视图。ViewFs类似于某些Unix / Linux系统中的客户端装载表

 


块池(Block Pool

一个块池是一系列属于单个命名空间的块集合,Datanodes 为集群中的所有块池存储块。每个块池都是独立管理的允许命名空间为新块生成Block IDs不需要与其他命名空间协调。一个Namenode 故障不会阻止Datanode 集群中的其他Namenodes提供服务。

一个命名空间和它的块池一起被称为命名空间卷(Namespace Volume)。命名空间卷是一个独立的自我管理单位。当一个Namenode/namespace被删除时,对应的在Datanodes 上的块池也会被删除。集群升级期间,每个命名空间卷作为一个单元来进行升级

 

ClusterID

ClusterID用于标识集群中所有的节点。当一个Namenode 被格式化时,ClusterID就会人工提供或者自动生成,同时这个ID用于将剩余其他Namenode 格式化到集群中。

 

主要好处:

① 命名空间可扩展 - 联邦增加了命名空间的水平扩展性。大型部署或使用大量小文件的部署使用命名空间扩展可以允许将更多Namenodes 添加到集群,这对于大型部署或使用大量小文件部署是非常有益的(这样就能避免单个Namenode内存有限的问题)。

② 性能 - 文件系统吞吐量将不受单个名称节点的限制。向集群添加更多Namenode可扩展文件系统读/写的吞吐量。

③ 隔离 - 单个Namenode在多用户环境中不提供隔离。例如,一个实验应用程序可能会使Namenode过载,并降低主要应用程序的速度。通过使用多个Namenode,可以将不同类别的应用程序和用户隔离到不同的命名空间。

联邦配置

联邦配置是向前兼容的,允许已经存在的单一Namenode继续工作而不需要任何修改。新的配置是这样设计的:所有集群中的节点需要同样的配置文件而不需要根据集群中节点类型的不同分发不同的配置文件。

联邦增加了一个新的抽象变量NameServiceID 。一个Namenode 以及它相关联的所有secondary/backup/checkpointer节点属于同一个NameServiceId。为了支持单一的配置文件,Namenode secondary/backup/checkpointer 节点的配置文件的参数都需要用NameServiceID来作为后缀。

配置:

Step 1: 在配置中增加 dfs.nameservices变量,并且指定一个以逗号分隔的NameServiceIDs列表。Datanodes 将以此来识别集群中的Namenodes 

Step 2对每一个Namenode Secondary Namenode/BackupNode/Checkpointer 增加下面的以NameServiceID 为后缀的配置参数到配置文件。

Daemon

Configuration Parameter

Namenode

dfs.namenode.rpc-address 
dfs.namenode.servicerpc-address 
dfs.namenode.http-address 
dfs.namenode.https-address 
dfs.namenode.keytab.file 
dfs.namenode.name.dir 
dfs.namenode.edits.dir 
dfs.namenode.checkpoint.dir 
dfs.namenode.checkpoint.edits.dir

Secondary Namenode

dfs.namenode.secondary.http-address 
dfs.secondary.namenode.keytab.file

BackupNode

dfs.namenode.backup.address 
dfs.secondary.namenode.keytab.file

 

下面是一个2Namenodes的配置例子:

<configuration>

  <property>

    <name>dfs.nameservices</name>

    <value>ns1,ns2</value>

  </property>

  <property>

    <name>dfs.namenode.rpc-address.ns1</name>

    <value>nn-host1:rpc-port</value>

  </property>

  <property>

    <name>dfs.namenode.http-address.ns1</name>

    <value>nn-host1:http-port</value>

  </property>

  <property>

    <name>dfs.namenode.secondary.http-address.ns1</name>

    <value>snn-host1:http-port</value>

  </property>

  <property>

    <name>dfs.namenode.rpc-address.ns2</name>

    <value>nn-host2:rpc-port</value>

  </property>

  <property>

    <name>dfs.namenode.http-address.ns2</name>

    <value>nn-host2:http-port</value>

  </property>

  <property>

    <name>dfs.namenode.secondary.http-address.ns2</name>

    <value>snn-host2:http-port</value>

  </property>

 

  .... Other common configuration ...

</configuration>

 

格式化Namenodes

Step 1使用下面的命令格式化一个Namenode 

  [hdfs]$ $HADOOP_PREFIX/bin/hdfs namenode -format [-clusterId <cluster_id>]

 

选择一个不会与环境中的其他集群相冲突的唯一 cluster_id。如果 cluster_id没有提供,那么一个唯一的 cluster_id将会自动生成。

Step 2:使用下面的命令来格式化其他Namenodes

[hdfs]$ $HADOOP_PREFIX/bin/hdfs namenode -format -clusterId <cluster_id>

需要注意的是step 2中使用的 cluster_id 必须与step 1中使用的cluster_id 相同。如果不同,那么这些Namenodes将不属于联邦集群。

 

从旧版本升级并配置联邦

旧的版本可能只支持一个Namenode。升级集群到新版本来支持联帮,需要在升级过程中像如下一样提供一个ClusterID 

[hdfs]$ $HADOOP_PREFIX/bin/hdfs start namenode --config $HADOOP_CONF_DIR  -upgrade -clusterId <cluster_ID>

如果 cluster_id没有提供,将会自动生成。

 

增加一个新的Namenode 到已经存在的HDFS集群

执行如下步骤:

① 在配置中增加dfs.nameservices 

② 使用NameServiceID 后缀来更新配置。版本0.20后更改了配置参数的名称。必须使用新的配置参数名字才能使用联邦。

③ 将新Namenode 相关配置添加到配置文件中。

④ 将配置文件分发到集群中的所有节点。

⑤ 启动新的Namenode 以及Secondary/Backup

⑥ 通过对集群中的所有Datanodes 运行以下命令,刷新Datanodes 以获取新添加的Namenode 

[hdfs]$ $HADOOP_PREFIX/bin/hdfs dfsadmin -refreshNamenodes <datanode_host_name>:<datanode_rpc_port>

 

管理集群

启动和关闭集群

 

使用以下命令来启动集群:

[hdfs]$ $HADOOP_PREFIX/sbin/start-dfs.sh

使用以下命令来关闭集群:

[hdfs]$ $HADOOP_PREFIX/sbin/stop-dfs.sh

 

这些命令可以从HDFS配置可用的任意节点运行。命令使用配置确定集群中的Namenodes ,然后在这些节点上启动Namenodes 进程。Datanodes slaves 文件中指定的节点上启动。这个脚本可用作构建自己启动和停止集群脚本的参考。

Balancer

Balancer已更改为适用多个NamenodesBalancer 可以像如下命令这样运行:

[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh start balancer [-policy <policy>]

Policy可以是如下任一参数:

① datanode  - 默认的policy。这将在Datanode 均衡数据存储,这类似与之前版本的均衡策略。

② blockpool  - 均衡块池层的存储,同时也会均衡Datanode 层。

需要注意的是Balancer 只均衡数据,而不均衡命名空间。更多的使用,请查看 balancer

Decommissioning

Decommissioning跟之前版本类似。需要解除授权的节点将添加到所有Namenodesexclude 文件中。每个Namenode 解除自己的块池。当所有Namenodes完成了对一个Datanode的解除,那么这个Datanode才能被认为被解除了。

Step 1:使用如下命令,分发一个exclude 文件到所有Namenodes

[hdfs]$ $HADOOP_PREFIX/sbin/distribute-exclude.sh <exclude_file>

Step 2:Refresh 所有的Namenodes 来获取新的exclude 文件:

[hdfs]$ $HADOOP_PREFIX/sbin/refresh-namenodes.sh

 

以上命令使用HDFS配置来确定集群中已配置的Namenodes ,并刷新它们以获取新的exclude 文件。

集群网络控制台

Namenode 网页类似,使用联邦时,可以在http://<any_nn_host:port>/dfsclusterhealth.jsp集群Web控制台监控联邦集群的情况。集群中的任何Namenode都可以用于访问此网页

集群网络控制台包含如下信息:

① 集群概要,显示文件数、块数、配置的总存储容量以及整个群集的可用和已用存储。

② Namenodes 列表和概要,其中包括每个Namenodes 的文件数、块数、丢失的块数以及活数据节点和死数据节点数。它还提供了访问每个Namenodes web用户界面的链接。

③ Datanode的解除授权状态。

 

 

 

----------- 全文完 ------------------

Namespace -- 命名空间

Decommission -- 解除授权,其实应该翻译成 ‘停用’可能更合适,大家意会~~~


以上是关于HDFS联邦(Federation)的主要内容,如果未能解决你的问题,请参考以下文章

HDFS Federation联邦机制

hadoop详解HDFS Federation(联邦)详解及优劣势分析

2021年大数据Hadoop(十五):Hadoop的联邦机制 Federation

大数据Hadoop-HA-Federation-3.3.1集群高可用联邦安装部署文档(建议收藏哦)

Webpackwebpack5 模块联邦(Module Federation)

Webpackwebpack5 模块联邦(Module Federation)实践