Hadoop集群高可用及zookeeper+kafka组件搭建

Posted kali_yao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop集群高可用及zookeeper+kafka组件搭建相关的知识,希望对你有一定的参考价值。

目录

一.Hadoop集群高可用

1.Zookeeper概述

1)Zookeeper基本概述

3)Zab协议

3)observer

4)zookeeper集群图例

2.zookeeper集群搭建

3.zookeeper集群管理

4.kafka集群

1)Kafka的概述

5.Hadoop高可用

1)高可以概述

3)集群配置文件

 4)官网查看书写配置

5)初始化启动集群

5)验证集群


一.Hadoop集群高可用

角色与配置

主机名IP地址角色服务
hadoop1192.168.1.50namenode, resourcemanager, ZKFC
hadoop2192.168.1.56namenode, resourcemanager, ZKFC
node-0001192.168.1.51datanode, nodemanager, zookeeper, journalnode
node-0002192.168.1.52datanode, nodemanager, zookeeper, journalnode
node-0003192.168.1.53datanode, nodemanager, zookeeper, journalnode

1.Zookeeper概述

1)Zookeeper基本概述

Zookeeper是什么

-Zookeeper是一个开源的分布式应用程序协调服务

Zookeeper能做什么

-Zookeeper是用来保证数据在集群间的事务一致性

Zookeeper应用场景

-集群分布式锁

-集群统一命名服务

-分布式协调服务

锁的机制概述,(在前面写的就会待定)

 

2)Zookeeper角色与特性(Leader,和Follower)

-Leader:接受所有Follower的提案请求并统一协调发起提案的投票,负责与所有的Follower进行内部数据交换 识

-Follower:直接为客户端服务并参与提案的投票,同时与 Leader进行数据交换

-0bserver:直接为客户端服务但并不参与提案的投票,同时也与Leader进行数据交换

Zookeeper角色与选举

-服务在启动的时候是没有角色的(LOOKING),角色是通过选举产生的

-选举产生一个Leader,剩下的是Follower选举Leader原则

-集群中超过半数机器投票选择Leader

   -假如集群中拥有n台服务器,那么Leader 必须得到(n/2+1)台服务器的投票

Zookeeper的高可用

-如果Leader死亡,重新选举Leader

-如果死亡的机器数量达到一半,则集群挂掉

-如果无法得到足够的投票数量,就重新发起投票,如果参与投票的机器不足n/2+1,则集群停止工作

-如果Follower死亡过多,剩余机器不足n/2+1,则集群也会停止工作

   -Observer不计算在投票总设备数量里面

Zookeeper可伸缩扩展性原理与设计

-Leader所有写相关操作

-Follower读操作与响应Leader提议

-在0bserver出现以前,Zookeeper的伸缩性由Follower来实现,我们可以通过添加Follower节点的数量来保证 ;Zookeeper服务的读性能,但是随着Follower节点数量的增加,Zookeeper服务的写性能受到了影响

   -客户端提交一个请求,若是读请求,则由每台Server的本地副本数据库直接响应。若是写请求,需要通过一致性协议(Zab)来处理

3)Zab协议

-Zab协议规定:来自Client的所有写请求都要转发给集群中唯一的Leader。

-当Leader收到一个写请求时就会发起一个提案进行投票。然后其他的Server对该提案进行投票。之后Leader收集投票的结果,当投票数量过半时Leader会向所有的Server发送一个通知消息。

最后当Client所连接的Server收到该消息时,会把该操作更新并对Client的写请求做出回应

Zab协议写性能问题

-ZooKeeper在上述协议中实际扮演了两个职能。一方面从客户端接受连接与操作请求,另一方面对操作结果进行投票。这两个职能在集群扩展的时候彼此制约

   -从Zab协议对写请求的处理过程中可以发现,增加Follower的数量,则增加了协议投票过程的压力。因为Leader节点必须等待集群中过半Server响应投票,是节点的增加使得部分计算机运行较慢,从而拖慢整个投票过程的可能性也随之提高,随着集群变大,写操作也会随之下降

3)observer

为了解决上述问题

