hadoop+Zookeeper=HA(超级详细)

N.1 HighAvailable概述

1)所谓HA(high available),即高可用(7*24小时不中断服务)。

2)实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。

3)Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。

4)NameNode主要在以下两个方面影响HDFS集群

(1)NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启

(2)NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用

5)HDFS HA功能通过配置Active/Standby两个nameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。

N.2 HDFS-HA工作机制

0)故障迁移

(1)如果”主节点-A”挂了,这时候它所注册的节点”master-00001″将被自动删除,ZooKeeper会自动感知节点的变化,然后再次发出选举,这时候”主节点-B”将在选举中获胜,替代”主节点-A”成为新的主节点。

1)前面学习了使用命令hdfs haadmin -failover手动进行故障转移,在该模式下,即使现役(Ative状态)NameNode已经失效,系统也不会自动从现役NameNode转移到待机NameNode,下面学习如何配置部署HA自动进行故障转移。自动故障转移为HDFS部署增加了两个新组件:ZooKeeper和ZKFailoverController(ZKFC)进程。ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。

HA的自动故障转移依赖于ZooKeeper的以下功能:

2)故障检测:集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。

3)现役NameNode选择:ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。

ZKFC是自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。每个运行NamNode的主机运行了一个ZKFC进程,ZKFC负责:

4)健康监测:ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。

5)ZooKeeper会话管理:当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。

6)基于ZooKeeper的选择:如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为active。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役NameNode,然后本地NameNode转换为active状态。

N.3 HDFS-HA集群配置

N.3.1 规划集群

节点1

节点2

节点3

NameNode(运行的)

JournalNode (共享edit的进程)

DataNode

QuorumPeerMain(ZK进程)

DFSZKFailoverController(ZK客户端)    

NameNode(备份替换)

JournalNode  

DataNode

QuorumPeerMain  

DFSZKFailoverController

JournalNode

DataNode

QuorumPeerMain

ResourceMnager(运行)

NodeManager

ResourceMnager(备份替换)

NodeManager

              NodeManager   

N.3.2 HDFS-HA集群配置

1)起始先修改IP地址

(1)修改每台的克隆主机的ip(克隆比较方便),确保关闭防火墙:

(2)命令vi /etc/sysconfig/network-scripts/ifcfg-ens33 还要添加DNS2=8.8.4.4 注意网卡名字不唯一。

(3)命令vi /etc/resolv.conf 添加 nameserver 8.8.4.4(这里配置的8.8.4.4相当于一个备份,没有等于号)

(4)重启网卡:service network restart

2)以下完成linux中ip域名和主机名设置。

(1)vi /etc/hosts:ip1 主机名1(域名),ip2 主机2(域名)、ip3 主机3(域名) 一般情况。

(2)vi /etc/hostname:主机名和域名是最好的。设置自己的主机名1,除了这里是一个主机名,其它的配置都是些域名 。

3)安装hadoop

(1)在/softWare目录下创建一个HA文件夹,mkdir HA

(2)将hadoop-2.8.4安装在到/softWare/HA目录下,使用wincp上传,进行解压。

(3)以前Linux的hadoop的环境变量要修改,这里创建了HA目录

4)以下完成linux的hadoop和jdk环境变量

(1)jdk和Hadoop安装后配置以下文件

vi /etc/profile (尾行添加如下)。

export JAVA_HOME=jdk解压路径 。

export HADOOP_HOME=/softWare/HA/hadoop-2.8.4

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME\bin:$HADOOP_HOME\sbin

(冒号表示分割路径,$表示引用)

:wq

source /etc/profile

(2)运行javac和java、java -version 测试命令是否成功。

(3)测试命令Hadoop和Hadoop version。而JAVA是Java version,他们参数不一样。

5)SH无密码登录

(1)生成公钥和私钥命令:ssh-keygen -t rsa

(2)然后敲(三个回车)、就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

将公钥拷贝到要免密登录的目标机器上,也就是配置秘钥库。在主机1下配置如下:这样主机1访问别的主机的时候,就不需要密码,同时主机也要给自己配置免密。(如果出错一般是vi /etc/hosts里面配置错了)

