1. HDFS 2.0 基本概念
相比于 Hadoop 1.0,Hadoop 2.0 中的 HDFS 增加了两个重大特性,HA 和 Federaion。HA 即为 High Availability,用于解决 NameNode 单点故障问题,该特性通过热备的方式为主 NameNode 提供一个备用者,一旦主 NameNode 出现故障,可以迅速切换至备 NameNode, 从而实现不间断对外提供服务。Federation 即为“联邦”,该特性允许一个 HDFS 集群中存在 多个 NameNode 同时对外提供服务,这些 NameNode 分管一部分目录(水平切分),彼此之 间相互隔离,但共享底层的 DataNode 存储资源。
本文档重点介绍 HDFS HA 和 Federation 的安装部署方法。
2. HDFS HA 配置部署
2.1 HDFS HA 架构
在一个典型的 HDFS HA 场景中,通常由两个 NameNode 组成,一个处于 active 状态, 另一个处于 standby 状态。Active NameNode 对外提供服务,比如处理来自客户端的 RPC 请 求,而 Standby NameNode 则不对外提供服务,仅同步 active namenode 的状态,以便能够在 它失败时快速进行切换。
为了能够实时同步 Active 和 Standby 两个 NameNode 的元数据信息(实际上 editlog), 需提供一个共享存储系统,可以是 NFS、QJM(Quorum Journal Manager)或者 Bookeeper, Active Namenode 将数据写入共享存储系统,而 Standby 监听该系统,一旦发现有新数据写 入,则读取这些数据,并加载到自己内存中,以保证自己内存状态与 Active NameNode 保持 基本一致,如此这般,在紧急情况下 standby 便可快速切为 active namenode。
注意,在 Hadoop 2.0 中,不再需要 secondary namenode 或者 backup namenode,它们的 工作由 Standby namenode 承担。
本文将重点介绍基于 QJM 的 HA 解决方案。在该方案中,主备 NameNode 之间通过一 组 JournalNode 同步元数据信息,一条数据只要成功写入多数 JournalNode 即认为写入成功。 通常配置奇数个(2N+1)个 JournalNode,这样,只要 N+1 个写入成功就认为数据写入成功, 此时最多容忍 N-1 个 JournalNode 挂掉,比如 3 个 JournalNode 时,最多允许 1 个 JournalNode 挂掉,5 个 JournalNode 时,最多允许 2 个 JournalNode 挂掉。基于 QJM 的 HDFS 架构如下 所示:
2.2 硬件选择及软件准备
(1) 硬件选择
NameNode 机器:推荐主备 NameNode 具有相同的硬件配置,且内存要足够大。
JournalNode:通常准备 3 或 5 个 JournalNode,考虑到 JournalNode 非常轻量级,可以与 Hadoop 其他服务共用机器,比如 ResourceManager,TaskTracker 等。
Zookeeper:由于 Hadoop 多个服务用到了 Zookeeper,可搭建一个 3 或者 5 个节点的Zookeeper 实例作为公共服务。Zookeeper 实例也可以与其他服务共用机器。
(2) 软件准备
2.3 修改配置文件
(1) dfs.nameservices
HDFS 命名服务的逻辑名称,可用户自己定义,比如 mycluster,注意,该名称将被基 于 HDFS 的系统使用,比如 Hbase 等,此外,需要你想启用 HDFS Federation,可以通过该 参数指定多个逻辑名称,并用“,”分割。- <property>
- <name>dfs.nameservices</name>
- <value>nn</value>
- <description>Logical name for this new nameservice</description>
- </property>
(2) dfs.ha.namenodes.[$nameservice ID]:
某个命名服务下包含的 NameNode 列表,可为每个 NameNode 指定一个自定义的 ID 名称,比如命名服务 nn 下有两个 NameNode,分别命名为 nn1 和 nn2,则配置如下:- <property>
- <name>dfs.ha.namenodes.nn</name>
- <value>nn1,nn2</value>
- <description>Unique identifiers for each NameNode in the nameservice </description>
- </property>
注意,目前每个命名服务最多配置两个 NameNode
(3) dfs.namenode.rpc-address.[$nameservice ID].[$name node ID]
为每个 NameNode 设置 RPC 地址,以前面的实例为例,可进行如下配置:- <property>
- <name>dfs.namenode.rpc-address.nn.nn1</name>
- <value>nn1:9000</value>
- </property>
- <property>
- <name>dfs.namenode.rpc-address.nn.nn2</name>
- <value>nn2:9000</value>
- </property>
(4) dfs.namenode.http-address.[$nameservice ID].[$name node ID]
为每个 NameNode 设置对外的 HTTP 地址,以前面的实例为例,可进行如下配置:- <property>
- <name>dfs.namenode.http-address.nn.nn1</name>
- <value>192.168.10.110:50070</value>
- </property>
- <property>
- <name>dfs.namenode.http-address.nn.nn2</name>
- <value>192.168.10.111:50070</value>
- </property>
(5) dfs.namenode.shared.edits.dir
设置一组 journalNode 的 URI 地址,active NameNode 将 edit log 写入这些JournalNode,而 standby NameNode 读取这些 edit log,并作用在内存中的目录树中,该属性 值应符合以下格式:- qjournal://host1:port1;host2:port2;host3:port3/journalId
其中,journalId 是该命名空间的唯一 ID。假设你有三台 journalNode,即 dn1, dn2 和 dn3,则可进行如下配置:
- <property>
- <name>dfs.namenode.shared.edits.dir</name>
- <value>qjournal://dn1:8485;dn2:8485; dn3:8485;dn4:8485;dn6:8485/nn</value>
- </property>
(6) dfs.client.failover.proxy.provider.[$nameservice ID]
设置客户端与 active NameNode 进行交互的 Java 实现类,DFS 客户端通过该类寻找当前的 active NameNode。该类可由用户自己实现,默认实现为 ConfiguredFailoverProxyProvider。- <property>
- <name>dfs.client.failover.proxy.provider.nn</name>
- <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
- </property>
(7) dfs.ha.fencing.methods
HDFS 允许用户配置多个隔离机制,当发生主备切换时,将顺次执行这些隔离机制,直 到一个返回成功。Hadoop 2.0 内部打包了两种类型的隔离机制,分别是 shell 和 sshfence。
sshfence 通过 ssh 登录到前一个 active NameNode 并将其杀死。为了让该机制成功执行,
需配置免密码 ssh 登陆,这可通过参数 dfs.ha.fencing.ssh.private-key-files 设置一个私钥文件。
- <property>
- <name>dfs.ha.fencing.methods</name>
- <value>sshfence</value>
- </property>
- <property>
- <name>dfs.ha.fencing.ssh.private-key-files</name>
- <value>/home/hadoop/.ssh/id_rsa</value>
- </property>
- <property>
- <name>dfs.ha.fencing.methods</name>
- <value>sshfence([[username][:port]])</value>
- </property>
- <property>
- <name>dfs.ha.fencing.ssh.connect-timeout</name>
- <value>30000</value>
- </property>
2) shell
执行任意一个 shell 命令隔离旧的 active NameNode,配置方法如下:
- <property>
- <name>dfs.ha.fencing.methods</name>
- <value>shell(/path/to/my/script.sh arg1 arg2 ...)</value> (这里没搞懂)
- </property>
(8) fs.defaultFS
设置缺省的目录前缀,需在 core-site.xml 中设置,比如命名服务的 ID 为 mycluster(参 数 dfs.nameservices 指定的),则配置如下:- <property>
- <name>fs.defaultFS</name>
- <value>hdfs://nn</value>
- </property>
(9) dfs.journalnode.edits.dir
JournalNode 所在节点上的一个目录,用于存放 editlog 和其他状态信息。该参数只能设置一个目录,你可以对磁盘做 RIAD 提高数据可靠性。- <property>
- <name>dfs.journalnode.edits.dir</name>
- <value>/opt/journal/node/local/data</value>
- </property>
2.4 启动服务
假设 nn1 和 nn2 两个节点是主备 NameNode,则 HDFS 集群启动顺序如下:(1) 启动所有 JournalNode
(2) 启动 nn1 和 nn2
(3) 启动所有 DataNode
在所有 JournalNode 节点上,进入 Hadoop 安装目录下,运行以下命令启动
- sbin/hadoop-daemon.sh start journalnode
- hdfs namenode -initializeSharedEdits [-force | -nonInteractive]
该命令将格式化各个 JournalNode,默认情况下是交互式执行的,要求用户输入“Y/N”进行确 认,可以使用参数-force 或者 –nonInteractive 跳过交互式过程,直接强制格式化。
- sbin/hadoop-daemon.sh start namenode
- bin/hdfs namenode -bootstrapStandby [-force | -nonInteractive]
- sbin/hadoop-daemon.sh start namenode
在各个 DataNode 节点上执行以下命令:
- sbin/hadoop-daemon.sh start datanode
- sbin/hadoop-daemons.sh start datanode
nn1 和 nn2 启动后,都处于 Standby 状态,此时均不能对外提供服务,在 nn1 节点上输入 以下命令将它切换为 active:
- hdfs haadmin -failover --forcefence --forceactive <serviceId> <serviceId>
- 就会把NameNode的状态进行安全的切换。其中后面一个会变为active状态。这时候再通过web页面观察就能看到正确结果了。
- hdfs haadmin -failover --forcefence --forceactive nn1 nn2
- 执行命令“hdfs haadmin”,会显示子命令列表,如下
- Usage: DFSHAAdmin [-ns <nameserviceId>]
- [-transitionToActive <serviceId>]
- [-transitionToStandby <serviceId>]
- [-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]
- [-getServiceState <serviceId>]
- [-checkHealth <serviceId>]
- [-help <command>]<span style="white-space:pre"> </span> 通过help可以看到,也可以用hdfs haadmin -transitionToActive nn1 进行切换namenode到active状态<span style="white-space:pre"> </span>
当 active namenode 发生故障时,人工切换模式不能自动完成主备切换,因此推荐使用自动切换,这是基于 zookeeper 实现的,具体配置可参考下一节2.5。
2.5 配置自动切换模式
Zookeeper 实例(3 个或 5 个或 7 个节点)
ZKFailoverController(简称“ZKFC”)
ZKFC 是一个 Zookeeper 客户端,负责监控和管理 NameNode 的状态,每台运行 NameNode 的机器上也会运行一个 ZKFC 进程。
健康状况监控:ZKFC周期性地与本地的NameNode交互,执行一些健康状况监测命令。 Zookeepersession管理:如果本地NameNode是健康的,则会持有Zookeeper上一个znode, 如果它是 active 的,会持有 zookeeper 的仅有的一个特殊 znode,该 znode 类型为 ephemeral,一旦 namenode 挂掉后,会自动消失。
基于zookeeper的选举:如果本地NameNode是活的,而没有其他namenode持有特殊的znode,
ZKFC 将尝试获取这个 znode,一旦获取成功后,则认为它“赢得了选举”,进而隔离之前的 active namenode,自己转换为新的 active namenode。
在 hdfs-site.xml 增加以下配置:
(2) 配置 zookeeper 实例地址
在 core-site.xml 中,增加以下配置:

<property>
</property>

<property>
<name>ha.zookeeper.quorum</name>
<value>dn1:2181,dn2:2181, dn3:2181, dn4:2181,dn6:2181</value>
</property

步骤 2:初始化 zookeeper
bin/hdfs zkfc -formatZK
步骤 3:启动 JournalNode、NameNode 和 DataNode
在各个 NameNode 上,依次输入以下命令启动 ZKFC:
sbin/hadoop-daemon.sh start zkfc
第一个启动的 NN 将成为 active NameNode
步骤 5:验证自动切换功能是否生效
可人工将 active namenode 进程杀死,看是够自动切换到另一个 namenode。
相关推荐
在构建高可用(HA)Hadoop集群时,HDFS(Hadoop Distributed File System)HA配置是关键步骤,目的是确保即使NameNode节点发生故障,数据访问和服务也不会中断。本教程将详细讲解如何配置、启动和验证Hadoop HA集群...
HDFS 的 HA 和 YARN 的 HA。 3)Hadoop2.0 之前,在 HDFS 集群中 NameNode 存在单点故障(SPOF)。 4)NameNode 主要在以下两个方面影响 HDFS 集群 NameNode 机器发生意外,如宕机,集群将无法使用,直到管理员重启 ...
为了提高系统的高可用性(High Availability, HA),HDFS HA引入了Active/Standby两个NameNode的机制,以确保在NameNode故障时能快速切换到备用节点,从而消除单点故障。 8.1 HA概述: HA的主要目标是确保服务的...
本文将详细解析HDFS的安装部署及静态加密相关知识点。 首先,HDFS的设计目标是基于廉价的普通硬件,能够容忍硬件故障。这意味着即使系统中的某台或几台服务器发生故障,系统仍可继续运行,并确保数据的完整性不受...
### Flume配置双HA HDFS Sink详解 #### 一、背景与需求分析 Apache Flume 是一款高可靠、高性能的服务,用于收集、聚合和移动大量日志数据。它具有简单的可扩展架构,易于定制和部署。然而,在某些情况下,用户...
在搭建Hadoop 2.6集群环境时,我们需要关注几个关键组件:HDFS(Hadoop Distributed File System)的高可用性(HA)以及YARN(Yet Another Resource Negotiator)。这个过程涉及多台虚拟机的配置,包括安装操作系统...
本文将详细解析如何在多机环境中部署Hadoop的HDFS(Hadoop Distributed File System)高可用性(HA)、Federation以及YARN(Yet Another Resource Negotiator)组件。我们将按照步骤进行,确保每个环节的正确设置和...
- 在部署HDFS HA集群时,应确保Hive配置文件中正确设置了与HA相关的配置项,如`dfs.nameservices`、`dfs.ha.namenodes.ns1`等。 - 定期检查Hive Metastore数据库中的表定义和元数据信息,确保它们始终与HDFS HA集群...
本文档详细介绍了Hadoop HDFS的安装和管理过程,从环境准备、用户创建、主机名配置、HDFS部署等多个方面进行了详细介绍。这些步骤对于成功部署Hadoop HDFS至关重要,有助于搭建稳定可靠的Hadoop集群。通过本文档的...
4. 开始部署:审核通过后,根据部署文档开始在服务器上安装和配置Hadoop环境,包括安装JDK、配置Hadoop相关环境变量(例如,在`hadoop-env.sh`中设置JAVA_HOME等)、修改各个核心配置文件(`core-site.xml`、`hdfs-...
在介绍“HA集群部署手册”之前,我们首先需要了解其中涉及的关键技术与概念。手册中涉及的技术包括Hadoop、Spark、Zookeeper以及HA(High Availability,高可用性)的概念。Hadoop是一个开源框架,它允许使用简单的...
在部署HDFS HA with QJM时,我们需要执行以下步骤: 1. **安装和配置Zookeeper**:Zookeeper是Hadoop HA的基础,用于协调NameNode的选举和状态同步。至少需要三个Zookeeper节点来实现容错。确保每个节点都正确配置...
11. **最佳实践**:最后,了解和遵循最佳实践是确保Hadoop HA部署稳定的关键,这包括定期维护,监控系统性能,以及对配置进行定期审计。 在实际操作中,部署和测试Hadoop多节点HA环境是一个复杂的过程,需要对...
在部署HDFS HA环境之前,需要做好集群的基础环境准备。首先,要配置多台主机,包括修改主机名、IP地址,设置主机名与IP的映射关系,并关闭防火墙以减少通信障碍。此外,需要实现SSH免密登录,确保集群内节点间的安全...
### HDFS高可用性(HA)搭建详解 #### 一、引言 HDFS (Hadoop Distributed File System) 是Hadoop生态系统中的分布式文件系统组件,主要用于存储海量数据。随着业务的发展,对数据处理的需求越来越高,单点故障的风险...
【Hadoop高可用性HA部署】是为了解决Hadoop 1.0架构中的单点故障问题,确保在NameNode或关键服务失败时,集群仍能持续运行。Hadoop HA通过部署双NameNode(Active/Standby模式)来提供高可用性。在正常情况下,...
CDH5.5.0是CDH的一个版本,包含了Hadoop的多个组件,如HDFS、YARN等,并且提供了方便的图形化安装和配置工具,使得部署和管理Hadoop集群变得更加便捷。 在CDH5.5.0中,HDFS(Hadoop Distributed File System)和...
典型的HA部署涉及至少两台NameNode(一个活跃,一个备用),多台JournalNode用于元数据同步,以及Zookeeper集群用于监控和故障切换。 3. **Hadoop HA集群配置方法** 在完全分布式集群基础上配置HA,我们需要规划...
这里值得注意的是,NameNode和ResourceManager进程被设置为HA模式,即高可用模式,这意味着它们都有一个主动节点(Active)和一个备用节点(Standby),以提高系统的可靠性和容错能力。 ### 目录规划 良好的目录结构...