Hadoop2.7.3 HA高可靠性集群搭建(Hadoop+Zookeeper)

一.概述

      在hadoop1时代,只有一个NameNode。如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了。这是hadoop1中的单点问题,也是hadoop1不可靠的表现。

     在典型的 HA 集群中,通常有两台不同的机器充当 NN。在任何时间,只有一台机器处于Active 状态;另一台机器是处于 Standby 状态。Active NN 负责集群中所有客户端的操作;而 Standby NN 主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢复。为了让 Standby NN 的状态和 Active NN 保持同步,即元数据保持一致,它们都将会和JournalNodes 守护进程通信。当 Active NN 执行任何有关命名空间的修改,它需要持久化到一半以上的 JournalNodes 上(通过 edits log 持久化存储),而 Standby NN 负责观察 edits log的变化,它能够读取从 JNS 中读取 edits 信息,并更新其内部的命名空间。一旦 Active NN出现故障,Standby NN 将会保证从 JNS 中读出了全部的 Edits,然后切换成 Active 状态。Standby NN 读取全部的 edits 可确保发生故障转移之前,是和 Active NN 拥有完全同步的命名空间状态。为了提供快速的故障恢复,Standby NN 也需要保存集群中各个文件块的存储位置。为了实现这个,集群中所有的 Database 将配置好 Active NN 和 Standby NN 的位置,并向它们发送块文件所在的位置及心跳,如下图所示:

       在任何时候,集群中只有一个 NN 处于 Active 状态是极其重要的。否则,在两个 Active NN的状态下 NameSpace 状态将会出现分歧,这将会导致数据的丢失及其它不正确的结果。为了保证这种情况不会发生,在任何时间,JNs 只允许一个 NN 充当 writer。在故障恢复期间,将要变成 Active 状态的 NN 将取得 writer 的角色,并阻止另外一个 NN 继续处于 Active状态。同时我们使用zookeeper。首先HDFS集群中的两个NameNode都在ZooKeeper中注册,当active状态的NameNode出故障时,ZooKeeper能检测到这种情况,它就会自动把standby状态的NameNode切换为active状态。。
为了部署 HA 集群,你需要准备以下事项:
(1)、NameNode machines:运行 Active NN 和 Standby NN 的机器需要相同的硬件配置;
(2)、JournalNode machines:也就是运行 JN 的机器。JN 守护进程相对来说比较轻量,所以这些守护进程可以和其他守护线程(比如 NN,YARN ResourceManager)运行在同一台机器上。在一个集群中,最少要运行 3 个 JN 守护进程,这将使得系统有一定的容错能力。当然,你也可以运行 3 个以上的 JN,但是为了增加系统的容错能力,你应该运行奇数个 JN(3、5、7 等),当运行 N 个 JN,系统将最多容忍(N-1)/2 个 JN 崩溃。在 HA 集群中,Standby NN 也执行namespace 状态的 checkpoints,所以不必要运行Secondary NN、CheckpointNode 和 BackupNode;事实上,运行这些守护进程是错误的。

二.Hadoop(HA)集群的搭建

系统环境:RHEL6.5 selinux and iptables is disabled
               Hadoop 、jdk、zookeeper 程序使用 nfs 共享同步配置文件
软件版本:hadoop-2.7.3.tar.gz zookeeper-3.4.9.tar.gz jdk-7u79-linux-x64.tar.gz
               hbase-1.2.4-bin.tar.gz
主机列表:

IP主机名角色
172.25.66.1

server1.example.com

NameNode
DFSZKFailoverController
ResourceManager
172.25.66.5server5.example.comNameNode
DFSZKFailoverController
ResourceManager
172.25.66.2server2.example.comJournalNode
QuorumPeerMain
DataNode
NodeManager
172.25.66.3server3.example.comJournalNode
QuorumPeerMain
DataNode
NodeManager
172.25.66.4server4.example.comJournalNode
QuorumPeerMain
DataNode
NodeManager