ssh-copy-id 主机名1(域名)、ssh-copy-id 主机名2、ssh-copy-id 主机名3

[1] 注:在另外两台机器上分别执行,共执行9遍

[2] 远程访问命令:ssh 主机名(域名)。

[3] 在~/.ssh的目录下有一下文件:

1. known_hosts :记录ssh访问过计算机的公钥(public key)

2. id_rsa :生成的私钥

3. id_rsa.pub :生成的公钥

4. authorized_keys :存放授权过得无秘登录服务器公钥,每个节点都有记录,配置秘钥库的时候,才会有这个目录的出现。

6)zookeeper分布式安装部署

(1)集群规划

在bigdata111、bigdata112和bigdata113三个节点上部署Zookeeper。

(2)解压安装

[1] 解压zookeeper安装包到/softWare/目录下

[itstar@bigdata111 softWare]$ tar  -zxvf  zookeeper-3.4.10.tar.gz  -C  /softWare/

[2] 在/softWare/zookeeper-3.4.10/这个目录下创建zkData(由于存放数据的目录)

mkdir  -p  zkData

[3] 重命名/softWare/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg

配置文件只识别zoo.cfg;

mv  zoo_sample.cfg  zoo.cfg

(3)配置环境变量

[root@bigdata111 softWare]$ vi /etc/profile

export ZOOKEEPER_HOME=/softWare/zookeeper-3.4.10

export PATH=$PATH:$ZOOKEEPER_HOME/bin(也可以在原来的PATH后面拼接上去)

:wq

[root@bigdata111 softWare]$source /etc/profile

(4)配置zoo.cfg文件修改

[1] 具体配置:

dataDir=/softWare/zookeeper-3.4.10/zkData

在增加如下配置:

#######################注释cluster##########################

server.1=bigdata111:2888:3888

server.2=bigdata112:2888:3888

server.3=bigdata113:2888:3888

[2] 配置参数解读

Server.A=B:C:D

A是一个数字,表示这个是第几号(myid文件)服务器;

B是这个服务器的ip地址;

C是这个服务器与集群中的Leader服务器交换信息的端口;

D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,

而这个端口就是用来执行选举时服务器相互通信的端口。

集群模式下配置一个文件myid,这个文件在dataDir=/softWare/zookeeper-3.4.10/zkData目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。

(5)集群操作

[1] 在/softWare/zookeeper-3.4.10/zkData目录下创建一个myid的文件

touch myid

添加myid文件,注意一定要在linux里面创建,在notepad++里面很可能乱码

[2] 编辑myid文件

vi myid

在文件中添加与server对应的编号:如 2 。

[3] 拷贝配置好的zookeeper到其他机器上

        scp -r zookeeper-3.4.10/ root@bigdata112.itstar.com:/softWare/

        scp -r zookeeper-3.4.10/ root@bigdata113.itstar.com:/softWare/

        并分别修改myid文件中内容为3、4自定义。

[4] 分别启动zookeeper

       [root@bigdata111 zookeeper-3.4.10]# bin/zkServer.sh start

       [root@bigdata112 zookeeper-3.4.10]# bin/zkServer.sh start

       [root@bigdata113 zookeeper-3.4.10]# bin/zkServer.sh start

[5] 查看状态

       [root@bigdata111 zookeeper-3.4.10]# bin/zkServer.sh status

       JMX enabled by default

       Using config: /softWare/zookeeper-3.4.10/bin/../conf/zoo.cfg

       Mode: follower

       [root@bigdata112 zookeeper-3.4.10]# bin/zkServer.sh status

       JMX enabled by default

       Using config: /softWare/zookeeper-3.4.10/bin/../conf/zoo.cfg

       Mode: leader

       [root@bigdata113 zookeeper-3.4.5]# bin/zkServer.sh status

       JMX enabled by default

       Using config: /softWare/zookeeper-3.4.10/bin/../conf/zoo.cfg

       Mode: follower

7)完成Hadoop中的环境变量配置和文件配置

