阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

国内最全最详细的Hadoop2.2.0集群的HA高可靠的最简单配置

107次阅读
没有评论

共计 11152 个字符,预计需要花费 28 分钟才能阅读完成。

简介 

Hadoop 中的 NameNode 好比是人的心脏,非常重要,绝对不可以停止工作。在 hadoop1 时代,只有一个 NameNode。如果该 NameNode 数据丢失或者不能工作,那么整个集群就不能恢复了。这是 hadoop1 中的单点问题,也是 hadoop1 不可靠的表现,如图 1 所示。hadoop2 就解决了这个问题。

国内最全最详细的 Hadoop2.2.0 集群的 HA 高可靠的最简单配置

图 1 

hadoop2.2.0 中 HDFS 的高可靠指的是可以同时启动 2 个 NameNode。其中一个处于工作状态,另一个处于随时待命状态。这样,当一个 NameNode 所在的服务器宕机时,可以在数据不丢失的情况下,手工 或者 自动 切换到另一个 NameNode 提供服务。

这些 NameNode 之间通过共享数据,保证数据的状态一致。多个 NameNode 之间共享数据,可以通过 Nnetwork File System 或者 Quorum Journal Node。前者是通过 linux 共享的文件系统,属于操作系统的配置;后者是 hadoop 自身的东西,属于软件的配置。

我们这里讲述使用 Quorum Journal Node 的配置方式,方式是手工切换。 

集群启动时,可以同时启动 2 个 NameNode。这些 NameNode 只有一个是 active 的,另一个属于 standby 状态。active 状态意味着提供服务,standby 状态意味着处于休眠状态,只进行数据同步,时刻准备着提供服务,如图 2 所示。

国内最全最详细的 Hadoop2.2.0 集群的 HA 高可靠的最简单配置

图 2 

架构 

在一个典型的 HA 集群中,每个 NameNode 是一台独立的服务器。在任一时刻,只有一个 NameNode 处于 active 状态,另一个处于 standby 状态。其中,active 状态的 NameNode 负责所有的客户端操作,standby 状态的 NameNode 处于从属地位,维护着数据状态,随时准备切换。

两个 NameNode 为了数据同步,会通过一组称作 JournalNodes 的独立进程进行相互通信。当 active 状态的 NameNode 的命名空间有任何修改时,会告知大部分的 JournalNodes 进程。standby 状态的 NameNode 有能力读取 JNs 中的变更信息,并且一直监控 edit log 的变化,把变化应用于自己的命名空间。standby 可以确保在集群出错时,命名空间状态已经完全同步了,如图 3 所示。

国内最全最详细的 Hadoop2.2.0 集群的 HA 高可靠的最简单配置

图 3 

为了确保快速切换,standby 状态的 NameNode 有必要知道集群中所有数据块的位置。为了做到这点,所有的 datanodes 必须配置两个 NameNode 的地址,发送数据块位置信息和心跳给他们两个。

对于 HA 集群而言,确保同一时刻只有一个 NameNode 处于 active 状态是至关重要的。否则,两个 NameNode 的数据状态就会产生分歧,可能丢失数据,或者产生错误的结果。为了保证这点,JNs 必须确保同一时刻只有一个 NameNode 可以向自己写数据。

硬件资源 

为了部署 HA 集群,应该准备以下事情:

* NameNode 服务器:运行 NameNode 的服务器应该有相同的硬件配置。

* JournalNode 服务器:运行的 JournalNode 进程非常轻量,可以部署在其他的服务器上。注意:必须允许至少 3 个节点。当然可以运行更多,但是必须是奇数个,如 3、5、7、9 个等等。当运行 N 个节点时,系统可以容忍至少(N-1)/ 2 个节点失败而不影响正常运行。

在 HA 集群中,standby 状态的 NameNode 可以完成 checkpoint 操作,因此没必要配置 Secondary NameNode、CheckpointNode、BackupNode。如果真的配置了,还会报错。