-我们不得不在增加集群规模和保持较好吞吐性能之间进行权衡。为了打破这一耦合关系,我们引入了不参与投票的服务器Observer。

-0bserver可以接受客户端的连接,并将写请求转发给 Leader节点。

   -但Leader节点不会要求Observer参加投票,仅仅在上述第3步那样,和其他服务节点一起得到投票结果

总:

  • Observer的扩展,给Zookeeper的可伸缩性带来了全新的景象。加入很多Observer节点,无须担心严重影响写吞吐量。0bserver提升读性能的可伸缩性,并且还提供了提供了广域网能力

  • 但0bserver并非是无懈可击,因为协议中的通知阶段,仍然与服务器的数量呈线性关系。但是这里的串行开销非常低。因此,可以认为在通知服务器阶段不会成为瓶颈

  • zookeeper集群本身具有很好的高可用特性

  • leader死亡后会重新选举新的leader,这个过程完全是自动的,不需要人工干预,fllower是多个节点,其中部分死亡后其他节点还可以继续工作

  • 不管是leader还是fllower,死亡的总数不能达到(n/2)台,否则集群挂起,observer不计算在高可用里面

4)zookeeper集群图例

zookeeper最小集群是三台,加上一台oberver

2.zookeeper集群搭建

下载软件包

/dist/zookeeper 的索引 (apache.org)

~]# wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz

~]# yum install -y java-1.8.0-openjdk-devel
~]# tar zxf zookeeper-3.4.13.tar.gz
~]# mv zookeeper-3.4.13 /usr/local/zookeeper

~]# cd /usr/local/zookeeper/conf/
# 拷贝模板文件,zoo.cfg默认是单机版,组建集群,在文件的末尾添加集群节点,只要指定observer,其他的角色让服务自己选举
~]# cp zoo_sample.cfg zoo.cfg
~]# vim zoo.cfg
# 配置文件最后添加
server.1=node-0001:2888:3888
server.2=node-0002:2888:3888
server.3=node-0003:2888:3888
server.4=hadoop1:2888:3888:observer
# server.运行id=主机名称:端口:范围:observer(角色)

# 给每个节点都同步一个
~]# for i in node-0001..0003;do
                      rsync -aXSH --delete /usr/local/zookeeper $i:/usr/local/
                  done

注:在所有节点手工启动服务

# 创建datadir指定的目录
~]# mkdir /tmp/zookeeper
# 在目录下创建myid文件,文件内容为主机运行id-myid文件中只有一个数字,注意:每个服务对应ID
~]# grep -Po "\\d+(?==$HOSTNAME)" /usr/local/zookeeper/conf/zoo.cfg >/tmp/zookeeper/myid
~]# /usr/local/zookeeper/bin/zkServer.sh start
~]# jps
1001 QuorumPeerMain
# 启动一台是无法启动集群的需要都做如上配置

注:-server.id中的id与myid中的id必须一一对应 -id的范围是1~255

当所有节点启动完成以后使用命令验证:

~]# /usr/local/zookeeper/bin/zkServer.sh status

 记录一个报错

当都执行之后我发现还是没有启动

 但是进程启动了

这边最后配置文件对比发现id都是4而没有在对应机器配置对应的id,设置之后还是一样,再次排查之后发现可能是配置文件中指定节点所使用的主机名不一致,这里就再次操作

## 1.直接在hadoop1机器上直接删除zookeeper目录
# 来执行写一个脚本
~]# cat ceshi.sh 
#!/bin/bash
for i in hadoop1 node-1..3;do echo $i; ssh $i $1;  done
~]# chmod +x   ceshi.sh 
# 关闭zookeeper
~]# ./ceshi.sh "/usr/local/zookeeper/bin/zkServer.sh stop"
# 删除目录
~]# ./ceshi.sh "rm -rf /usr/local/zookeeper"
~]# ./ceshi.sh "rm -rf /tmp/zookeeper"