(1)配每个节点vi /softWare/HA/hadoop-2.8.4/etc/hadoop/hadoop-env.sh文件,添加环境变量:

export JAVA_HOME=/softWare/jdk1.8.0_144(注:是自己安装的路径)

在添加的时候,注意前面是不是有“#”号。有#号就要注释掉。

(2)配置每个节点vi /softWare/HA/hadoop-2.8.4/etc/hadoop/core-site.xml文件,

可以先配置好一个节点的hadoop环境到时候在考培到其它节点。

<configuration>

<!-- 把两个NameNode)的地址组装成一个集群mycluster -->

                 <property>

                         <name>fs.defaultFS</name>

                <value>hdfs://mycluster</value>

                 </property>

                 <!-- 指定hadoop运行时产生文件的存储目录 -->

                 <property>

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

                         <value>/softWare/HA/hadoop-2.8.4/data</value>

                 </property>

<!--注册zookeeper信息,没有添加这步将会手动-->

<property>

         <name>ha.zookeeper.quorum</name>

        <value>域名1:2181,域名2:2181,域名3:2181</value>

</property>

<!--修改core-site.xml中的ipc参数,防止出现连接journalnode服务ConnectException-->

<property>

   <name>ipc.client.connect.max.retries</name>

   <value>300</value>

   <description>

Indicates the number of retries a client will make to establish a server connection.

   </description>

</property>

<property>

   <name>ipc.client.connect.retry.interval</name>

   <value>40000</value>

   <description>

Indicates the number of milliseconds a client will wait

for before retrying to establish a server connection.

   </description>

 </property>

</configuration>

(3)配置每个节点vi /softWare/HA/hadoop-2.8.4/etc/hadoop/hdfs-site.xml文件。

<configuration>

        <!-- 完全分布式集群名称,会ZK创建mycluster目录-->

        <property>

                 <name>dfs.nameservices</name>

                 <value>mycluster</value>

        </property>

        <!-- 集群中NameNode节点都有哪些-->

        <property>

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

                 <value>nn1,nn2</value>

        </property>

        <!-- nn1的RPC通信地址 -->

        <property>

                 <name>dfs.namenode.rpc-address.mycluster.nn1</name>

                 <value>nn1域名:9000</value>

        </property>

        <!-- nn2的RPC通信地址 -->

        <property>

                 <name>dfs.namenode.rpc-address.mycluster.nn2</name>

                 <value>nn2域名:9000</value>

        </property>

        <!-- nn1的http通信地址 -->

        <property>

                 <name>dfs.namenode.http-address.mycluster.nn1</name>

                 <value>nn1域名:50070</value>

        </property>

        <!-- nn2的http通信地址 -->

        <property>

                 <name>dfs.namenode.http-address.mycluster.nn2</name>

                 <value>nn2域名:50070</value>

        </property>

        <!-- 指定NameNode元数据在JournalNode上的存放位置 -->

        <property>

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

        <value>qjournal://nn1域名:8485;nn2域名:8485;nn3域名:8485/mycluster</value>

        </property>

        <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->

        <property>

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

                 <value>sshfence</value>

        </property>

        <!-- 使用隔离机制时需要ssh无秘钥登录,私钥-->

        <property>

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

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

        </property> 

        <!-- 声明journalnode服务器存储目录,特别注意目录被写错了-->

        <property>

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

                 <value>/softWare/HA/hadoop-2.8.4/data/jn</value>

        </property>

        <!-- 关闭权限检查-->

        <property>

                 <name>dfs.permissions.enable</name>

                 <value>false</value>

        </property>

        <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式,value里是类名-->

        <property>

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

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

        </property>

<!--增加自动切换,没有配置这个会手动切换-->

<property>

        <name>dfs.ha.automatic-failover.enabled</name>

         <value>true</value>

</property>

</configuration>

(4)配每个节点vi /softWare/HA/hadoop-2.8.4/etc/hadoop/slaves文件。

这个文件是存放DataNode节点的域名。如下:

域名1

域名2

域名3

8)完成Windows的文件配置。