相关阅读

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

搭建 Hadoop 环境(在 Winodws 环境下用虚拟机虚拟两个 Ubuntu 系统进行搭建)http://www.linuxidc.com/Linux/2011-12/48894.htm

配置

 

HA 集群需要使用 nameservice ID 区分一个 HDFS 集群。另外,HA 中还要使用一个词,叫做 NameNode ID。同一个集群中的不同 NameNode,使用不同的 NameNode ID 区分。为了支持所有 NameNode 使用相同的配置文件,因此在配置参数中,需要把“nameservice ID”作为 NameNode ID 的前缀。

 

HA 配置内容是在文件 hdfs-site.xml 中的。下面介绍关键配置项。

 

dfs.nameservices 命名空间的逻辑名称。如果使用 HDFS Federation,可以配置多个命名空间的名称,使用逗号分开即可。

<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>

dfs.ha.namenodes.[nameservice ID] 命名空间中所有 NameNode 的唯一标示名称。可以配置多个,使用逗号分隔。该名称是可以让 DataNode 知道每个集群的所有 NameNode。当前,每个集群最多只能配置两个 NameNode。

<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>

dfs.namenode.rpc-address.[nameservice ID].[name node ID] 每个 namenode 监听的 RPC 地址。如下所示

<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>machine1.example.com:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>machine2.example.com:8020</value>
</property>

dfs.namenode.http-address.[nameservice ID].[name node ID] 每个 namenode 监听的 http 地址。如下所示

<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>machine1.example.com:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>machine2.example.com:50070</value>
</property>

如果启用了安全策略,也应该对每个 namenode 配置 htts-address 信息,与此类似。

dfs.namenode.shared.edits.dir 这是 NameNode 读写 JNs 组的 uri。通过这个 uri,NameNodes 可以读写 edit log 内容。URI 的格式 ”qjournal://host1:port1;host2:port2;host3:port3/journalId”。这里的 host1、host2、host3 指的是 Journal Node 的地址,这里必须是奇数个,至少 3 个;其中 journalId 是集群的唯一标识符,对于多个联邦命名空间,也使用同一个 journalId。配置如下

<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
</property>

 

dfs.client.failover.proxy.provider.[nameservice ID] 这里配置 HDFS 客户端连接到 Active NameNode 的一个 java 类。

 

<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.Hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

 

dfs.ha.fencing.methods 配置 active namenode 出错时的处理类。当 active namenode 出错时,一般需要关闭该进程。处理方式可以是 ssh 也可以是 shell。

 

如果使用 ssh,配置如下

 

<property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
</property>

<property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/home/exampleuser/.ssh/id_rsa</value>
</property>

这种方法配置简单,推荐使用。

fs.defaultFS 客户端连接 HDFS 时,默认的路径前缀。如果前面配置了 nameservice ID 的值是 mycluster,那么这里可以配置为授权信息的一部分。

 

可以在 core-site.xml 中  配置如下

 

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>

 

dfs.journalnode.edits.dir 这是 JournalNode 进程保持逻辑状态的路径。这是在 linux 服务器文件的绝对路径。

 

配置如下

 

<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/path/to/journal/node/local/data</value>
</property>

简介 

Hadoop 中的 NameNode 好比是人的心脏,非常重要,绝对不可以停止工作。在 hadoop1 时代,只有一个 NameNode。如果该 NameNode 数据丢失或者不能工作,那么整个集群就不能恢复了。这是 hadoop1 中的单点问题,也是 hadoop1 不可靠的表现,如图 1 所示。hadoop2 就解决了这个问题。

国内最全最详细的 Hadoop2.2.0 集群的 HA 高可靠的最简单配置

图 1 

hadoop2.2.0 中 HDFS 的高可靠指的是可以同时启动 2 个 NameNode。其中一个处于工作状态,另一个处于随时待命状态。这样,当一个 NameNode 所在的服务器宕机时,可以在数据不丢失的情况下,手工 或者 自动 切换到另一个 NameNode 提供服务。