该实验中相关主机的配置可参考前两篇博客

server5:

[root@server5 ~]# yum install nfs-utils
[root@server5 ~]# useradd -u 800 hadoop
[root@server5 ~]# passwd hadoop
Changing password for user hadoop.
New password: 
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@server5 ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]
[root@server5 ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
[root@server5 ~]# mount 172.25.66.1:/home/hadoop/ /home/hadoop
[root@server5 ~]# su - hadoop
[hadoop@server5 ~]$ ls
hadoop        hadoop-2.7.3.tar.gz  jdk1.7.0_79
hadoop-2.7.3  java                 jdk-7u79-linux-x64.tar.gz

保证server1能不需要密码登陆server5

[hadoop@server5 ~]$ tar zxf zookeeper-3.4.9.tar.gz 
[hadoop@server5 ~]$ ls
hadoop               java                       zookeeper-3.4.9
hadoop-2.7.3         jdk1.7.0_79                zookeeper-3.4.9.tar.gz
hadoop-2.7.3.tar.gz  jdk-7u79-linux-x64.tar.gz
[hadoop@server5 ~]$ cd zookeeper-3.4.9
[hadoop@server5 zookeeper-3.4.9]$ ls
build.xml  dist-maven  ivy.xml  LICENSE.txt  src
conf       docs        lib      recipes      zookeeper-3.4.9.jar
[hadoop@server5 zookeeper-3.4.9]$ cd conf
[hadoop@server5 conf]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[hadoop@server5 conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@server5 conf]$ vim zoo.cfg  ##编辑zookeeper配置文件

各节点配置文件相同,并且需要在/tmp/zookeeper 目录中创建 myid 文件,写入一个唯一的数字,取值范围在 1-255。比如:172.25.0.2 节点的 myid 文件写入数字“1”,此数字与配置文件中的定义保持一致,(server.1=172.25.66.2:2888:3888)其它节点依次类推

在各节点启动服务,并查看状态

刚开始时出现了报错:

服务能够启动,但查看状态时显示not running

查看zookeeper.out日志文件,看有没有Error报错。通过报错,说明2181端口被占用,通过netstat -nltp | grep 2181检查是否已被占用,如果有则把对应的进程kill掉(kill 进程的pid),然后再启动zookeeper,问题解决

配置hadoop

server1:

1.编辑core-site.xml文件

<configuration>
<!-- 指定 hdfs 的 namenode 为 masters (名称可自定义)-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://masters</value>
</property>
<!-- 指定 zookeeper 集群主机地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>172.25.66.2:2181,172.25.66.3:2181,172.25.66.4:2181</value>
</property>
</configuration>

2.编辑hdfs-site.xml

<configuration>
<!-- 指定 hdfs 的 nameservices 为 masters,和 core-site.xml 文件中的设置保持一致 -->
<property>
     <name>dfs.nameservices</name>
     <value>masters</value>
</property>
<!-- masters 下面有两个 namenode 节点,分别是 h1 和 h2 (名称可自定义)-->
<property>
      <name>dfs.ha.namenodes.masters</name>
      <value>h1,h2</value>
</property>
<!-- 指定 h1 节点的 rpc 通信地址 -->
<property>
    <name>dfs.namenode.rpc-address.masters.h1</name>
    <value>172.25.66.1:9000</value>
</property>
<!-- 指定 h1 节点的 http 通信地址 -->
<property>
    <name>dfs.namenode.http-address.masters.h1</name>
    <value>172.25.66.1:50070</value>
</property>
<!-- 指定 h2 节点的 rpc 通信地址 -->
<property>
     <name>dfs.namenode.rpc-address.masters.h2</name>
     <value>172.25.66.5:9000</value>
</property>
<!-- 指定 h2 节点的 http 通信地址 -->
<property>
     <name>dfs.namenode.http-address.masters.h2</name>
     <value>172.25.66.5:50070</value>
</property>
<!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
<property>
     <name>dfs.namenode.shared.edits.dir</name>
     <value>qjournal://172.25.66.2:8485;172.25.66.3:8485;172.25.66.4:8485/masters</value>
</property>
<!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
<property>
     <name>dfs.journalnode.edits.dir</name>
     <value>/tmp/journaldata</value>
</property>
<!-- 开启 NameNode 失败自动切换 -->
<property>
     <name>dfs.ha.automatic-failover.enabled</name>
     <value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
    <name>dfs.client.failover.proxy.provider.masters</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvid
er</value>
</property>
<!-- 配置隔离机制方法,每个机制占用一行-->
<property>
    <name>dfs.ha.fencing.methods</name>
    <value>
       sshfence
       shell(/bin/true)
    </value>
</property>
<!-- 使用 sshfence 隔离机制时需要 ssh 免密码 -->
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置 sshfence 隔离机制超时时间 -->
<property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
</property>
</configuration>

3.编辑slaves文件

4. 启动 hdfs 集群(按顺序启动)
1)在三个 DN 上依次启动 zookeeper 集群