## 2.设置主机名与hosts
# 设置主机名
hadoop1]#  hostnamectl set-hostname hadoop1
01]# hostnamectl set-hostname node-1
02]# hostnamectl set-hostname node-2
03]# hostnamectl set-hostname node-3
# 添加hosts
hadoop1]# vim /etc/hosts
172.17.0.51 hadoop1
172.17.0.114 node-001
172.17.0.142 node-002
172.17.0.98  node-003

01]# vim /etc/hosts
172.17.0.51 hadoop1
172.17.0.114 node-001
172.17.0.142 node-002
172.17.0.98  node-003

02]# vim /etc/hosts
172.17.0.51 hadoop1
172.17.0.114 node-001
172.17.0.142 node-002
172.17.0.98  node-003

03]# vim /etc/hosts
172.17.0.51 hadoop1
172.17.0.114 node-001
172.17.0.142 node-002
172.17.0.98  node-003

## 3.准备zookeeper配置文件
hadoop1]# tar -xf zookeeper-3.4.13.tar.gz  && mv zookeeper-3.4.13 /usr/local/zookeeper
hadoop1]# cd /usr/local/zookeeper && cp zoo_sample.cfg zoo.cfg
# 注意配置文件和上面一致

# 给每个节点都同步一个
~]# for i in node-0001..0003;do
                   rsync -aXSH --delete /usr/local/zookeeper $i:/usr/local/
               done
# 然后再每台都创建一个目录和id
~]# ./ceshi.sh "mkdir /tmp/zookeeper"
hadoop1]# grep -Po "\\d+(?==$HOSTNAME)" /usr/local/zookeeper/conf/zoo.cfg >/tmp/zookeeper/myid
01]# grep -Po "\\d+(?==$HOSTNAME)" /usr/local/zookeeper/conf/zoo.cfg >/tmp/zookeeper/myid
02]# grep -Po "\\d+(?==$HOSTNAME)" /usr/local/zookeeper/conf/zoo.cfg >/tmp/zookeeper/myid
03]# grep -Po "\\d+(?==$HOSTNAME)" /usr/local/zookeeper/conf/zoo.cfg >/tmp/zookeeper/myid

#启动
~]# ./ceshi.sh "/usr/local/zookeeper/bin/zkServer.sh start"

3.zookeeper集群管理

手册地址

ZooKeeper Administrator's Guide (apache.org)

 

 

# 安装命令工具软件hadoop1上
~]# yum install -y socat
~]# socat - TCP:node-0001:2181
ruok  # 输入
imok  # 返回
## 书写脚本测试
~]# cat zkstats 
#!/bin/bash
function getzkstat()
    exec 2>/dev/null
    exec 8<>/dev/tcp/$1/2181
    echo stat >&8
    Msg=$(cat <&8 |grep -P "^Mode:")
    exec 8<&-
    printf "%15s " $1
    echo -e "$Msg:-Mode: \\x1b[31mNULL\\x1b[0m"


if (( $# == 0 ));then
    echo "$0##*/ zk1 zk2 zk3 ... ..."
else
    for i in $@;do
        getzkstat $i
    done
fi

~]# ./zkstats hadoop1 node-0001..0003
             hadoop1 Mode: observer
           node-0001 Mode: follower
           node-0002 Mode: leader
           node-0003 Mode: follower

4.kafka集群

1)Kafka的概述

kafka是什么

-Kafka是由LinkedIn开发的一个分布式的消息系统

-Kafka是使用Scala编写

-Kafka是一种消息中间件解

为什么要使用Kafka

-解耦、冗余、异步通信、提高扩展性

-流量削峰、缓冲、保证顺序,灵活

Kafka角色与集群结构

-producer:生产者,负责发布消息

-consumer:消费者,负责读取处理消息

-topic:消息的类别

-Broker:Kafka集群包含一个或多个服务器

-Kafka将元数据信息保存在Zookeeper中

-broker会在zookeeper注册并保持相关的元数据更新

生产者消费模型

集群示例

Kafka集群架构

2)kafka安装

1.安装配置 kafka,并同步给其他主机

下载kafka阿帕奇·卡夫卡 (apache.org)