这些 NameNode 之间通过共享数据,保证数据的状态一致。多个 NameNode 之间共享数据,可以通过 Nnetwork File System 或者 Quorum Journal Node。前者是通过 linux 共享的文件系统,属于操作系统的配置;后者是 hadoop 自身的东西,属于软件的配置。

我们这里讲述使用 Quorum Journal Node 的配置方式,方式是手工切换。 

集群启动时,可以同时启动 2 个 NameNode。这些 NameNode 只有一个是 active 的,另一个属于 standby 状态。active 状态意味着提供服务,standby 状态意味着处于休眠状态,只进行数据同步,时刻准备着提供服务,如图 2 所示。

国内最全最详细的 Hadoop2.2.0 集群的 HA 高可靠的最简单配置

图 2 

架构 

在一个典型的 HA 集群中,每个 NameNode 是一台独立的服务器。在任一时刻,只有一个 NameNode 处于 active 状态,另一个处于 standby 状态。其中,active 状态的 NameNode 负责所有的客户端操作,standby 状态的 NameNode 处于从属地位,维护着数据状态,随时准备切换。

两个 NameNode 为了数据同步,会通过一组称作 JournalNodes 的独立进程进行相互通信。当 active 状态的 NameNode 的命名空间有任何修改时,会告知大部分的 JournalNodes 进程。standby 状态的 NameNode 有能力读取 JNs 中的变更信息,并且一直监控 edit log 的变化,把变化应用于自己的命名空间。standby 可以确保在集群出错时,命名空间状态已经完全同步了,如图 3 所示。

国内最全最详细的 Hadoop2.2.0 集群的 HA 高可靠的最简单配置

图 3 

为了确保快速切换,standby 状态的 NameNode 有必要知道集群中所有数据块的位置。为了做到这点,所有的 datanodes 必须配置两个 NameNode 的地址,发送数据块位置信息和心跳给他们两个。

对于 HA 集群而言,确保同一时刻只有一个 NameNode 处于 active 状态是至关重要的。否则,两个 NameNode 的数据状态就会产生分歧,可能丢失数据,或者产生错误的结果。为了保证这点,JNs 必须确保同一时刻只有一个 NameNode 可以向自己写数据。

硬件资源 

为了部署 HA 集群,应该准备以下事情:

* NameNode 服务器:运行 NameNode 的服务器应该有相同的硬件配置。

* JournalNode 服务器:运行的 JournalNode 进程非常轻量,可以部署在其他的服务器上。注意:必须允许至少 3 个节点。当然可以运行更多,但是必须是奇数个,如 3、5、7、9 个等等。当运行 N 个节点时,系统可以容忍至少(N-1)/ 2 个节点失败而不影响正常运行。

在 HA 集群中,standby 状态的 NameNode 可以完成 checkpoint 操作,因此没必要配置 Secondary NameNode、CheckpointNode、BackupNode。如果真的配置了,还会报错。

相关阅读

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

搭建 Hadoop 环境(在 Winodws 环境下用虚拟机虚拟两个 Ubuntu 系统进行搭建)http://www.linuxidc.com/Linux/2011-12/48894.htm

部署

 

以上配置完成后,就可以启动 JournalNode 进程了。在各个 JournalNode 机器上执行命令“Hadoop-daemon.sh journalnode”。

 

如果是一个新的 HDFS 集群,还要首先执行格式化命令“hdfs namenode -format”,紧接着启动本 NameNode 进程。

如果存在一个已经格式化过的 NameNode,并且已经启动了。那么应该把该 NameNode 的数据同步到另一个没有格式化的 NameNode。在未格式化过的 NameNode 上执行命令“hdfs namenode -bootstrapStandby”。