2)在三个 DN 上依次启动 journalnode(第一次启动 hdfs 必须先启动 journalnode)

3)格式化 HDFS 集群

Namenode 数据默认存放在/tmp,需要把数据拷贝到 h2

[hadoop@server1 hadoop]$ bin/hdfs namenode -format
[hadoop@server1 hadoop]$ scp -r /tmp/hadoop-hadoop/ 172.25.66.5:/tmp

4)格式化 zookeeper (只需在 h1 上执行即可)

[hadoop@server1 hadoop]$ bin/hdfs zkfc -formatZK


5)启动 hdfs 集群(只需在 h1 上执行即可)

6) 查看各节点状态

查看各节点状态中出现的错误:

1.发现server3的nodedata节点启动失败,查看日志

原因:每次namenode format会重新创建一个namenodeId,而data目录包含了上次format时的id,namenode format清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空data下的所有目录.

解决办法:停掉集群,删除问题节点的data目录下的所有内容。即hdfs-site.xml文件中配置的dfs.data.dir目录。重新格式化namenode。

[hadoop@server3 hadoop]$ cd /tmp/
[hadoop@server3 tmp]$ ls
hadoop-hadoop
hsperfdata_hadoop
Jetty_0_0_0_0_8480_journal____.8g4awa
Jetty_localhost_36989_datanode____.h3ojj6
Jetty_localhost_47197_datanode____btc3o3
Jetty_localhost_48545_datanode____cjqes9
Jetty_localhost_51373_datanode____ssfp22
Jetty_localhost_54872_datanode____.936znp
Jetty_localhost_58314_datanode____f00o6y
Jetty_localhost_60332_datanode____qvofjz
journaldata
zookeeper
[hadoop@server3 tmp]$ rm -rf Jetty_*
[hadoop@server3 tmp]$ ls
hadoop-hadoop  hsperfdata_hadoop  journaldata  zookeeper

2.两个namenode启动不起来

查看日志: cat hadoop-hadoop-namenode-server5.log

原因:namenode元数据被破坏,需要修复
解决:恢复一下namenode

cd 
cd hadoop 
./bin/hadoop namenode -recover

在浏览器中进行测试:

7) 测试故障自动切换

因为server5是处于active的namenode节点,所以kill掉server5的NameNode进程

刷新发现active跳到server1上:实现高可用

重新开启server5的namenode:

刷新后server5变为可standby状态

到此 hdfs 的高可用完成

三、yarn 的高可用

server1:

1) 编辑 mapred-site.xml 文件

指定yarn为mapreduce的框架

2)编辑 yarn-site.xml 文件

<configuration>
<!-- 配置可以在 nodemanager 上运行 mapreduce 程序 -->
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<!-- 激活 RM 高可用 -->
<property>
   <name>yarn.resourcemanager.ha.enabled</name>
   <value>true</value>