~]# wget https://archive.apache.org/dist/kafka/2.1.0/kafka_2.12-2.1.0.tgz
~]# yum install -y java-1.8.0-openjdk-devel
~]# tar -zxf kafka_2.12-2.1.0.tgz
~]# mv kafka_2.12-2.1.0 /usr/local/kafka
~]# for i in node-0001..0003;do
                      rsync -aXSH --delete /usr/local/kafka $i:/usr/local/
                  done

2.修改 node-0001,node-0002,node-0003 配置文件并启动服务

## node-001配置
~]# vim /usr/local/kafka/config/server.properties
21   broker.id=1       # 类似于mysql(1,255)任意数字
123  zookeeper.connect=node-0001:2181,node-0002:2181,node-0003:2181 # 配置kafka必须有一个zookeeper高可以的集群
# 启动kafka
~]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
~]# jps
1400 Kafka

## node-002配置
~]# vim /usr/local/kafka/config/server.properties
broker.id=2     # 注意
zookeeper.connect=node-0001:2181,node-0002:2181,node-0003:2181
~]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
~]# jps
6226 Kafka

## node-003配置
broker.id=3      # 注意
zookeeper.connect=node-0001:2181,node-0002:2181,node-0003:2181
~]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
~]# jps
6226 Kafka

kafka的原理

 

3.验证(在不同机器上执行)

# 创建一个消息类别(此时在集群都可以看到)
1]# /usr/local/kafka/bin/kafka-topics.sh --create --partitions 1 --replication-factor 1 --zookeeper localhost:2181 --topic mymsg

# 在2机器上使用消息队列(生产者)
2]# /usr/local/kafka/bin/kafka-console-producer.sh --broker-list  localhost:9092 --topic mymsg


# 在3开一个消费者
3]# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic mymsg

# 在2(生产者)随便写入东西,消费者就可以看到

5.Hadoop高可用

1)高可以概述

NameNode高可用

-想实现Hadoop高可用就必须实现NameNode的高可用,NameNode是HDFS的核心,HDFS又是Hadoop核心组件,NameNode在Hadoop集群中至关重要

-NameNode宕机,将导致集群不可用,如NameNode数据丢失将导致整个集群的数据丢失,而NameNode的数据的更新又比较频繁,实现NameNode高可用势在必行

官方提供了两种方案

-HDFS with NFS

-HDFS with QJM

  • 方案对比

    -都能实现热备

    -都是一个Active和一个Standby

    -都使用Zookeeper和ZKFC来实现高可用

    -NFS方案:把数据存储在共享存储里,还需要考虑NFS的高可用设计

    -QJM方案:不需要共享存储,但需要让每一个DN都知道两个 NameNode的位置,并把块信息和心跳包发送给Active和 Standby这NameNode

数据同步方案

  • NFS服务推荐

 QJM方案解析

  • -为HDFS配置两个NameNode,一个处于Active状态,另一个处于Standby状态。ActiveNameNode对外提供服务,而 Standby则仅同步Active的状态,以便能够在它失败时进行切换

    -在任何时候只能有一个NameNode处于活动状态,如果出现两个ActiveNameNode,(这种情况通常称为"split-brain'脑裂,三节点通讯阻断)会导致集群操作混乱,可能会导致数据丢失或状态异常

    • fsimage一致性

      -NameNode更新很频繁,为了保持主备数据的一致性,为了支持快速Failover,StandbyNameNode 持有集群中blocks的最新位置是非常必要的。为了达到这一目的,DataNodes上需要同时配置这两个Namenode的地址,同时和它们都建立心跳连接,并把block位置发送给它们

  • fsedit同步(数据变更日志组件)

    -为了让StandbyNameNode与Active NameNode保持同步,这两个NameNode都与一组称为JNS的互相独立的进程保持通信(Journal Nodes)。

    -当ActiveNameNode更新了,它将记录修改日志发送给Journal Node,StandbyNode将会从JournalNode 中读取这些日志,将日志变更应用在自己的数据中,并持续关注它们对日志的

  • 主备切换

-当Failover发生时,Standby首先读取Journalnode中所有的日志,并将它应用到自己的数据中

-获取JournalNode写权限:对于Journalnode而言,任何时 SVIP候只允许一个NameNode作为writer:在Failover期间,原来的StandbyNameNode将会接管Active的所有职能,并负责向 Journal node写入日志记录

-提升自己为Active

高可用架构图例

2)环境准备