如果是把一个非 HA 集群转成 HA 集群,应该运行命令“hdfs –initializeSharedEdits”,这会初始化 JournalNode 中的数据。

 

做了这些事情后,就可以启动两个 NameNode 了。启动成功后,通过 web 页面观察两个 NameNode 的状态,都是 standby。

 

下面执行命令“hdfs haadmin -failover –forcefence serviceId serviceId2”。就会把 NameNode 的状态进行安全的切换。其中后面一个会变为 active 状态。这时候再通过 web 页面观察就能看到正确结果了。

 

管理员命令

 

执行命令“hdfs haadmin”,会显示子命令列表,如下

Usage: DFSHAAdmin [-ns <nameserviceId>]
    [-transitionToActive <serviceId>]
    [-transitionToStandby <serviceId>]
    [-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]
    [-getServiceState <serviceId>]
    [-checkHealth <serviceId>]
    [-help <command>]

 

如果要查看具体用法,使用“hdfs  haadmin  -help  <command>”。其中,

 

transitionToActivetransitionToStandby 是用于在不同状态之间切换的。这些命令没有任何防护错误,很少使用。

 

failover 初始化一个故障恢复。该命令会从一个失效的 NameNode 切换到另一个上面。

 

getServiceState 获取当前 NameNode 的状态。

 

checkHealth 检查 NameNode 的状态。正常就返回 0,否则返回非 0 值。

 

以下是我的详细安装过程描述:

1. 确定集群结构

我这里采用 5 台虚拟机,内存是 512MB,硬盘是 20GB,以下是我对这 5 台机器的角色分配。

ip 地址 主机名 NameNode JournalNode DataNode
192.168.80.100 hadoop100
192.168.80.101 hadoop101
192.168.80.102 hadoop102
192.168.80.103 hadoop103
192.168.80.104 hadoop104

 

2. 设置 linux、安装 jdk

 

首先在 VMWare 中安装一台虚拟机,设置 ssh 免密码登录、设置静态 ip 为 192.168.80.100、设置主机名为 hadoop100、编辑 /etc/hosts 文件、安装 jdk 等,这些内容参考作者前面的文章。不再累述。

然后修改 hadoop 的配置文件,下面重点描述。

 

2.1 编辑文件 $HADOOP_HOME/etc/hadoop/hadoop-env.sh,修改一行内容如下

export JAVA_HOME=/usr/local/jdk

把这里的 JAVA_HOME 前面的 #去掉,把值改为自己安装的 jdk 路径;

 

2.2 编辑文件 $HADOOP_HOME/etc/hadoop/core-site.xml,修改内容如下所示

<configuration>

<property>

<name>hadoop.tmp.dir</name>

<value>/usr/local/hadoop/tmp</value>

</property>

<property>

<name>fs.default.name</name>

<value>hdfs://hadoop100:9000</value>

</property>

</configuration>

以上配置中,name 是 hadoop.tmp.dir 的值表示 hadoop 存放数据的目录,即包括 NameNode 的数据,也包括 DataNode 的数据。该路径任意指定,只要实际存在该文件夹即可。

name 是 fs.defaultFS 的值表示 hdfs 路径的逻辑名称。因为我们会启动 2 个 NameNode,每个 NameNode 的位置不一样,那么切换后,用户也要修改代码,很麻烦,因此使用一个逻辑路径,用户就可以不必担心 NameNode 切换带来的路径不一致问题了。

 

2.3 编辑文件 $HADOOP_HOME/etc/hadoop/hdfs-site.xml,修改内容如下所示
<configuration>

<property>

<name>dfs.replication</name>

<value>2</value>

</property>

<property>

<name>dfs.nameservices</name>

<value>cluster1</value>

</property>

<property>

<name>dfs.ha.namenodes.cluster1</name>

<value>hadoop100,hadoop101</value>

</property>

<property>

<name>dfs.namenode.rpc-address.cluster1.hadoop100</name>