start-yarn.sh 命令进行启动(注意在主节点上面启动该命令就可以,其它的从节点就会相应启动)

使用浏览器访问 ip.8088(这个端口访问rm的)

然后上传文件或目录的命令(注意linux和hdfs表示同一个文件下,hdfs也有自己的根目录):

hadoop fs -命令 (后面跟的命令是linux的命令)。

在hdfs创建目录 hadoop fs -mkdir /test

上传文件hadoop fs -put file /test

如果要游览器下载文件到自己电脑,

就在自己的电脑上C:\Windows\System32\drivers\etc\hots 的文件里面尾行 虚拟机的添加ip 域名。

使用notepad软件打开,编辑保存。

同时也可以进行域名访问。

jps命令查看jvm进程,NodeManager(nm),ResourceManager

9)格式化和同步

确保先启动zookeeper集群

(1)在各个节点上,输入以下命令启动journalnode服务(守护进程)在xshell发送所有会话:

        sbin/hadoop-daemon.sh start journalnode

(2)在[nn1]上,对其进行格式化(对其中的一个进行格式化,随便哪个格式化),并启动:

        bin/hdfs namenode -format (在主节点运行,如果下次格式化就要删除Hadoop下的data目录和logs,格式化会重新产生)

        sbin/hadoop-daemon.sh start namenode

(3)在[nn2]上,同步nn1的元数据信息:

        bin/hdfs namenode -bootstrapStandby

(4)启动[nn2]:

        sbin/hadoop-daemon.sh start namenode

(5)自动切切换是同过fuser命令切换的,有些系统没有该命令,所以安装这个命令。

yum -y install psmisc

或使用yum search fuser

(6)关闭所有HDFS服务:

sbin/stop-dfs.sh(在主节点运行,反正涉及多个启动,就只需在主节点运行即可)

(7)启动Zookeeper集群(使用xshell发送会话):

bin/zkServer.sh start如果前面启动了就不要启动

(8)初始化HA在Zookeeper中状态(选择要做为active或standby的节点,进行初始化)

[root@bigData111 hadoop-2.8.4]# bin/hdfs zkfc -formatZK

谁先启动zkfc就是 active。

(9)初始化后查看是否有产生了初始化的hadoop-ha目录,如果产生了,就说明成功了。

如错误了,就看它的提示错误了哪个文件哪一行。

[root@bigData111 hadoop]# zkCli.sh

[zk: localhost:2181(CONNECTED) 0] ls /

[zookeeper, hadoop-ha] (如果重新格式化就要删除hadoop-ha)

(产生hadoop-ha的这个文件不要乱操作,不然自动节点切换会异常)

(10)启动HDFS服务:

这里是全部启动,所以那个节点先启动DFSZKFailoverController,谁就是active状态。

[root@bigData111 hadoop]#start-dfs.sh (在主节点运行)

[root@bigData111 hadoop]# jps

5121 Jps

4680 DataNode

4873 JournalNode

5051 DFSZKFailoverController

4573 NameNode

3999 QuorumPeerMain

(11)测试把active的namenode进程给杀死。

(12)查看是不是自动切换

hdfs haadmin -getServiceState nn2

也可以通过网页访问查看。

(13)在恢复杀死的进程

hadoop-daemon.sh start namenode

10)注意可能报错事项

(1)以下原因都是因为内存不足所导致的,只需要将虚拟机的内存调大点即可,但有时候调大点也没有用,所以,可以通过core-site.xml文件,调价参数。

(2)注意一:

如果启动了,使用start-all.sh ,过了一会 发现namenode自动挂了 ,说明是JournalNode:8485启动了慢才导致的,所以过了一会等JournalNode完全启动后,在单独启动namenode,就好了。namenode启动的很快,但JournalNode却启动的很慢。

(3)注意二:

在格式化的时候,如果出现了java.net.ConnetException拒绝连接,很可能是JournalNode:8485启动的慢所导致的,所以过了一会,在格式化反而没有报错。

(4)命令 netstat -anp |grep 8485 是查看这个端口JournalNode有没有启动

N.4 YARN-HA集群配置