准备主机

主机名IP地址基础配置
hadoop2192.168.1.562cpu, 2G内存

角色与配置

主机名IP地址角色服务
hadoop1192.168.1.50namenode, resourcemanager, ZKFC
hadoop2192.168.1.56namenode, resourcemanager, ZKFC
node-0001192.168.1.51datanode, nodemanager, zookeeper, journalnode
node-0002192.168.1.52datanode, nodemanager, zookeeper, journalnode
node-0003192.168.1.53datanode, nodemanager, zookeeper, journalnode

环境初始化

hadoop1 上执行

~]# vim /etc/hosts
192.168.1.50    hadoop1
192.168.1.56    hadoop2
192.168.1.51    node-0001
192.168.1.52    node-0002
192.168.1.53    node-0003
~]# rsync -aXSH --delete /root/.ssh hadoop2:/root/
~]# for i in hadoop2 node-0001..0003;do
                      rsync -av /etc/hosts $i:/etc/
                  done

hadoop2 上执行

~]# yum install -y java-1.8.0-openjdk-devel
~]# vim /etc/ssh/ssh_config
# 60行新添加
	StrictHostKeyChecking no

3)集群配置文件

在 hadoop1 上完成以下文件的配置

1.配置 hadoop-env.sh

~]# vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
25:  export JAVA_HOME="java-1.8.0-openjdk安装路径"
33:  export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"

2.配置 slaves

~]# vim /usr/local/hadoop/etc/hadoop/slaves
node-0001
node-0002
node-0003

3.配置 core-site.xml

~]# vim /usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>  
        <!-- 指定文件系统,名字可以自定义,后续需要配置,(由于这里做了高可以,只有在创建之后才会知道具体的,这里就先定义一个组名(mycluster)任意,把hadoop1,2加入)-->
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/hadoop</value>
      <!-- 数据存储目录-->
    </property>
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>node-0001:2181,node-0002:2181,node-0003:2181</value>
       <!-- 指定节点zookeeper-->
    </property>
    <property>
        <name>hadoop.proxyuser.nfsuser.groups</name>
        <value>*</value>
      <!-- 指定nfs网络共享-->
    </property>
    <property>
        <name>hadoop.proxyuser.nfsuser.hosts</name>
        <value>*</value>
        <!--  所有-->
    </property>
</configuration>

4.配置 hdfs-site.xml(配置namnode高可用的主配置文件)

 

~]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
   <!-- 定义组名(与core-site配置文件一致)-->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>
    <!-- 设置两个组名-->
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>
    <!-- n1对应hadoop1-->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>hadoop1:8020</value>
    </property>
    <!--  n2对应hadoop2-->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>hadoop2:8020</value>
    </property>
   <!-- n1的访问端口-->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>hadoop1:50070</value>
    </property>
   <!-- n2的访问端口 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>hadoop2:50070</value>
    </property>
  <!-- 指定JNS要拉取的对象-->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node-0001:8485;node-0002:8485;node-0003:8485/mycluster</value>
    </property>
   <!-- JNS存储路径-->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/var/hadoop/journal</value>
    </property>
   <!-- 定义JKFZ心跳hadoop用-->
    <property>
        <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</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.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
   <!-- 节点副本数 -->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
   <!-- 排除主机列表 -->
    <property>
        <name>dfs.hosts.exclude</name>
        <value>/usr/local/hadoop/etc/hadoop/exclude</value>
    </property>
</configuration>

 5.配置 mapred-site.xml(申明资源管理框架,这里用默认的,其他的需要开发来开发)

~]# vim /usr/local/hadoop/etc/hadoop/mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

6.配置 yarn-site.xml(设置高可用)

 ~]# vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>
    <!--开启HA高可用配置-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <!--节点自动恢复-->
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
    <!--数据保存的介质-->
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
    <!--zookeeper集群地址-->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>node-0001:2181,node-0002:2181,node-0003:2181</value>
    </property>
    <!--yarn集群ID-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yarn-ha</value>
    </property>
    <!--第一两个角色-->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <!--定义rm1是hadoop1-->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop1</value>
    </property>
    <!--定义rm2是hadoop2-->
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop2</value>
    </property>