<value>hadoop100:9000</value>

</property>

<property>

<name>dfs.namenode.rpc-address.cluster1.hadoop101</name>

<value>hadoop101:9000</value>

</property>

<property>

<name>dfs.namenode.http-address.cluster1.hadoop100</name>

<value>hadoop100:50070</value>

</property>

<property>

<name>dfs.namenode.http-address.cluster1.hadoop101</name>

<value>hadoop101:50070</value>

</property>

<property>

<name>dfs.namenode.shared.edits.dir</name>

<value>qjournal://hadoop100:8485;hadoop101:8485;hadoop102:84

85/cluster1</value>

</property>

<property>

<name>dfs.client.failover.proxy.provider.cluster1</name>

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredF

ailoverProxyProvider</value>

</property>

<property>

<name>dfs.ha.fencing.methods</name>

<value>sshfence</value>

</property>

<property>

<name>dfs.ha.fencing.ssh.private-key-files</name>

<value>/root/.ssh/id_rsa</value>

</property>

<property>

<name>dfs.journalnode.edits.dir</name>

<value>/usr/local/hadoop/tmp/journal</value>

</property>

</configuration>

 

以上配置信息在前面的描述中已经做了解释。

 

2.4 编辑文件 $HADOOP_HOME/etc/hadoop/slaves,修改内容如下所示

hadoop102

hadoop103

hadoop104

表示以上三个节点作为 DataNode 节点。

 

3. 使用虚拟机再复制出 4 个虚拟机。把 ip 和主机名修改一下,同时修改 /etc/hosts 文件。在这里要确保 5 个节点之间互相都可以使用 ssh 免密码登录。

 

4. 执行命令启动集群

以下命令严格注意执行顺序,不能颠倒!

 

4.1 启动 JournalNode 集群

在 hadoop100、hadoop101、hadoop102 上,执行命令 hadoop-daemon.sh start journalnode

 

4.2 格式化一个 NameNode

在 hadoop100 执行命令 hdfs namenode –format

 

4.3 启动一个 NameNode

在 hadoop100 执行命令 hadoop-daemon.sh start namenode

 

4.4 格式化另一个 NameNode

在 hadoop101 执行命令 hdfs namenode -bootstrapStandby

 

4.5 启动另一个 NameNode

在 hadoop101 执行命令 hadoop-daemon.sh start namenode

这时候,使用浏览器访问 http://hadoop100:50070 和 http://hadoop101:50070。如果能够看到两个页面,证明 NameNode 启动成功了。这时,两个 NameNode 的状态都是 standby。

 

4.6 转换 active

在 hadoop100 执行命令 hdfs haadmin -transitionToActive hadoop100

再使用浏览器访问 http://hadoop100:50070 和 http://hadoop101:50070,会发现 hadoop100 节点变为 active,hadoop101 还是 standby。

 

4.7 启动 DataNodes

在 hadoop100 执行命令 hadoop-daemons.sh start datanode 会启动 3 个 DataNode 节点。

 

这时候 HA 集群就启动了。

 

你如果想实验一下 NameNode 切换,执行命令 hdfs haadmin –failover –forceactive hadoop100 hadoop101

这时候观察 hadoop100 和 hadoop101 的状态,就会发现,已经改变了。

 

如果向上传数据,还需要修改 core-site.xml 中的 fs.default.name 的值,改为 hdfs://hadoop101:9000 才行。

 

如果有的同学配置失败,可以使用我的一键运行脚本,hadoop 目录是 /usr/local/hadoop,一键脚本放在该目录即可。使用 root 用户登录运行。下载地址是

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是www.linuxidc.com

具体下载目录在 /2014 年资料 / 1 月 /25 日 / 国内最全最详细的 Hadoop2.2.0 集群的 HA 高可靠的最简单配置

下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm

关于 hadoop2 的其他配置文章,欢迎持续关注。

更多 Hadoop 相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计11152字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中