</property>
<!-- 指定 RM 的集群 id -->
<property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>RM_CLUSTER</value>
</property>
<!-- 定义 RM 的节点-->
<property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
</property>
<!-- 指定 RM1 的地址 -->
<property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>172.25.66.1</value>
</property>
<!-- 指定 RM2 的地址 -->
<property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>172.25.66.5</value>
</property>
<!-- 激活 RM 自动恢复 -->
<property>
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
</property>
<!-- 配置 RM 状态信息存储方式,有 MemStore 和 ZKStore-->
<property>
   <name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</
value>
</property>
<!-- 配置为 zookeeper 存储时,指定 zookeeper 集群的地址 -->
<property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>172.25.66.2:2181,172.25.66.3:2181,172.25.66.4:2181</value>
</property>
</configuration>

3)启动 yarn 服务

RM2 上需要手动启动

4) 测试 yarn 故障切换

server5的RM web服务被重定向到活跃的RM。

kill 掉server1的RS进程

server5的RS状态变为了active

四、部署hbase

HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。 就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop 项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

[hadoop@server1 ~]$ tar zxf hbase-1.2.4-bin.tar.gz 
[hadoop@server1 ~]$ ls
hadoop               hbase-1.2.4-bin.tar.gz     zookeeper-3.4.9
hadoop-2.7.3         java                       zookeeper-3.4.9.tar.gz
hadoop-2.7.3.tar.gz  jdk1.7.0_79
hbase-1.2.4          jdk-7u79-linux-x64.tar.gz
[hadoop@server1 ~]$ cd hbase-1.2.4
[hadoop@server1 hbase-1.2.4]$ cd
[hadoop@server1 ~]$ cd hbase-1.2.4/conf/
[hadoop@server1 conf]$ ls
hadoop-metrics2-hbase.properties  hbase-policy.xml  regionservers
hbase-env.cmd                     hbase-site.xml
hbase-env.sh                      log4j.properties
[hadoop@server1 conf]$ vim hbase-env.sh 

export JAVA_HOME=/home/hadoop/java   #指定 jdk
export HBASE_MANAGES_ZK=false    #默认值是 true,hbase 在启动时自动开启 zookeeper,如需自己维护 zookeeper 集群需设置为 false
export HADOOP_HOME=/home/hadoop/hadoop #指定 hadoop 目录,否则 hbase无法识别 hdfs 集群配置。

2)编辑hbase-site.xml

<configuration>
  指定 region server 的共享目录,用来持久化 HBase。这里指定的 HDFS 地址
是要跟 core-site.xml 里面的 fs.defaultFS 的 HDFS 的 IP 地址或者域名、端口必须一致
       <property>
       <name>hbase.rootdir</name>
       <value>hdfs://masters/hbase</value>
       </property>
  启用 hbase 分布式模式
       <property>
       <name>hbase.cluster.distributed</name>
       <value>true</value>
       </property>
       <property>
  Zookeeper 集群的地址列表,用逗号分割。默认是 localhost,是给伪分布式用
的。要修改才能在完全分布式的情况下使用
       <name>hbase.zookeeper.quorum</name>
       <value>172.25.66.2,172.25.66.3,172.25.66.4</value>
       </property>
  指定数据拷贝 2 份,hdfs 默认是 3 份
       <property>
       <name>dfs.replication</name>
       <value>2</value>
       </property>
  指定 hbase 的 master
       <property><name>hbase.master</name>
       <value>h1</value>
       </property>
</configuration>

3)编辑regionservers

4)启动 hbase

5)备节点运行:

HBase Master 默认端口时 16000,还有个 web 界面默认在 Master 的 16010 端口上,HBase RegionServers 会默认绑定 16020 端口,在端口 16030 上有一个展示信息的界面。

6) 测试

[hadoop@server1 hbase-1.2.4]$ bin/hbase shell

继续通过HBase Shell,HBase的命令行工具查看,发现数据并没有丢失

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值