<!-- Site specific YARN configuration properties -->
    <!-- 申明计算框架 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

 4)官网查看书写配置

文档官网:Hadoop – Apache Hadoop 2.7.7

5)初始化启动集群

1.重启机器、在 node-0001,node-0002,node-0003 启动 zookeeper(不重启也可以,内存占用较大

1]# /usr/local/zookeeper/bin/zkServer.sh start

2]# /usr/local/zookeeper/bin/zkServer.sh start

3]# /usr/local/zookeeper/bin/zkServer.sh start

~]# zkstats node-0001..0003
           node-0001 Mode: follower
           node-0002 Mode: leader
           node-0003 Mode: follower

2.清空实验数据并同步配置文件(hadoop1 上执行)

~]# rm -rf /var/hadoop/* /usr/local/hadoop/logs
~]# for i in hadoop2 node-0001..0003;do
                      rsync -av /etc/hosts $i:/etc/
                      rsync -aXSH --delete /var/hadoop $i:/var/
                      rsync -aXSH --delete /usr/local/hadoop $i:/usr/local/
                  done

3.在 node-0001,node-0002,node-0003 启动 journalnode 服务

1]# /usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode
~]# jps
1037 JournalNode

2]# /usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode

3]# /usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode

4.初始化(hadoop1 上执行)

# 格式化zkfs
~]# /usr/local/hadoop/bin/hdfs zkfc -formatZK
# 格式namenode
~]# /usr/local/hadoop/bin/hdfs namenode -format
# 格式datanode
~]# /usr/local/hadoop/bin/hdfs namenode -initializeSharedEdits
# 同步hadoop2
~]# rsync -aXSH --delete /var/hadoop/dfs hadoop2:/var/hadoop/

5.停止在 node-0001,node-0002,node-0003 上的 journalnode 服务

1]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop journalnode

2]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop journalnode

3]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop journalnode

6.启动集群

#-------------------- 下面这条命令在 hadoop1 上执行 ----------------------------------------
~]# /usr/local/hadoop/sbin/start-all.sh
#-------------------- 下面这条命令在 hadoop2 上执行(高可用) ----------------------------------------
~]# /usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager

5)验证集群

## hadoop1查看状态
~]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn1
active
~]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn2

# 查看rm1,2
~]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm1
~]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm2

# 查看计算节点信息
~]# /usr/local/hadoop/bin/hdfs dfsadmin -report
~]# /usr/local/hadoop/bin/yarn node -list

使用高可用集群分析数据实验

~]# cd /usr/local/hadoop
~]# ./bin/hadoop fs -mkdir /input
~]# ./bin/hadoop fs -put *.txt /input/
~]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /input /output
~]# ./bin/hadoop fs -cat /output/*

## 把hadoop1关机,并在hadoop2可以查看到数据存在
~]# ssh hadoop2
~]# ./bin/hadoop fs -cat /output/*

## 开机重新把hadoop1加入
~]# cd /usr/local/hadoop
~]# ./sbin/hadoop-daemon.sh start namenode
~]# ./sbin/yarn-daemon.sh start resourcemanager
~]# ./sbin/hadoop-daemon.sh start ZKFC
# 验证
~]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn1
~]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm1

以上是关于Hadoop集群高可用及zookeeper+kafka组件搭建的主要内容,如果未能解决你的问题,请参考以下文章

基于 ZooKeeper 搭建 Hadoop 高可用集群

七Hadoop3.3.1 HA 高可用集群QJM (基于Zookeeper,NameNode高可用+Yarn高可用)

Spark 系列—— 基于 ZooKeeper 搭建 Spark 高可用集群

Spark 系列—— 基于 ZooKeeper 搭建 Spark 高可用集群

常用组件kafka集群hadoop高可用

最新Hadoop-2.7.2+hbase-1.2.0+zookeeper-3.4.8 HA高可用集群配置安装