1)基于上面步骤在进行,第一步yarn配置

(1)具体配置vi /softWare/HA/hadoop-2.8.4/etc/hadoop/yarn-site.xml

<configuration>

    <property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

    </property>

    <!--启用resourcemanager ha-->

    <property>

        <name>yarn.resourcemanager.ha.enabled</name>

        <value>true</value>

    </property>

    <!--声明两台resourcemanager的地址,会ZK集群创建cluster-yarn-目录-->

    <property>

        <name>yarn.resourcemanager.cluster-id</name>

        <value>cluster-yarn-</value>

    </property>

    <property>

        <name>yarn.resourcemanager.ha.rm-ids</name>

        <value>rm1,rm2</value>

    </property>

    <property>

        <name>yarn.resourcemanager.hostname.rm1</name>

        <value>域名1</value>

    </property>

    <property>

        <name>yarn.resourcemanager.hostname.rm2</name>

        <value>域名2</value>

    </property>

    <!--指定zookeeper集群的地址-->

    <property>

        <name>yarn.resourcemanager.zk-address</name>

        <value>域名1:2181,域名2:2181,域名3:2181</value>

    </property>

    <!--启用自动恢复-->

    <property>

        <name>yarn.resourcemanager.recovery.enabled</name>

        <value>true</value>

    </property>

    <!--指定resourcemanager的状态信息存储在zookeeper集群-->

    <property>

<name>yarn.resourcemanager.store.class</name>

<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>

</property>

</configuration>

(2)mapred-site.xml 里面没有这个文件 所以把这个后缀名删掉 .template

<configuration>

<!-- 指定mr运行在yarn上-->

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

</configuration>

2)第二步

(1)在选择active的节点上中执行:

sbin/start-yarn.sh

其它节点就单独启动(yarn不用格式化)

yarn-daemon.sh start resourcemanager

(2)在选择standby的节点中执行:

sbin/yarn-daemon.sh start resourcemanager

(3)产看是否产生yarn-leader-election节点

[root@bigData111 ~]# zkCli.sh

[zookeeper, yarn-leader-election, hadoop-ha, rmstore] (要删除yarn-leader-election也可以,启动会出现生成)

(4)查看服务状态(注意:yarn自动切换需要稍等下大概5到10秒,就切换成功)

在http的页面是看不出来的,所以只能通过命令来查看。

bin/yarn rmadmin -getServiceState rm1

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Hadoop是一个分布式计算框架,而Zookeeper是一个分布式协调服务。在Hadoop集群中,Zookeeper用于协调Hadoop集群中的各个节点,以确保它们之间的通信和同步。下面是Hadoop安装与配置Zookeeper的步骤: 1.安装Java环境 在安装HadoopZookeeper之前,需要先安装Java环境。可以从Oracle官网下载Java安装包,然后按照提示进行安装。 2.安装Hadoop 下载Hadoop安装包并解压缩,然后将解压缩后的文件夹移动到指定的目录下。接下来,需要编辑Hadoop的配置文件,包括core-site.xml、hdfs-site.xml和mapred-site.xml等文件,以便将Hadoop配置为适合您的环境。 3.安装Zookeeper 下载Zookeeper安装包并解压缩,然后将解压缩后的文件夹移动到指定的目录下。接下来,需要编辑Zookeeper的配置文件,包括zoo.cfg等文件,以便将Zookeeper配置为适合您的环境。 4.启动Zookeeper 在启动Zookeeper之前,需要确保已经启动了Hadoop集群。然后,可以使用以下命令启动Zookeeper: ``` bin/zkServer.sh start ``` 5.配置Hadoop使用ZookeeperHadoop的配置文件中,需要添加以下配置,以便Hadoop可以使用Zookeeper: ``` <property> <name>ha.zookeeper.quorum</name> <value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value> <description>A list of ZooKeeper servers used by the ZKFailoverController.</description> </property> ``` 6.测试Zookeeper 可以使用以下命令测试Zookeeper是否正常工作: ``` bin/zkCli.sh -server zk1.example.com:2181 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

研发咨询顾问

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值