hbase高可用性分布式集群搭建(3节点超详细集群安装)

8 篇文章 0 订阅
4 篇文章 0 订阅

一、前言

1.1 简述

Hbase的高可用性集群是建立在hadoop的高可用集群的基础之上的,所以在安装hbase的高可用集群之前要先创建hadoop的高可用集群。

1.2环境要求

本地环境:window7 64位
虚拟机环境:centOs 6.5 64位(三台master,slave1,slave2),hadoop-2.7.7,hbase-1.2.8,zookeeper-3.4.13、jdk1.8.0_171。

二、Linux主机名设置

2.1 临时修改hostname

注:如果是云服务器推荐使用域名作为主机名,如果是虚拟机可以自定义.

# hostname master

2.2 永久修改hostname

# vi /etc/sysconfig/network

结果如下:
在这里插入图片描述

2.3 配置Host

# vi /etc/hosts

结果如下:
在这里插入图片描述
若配置完,没生效可以重启服务器

2.4 防火墙设置

本文推荐自己设置防火墙入栈规制,不要直接关闭防火墙.本文只是学习,所以在这里选择关闭防火墙,若是要直接使用的话最好不要关闭防火墙.
查看防火墙状态:

# service iptables status

临时关闭防火墙:

# service iptables stop

永久关闭防火墙:

# chkconfig iptables off

在这里插入图片描述
其他两台虚拟机也要进行以上操作。

三、设置无密码登录

Hadoop集群中的各个机器间会相互地通过SSH访问,每次访问都输入密码是不现实的,所以要配置各个机器间的SSH是无密码登录的。

3.1 安装ssh服务

检查是否已安装了ssh服务,如图现在明显未安装ssh服务

# rpm -qa openssh*

在这里插入图片描述
安装ssh服务:

# yum install -y openssh-clients

在这里插入图片描述

3.2 在master上生成公钥

[root@master ~]# ssh-keygen -t rsa

一路回车,都设置为默认值,然后再当前用户的Home目录下的.ssh目录中会生成公钥文件(id_rsa.pub)和私钥文件(id_rsa)。

3.3 分发公钥

[root@master ~]# ssh-copy-id master
[root@master ~]# ssh-copy-id slave1
[root@master ~]# ssh-copy-id slave2

3.4 设置slave1、slave2到其他机器的无密钥登录

同样的在slave1、slave2上生成公钥和私钥后,将公钥分发到三台机器上。

四、Jdk安装

在确保linux系统本身没有安装jdk的时候,执行下面步骤:

4.1 上传jdk

将jdk-8u171-linux-x64.tar.gz这个文件上传到linux虚拟机然后,解压到/opt/modules/soft/这个目录下,若没有这个目录可以用mkdir -p,创建目录。
在这里插入图片描述

4.2 解压jdk

# tar -zxvf jdk-8u171-linux-x64.tar.gz  -C  /opt/modules/soft

在这里插入图片描述

4.3 配置环境变量

# vi /etc/profile

在文件末尾行添加

#set java environment
JAVA_HOME=/opt/modules/soft/jdk1.8.0_171
CLASSPATH=.:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH

使配置生效:

#source /etc/profile 使更改的配置立即生效
#java -version 验证结果是否正确

在这里插入图片描述

4.4 分发jdk到其他的服务器

首先在slave1,slave2上创建/opt/modules/soft这个目录,用于接收分发的文件

[root@master ~]# scp -r /opt/modules/soft/jdk1.8.0_171 -C slave1:/opt/modules/soft
[root@master ~]# scp -r /opt/modules/soft/jdk1.8.0_171 -C slave2:/opt/modules/soft

在slave1,slave2上重复4.3的操作

五、Zookeeper集群安装。

5.1 Zookeeper说明

Zookeeper是分布式管理协作框架,Zookeeper集群用来保证Hbase集群的高可用,(高可用的含义是:集群中就算有一部分服务器宕机,也能保证正常地对外提供服务。)
Zookeeper集群能够保证master服务高可用的原理是:Hbase集群中有两个master服务,两个master都定时地给Zookeeper发送心跳,告诉Zookeeper我还活着,可以提供服务,单某一个时间只有一个是master是提供服务,另外一个是备用的master,一旦Zookeeper检测不到master发送来的心跳后,就切换到备用的master上,将它设置为提供服务的状态,所以集群中总有一个可用的master,达到了master的高可用目的。
Zookeeper集群也能保证自身的高可用,保证自身高可用的原理是,Zookeeper集群中的各个机器分为Leader和Follower两个角色,写入数据时,要先写入Leader,Leader同意写入后,再通知Follower写入。客户端读取数时,因为数据都是一样的,可以从任意一台机器上读取数据。
这里Leader角色就存在单点故障的隐患,高可用就是解决单点故障隐患的。Zookeeper从机制上解决了Leader的单点故障问题,Leader是哪一台机器是不固定的,Leader是选举出来的。选举流程是,集群中任何一台机器发现集群中没有Leader时,就推荐自己为Leader,其他机器来同意,当超过一半数的机器同意它为Leader时,选举结束,所以Zookeeper集群中的机器数据必须是奇数。这样就算当Leader机器宕机后,会很快选举出新的Leader,保证了Zookeeper集群本身的高可用。
集群中的写入操作都是先通知Leader,Leader再通知Follower写入,实际上当超过一半的机器写入成功后,就认为写入成功了,所以就算有些机器宕机,写入也是成功的。
zookeeperk客户端读取数据时,可以读取集群中的任何一个机器。所以部分机器的宕机并不影响读取。
zookeeper服务器必须是奇数台,因为zookeeper有选举制度,角色有:领导者、跟随者、观察者,选举的目的是保证集群中数据的一致性。

5.2 安装zookeeper

5.2.1 解压zookeeper安装包

在master服务器上安装解压zookeeper的安装包,到/opt/moodules/newsoft目录下:
在这里插入图片描述

5.2.2 修改配置

拷贝conf下的zoo_sample.cfg副本,并改名为zoo.cfg。zoo.cfg是zookeeper的配置文件:

[root@master conf]# cp zoo_sample.cfg zoo.cfg

在这里插入图片描述

[root@master conf]# vi zoo.cfg

在这里插入图片描述
dataDir属性设置zookeeper的数据文件存放的目录:

dataDir=/opt/modules/newsoft/zookeeper-3.4.13/data/zData

并创建该目录。
指定zookeeper集群中各个机器的信息:

server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

server后面的数字范围是1到255,所以一个zookeeper集群最多可以有255个服务器。2181端口与client提供服务有关,2888端口作为选举leader使用,
3888端口作为集群内机器通讯使用(Leader监听此端口)。

5.2.3 创建myid文件

在dataDir所指定的目录下创一个名为myid的文件,文件内容为server点后面的数字。

[root@master zookeeper-3.4.13]# touch data/zData/myid
[root@master zookeeper-3.4.13]# echo 1 >> data/zData/myid

在这里插入图片描述

5.2.4 分发到其他服务器

[root@master zookeeper-3.4.13]# scp -r /opt/modules/newsoft/zookeeper-3.4.13 slave1:/opt/modules/newsoft
[root@master zookeeper-3.4.13]# scp -r /opt/modules/newsoft/zookeeper-3.4.13 slave2:/opt/modules/newsoft

5.2.5 修改其他服务器的myid文件

在这里插入图片描述
在这里插入图片描述

5.2.6 配置zookeeper的环境变量

[root@master zookeeper-3.4.13]# vi /etc/profile
[root@master zookeeper-3.4.13]# source /etc/profile

在这里插入图片描述
在slave1,slave2上也要配置环境变量。

5.2.7 启动zookeeper

[root@master zookeeper-3.4.13]# zkServer.sh start
[root@slave1 zookeeper-3.4.13]# zkServer.sh start
[root@slave2 zookeeper-3.4.13]# zkServer.sh start

六、安装hadoop高可用性集群

6.1 环境准备

创建三台虚拟机(可以先创建一台虚拟机,在克隆出另外两台虚拟机,这里就不再详细讲述虚拟机的安装),分别是master、slave1、slave2。
虚拟机的配置:

Master:192.168.0.25,安装jdk,安装zookeeper,centos6.5
Slave1:192.168.0.26,安装jdk,安装zookeeper,centos6.5
Slave2:192.168.0.27,安装jdk,安装zookeeper,centos6.5

6.2 hadoop集群规划

6.2.1 服务器集群功能规划

MasterSlave1Slave2
NameNodeNameNode
QuorumPeerMainQuorumPeerMainQuorumPeerMain
NodeManagerNodeManagerNodeManager
DFSZKFailoverControllerDFSZKFailoverController
JournalNodeJournalNodeJournalNode
DataNodeDataNodeDataNode
ResourceManagerResourceManager

节点介绍:

  1. NameNode

目录的管理者,每一个集群都有一个,记录实时的数据变化,如果没有namenode,HDFS就无法工作,系统中的文件将会全部丢失,就无法将位于不同datanode上的文件快(blocks)重建文件。因此它的容错机制很有必要。
它主要负责:
接收用户的请求;
维护文件系统的目录结构;
管理文件与Block之间的练习

  1. DataNode

是文件系统的工作节点,他们根据客户端或者是namenode的调度存储和检索,并且定期向namenode发送他们所存储的块(block)的列表。
集群中的每个服务器都运行一个DataNode后台程序,这个后台程序负责把HDFS数据块读写到本地的文件系统。当需要通过客户端读/写某个 数据时,先由NameNode告诉客户端去哪个DataNode进行具体的读/写操作,然后,客户端直接与这个DataNode服务器上的后台程序进行通信,并且对相关的数据块进行读/写操作。
它主要负责:
存放数据;
文件被分割以Block的形式被存储在磁盘上;

  1. ResourceManager

①与客户端进行交互,处理来自于客户端的请求,如查询应用的运行情况等。
②启动和管理各个应用的ApplicationMaster,并且为ApplicationMaster申请第一个Container用于启动和在它运行失败时将它重新启动。
③管理NodeManager,接收来自NodeManager的资源和节点健康情况汇报,并向NodeManager下达管理资源命令,例如kill掉某个container。
④资源管理和调度,接收来自ApplicationMaster的资源申请,并且为其进行分配。这个是它的最重要的职能。

  1. NodeManager

NM是ResourceManager在每台机器上的代理,负责容器管理,并监控它们的资源使用情况,以及向ResourceManager/Scheduler提供资源使用报告。

  1. JournalNode

JournalNode可以让两个namenode之间进行相互通信,达到数据同步的作用。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了。
运行的JournalNode进程非常轻量,可以部署在其他的服务器上。注意:必须允许至少3个节点。当然可以运行更多,但是必须是奇数个,如3、5、7、9个等等。当运行N个节点时,系统可以容忍至少(N-1)/2(N至少为3)个节点失败而不影响正常运行。

  1. QuorumPeerMain

Zookeeper的运行进程,zookeeper的详细介绍可以参考5.1的解说。

  1. DFSZKFailoverController

DFSZKFailoverController是Hadoop-2.7.7中HDFS NameNode HA实现的中心组件,它负责整体的故障转移控制等。它是一个守护进程,通过main()方法启动,继承自ZKFailoverController.

6.2.2 HDFS HA架构图

在这里插入图片描述

  1. HDFS HA架构中有两台NameNode节点,一台是处于活动状态(Active)为客户端提供服务,另外一台处于热备份状态(Standby)。
  2. 元数据文件有两个文件:fsimage和edits,备份元数据就是备份这两个文件。JournalNode用来实时从Active NameNode上拷贝edits文件,JournalNode有三台也是为了实现高可用。
  3. Standby NameNode不对外提供元数据的访问,它从Active NameNode上拷贝fsimage文件,从JournalNode上拷贝edits文件,然后负责合并fsimage和edits文件,相当于SecondaryNameNode的作用。最终目的是保证Standby的NameNode上的元数据信息和Active NameNode上的元数据信息一致,以实现热备份。
  4. Zookeeper来保证在Active NameNode失效时及时将Standby NameNode修改为Active状态。
  5. ZKFC(失效检测控制)是Hadoop里的一个Zookeeper客户端,在每一个NameNode节点上都启动一个ZKFC进程,来监控NameNode的状态,并把NameNode的状态信息汇报给Zookeeper集群,其实就是在Zookeeper上创建了一个Znode节点,节点里保存了NameNode状态信息。当NameNode失效后,ZKFC检测到报告给Zookeeper,Zookeeper把对应的Znode删除掉,Standby ZKFC发现没有Active状态的NameNode时,就会用shell命令将自己监控的NameNode改为Active状态,并修改Znode上的数据。
  6. Znode是个临时的节点,临时节点特征是客户端的连接断了后就会把znode删除,所以当ZKFC失效时,也会导致切换NameNode。
  7. DataNode会将心跳信息和Block汇报信息同时发给两台NameNode,DataNode只接受Active NameNode发来的文件读写操作指令。

6.2.3 YARN HA 架构图

在这里插入图片描述

  1. MasterHADaemon:控制RM的 Master的启动和停止,和RM运行在一个进程中,可以接收外部RPC命令。
  2. 共享存储:Active Master将信息写入共享存储,Standby Master读取共享存储信息以保持和Active Master同步。
  3. ZKFailoverController:基于Zookeeper实现的切换控制器,由ActiveStandbyElector和HealthMonitor组成,ActiveStandbyElector负责与Zookeeper交互,判断所管理的Master是进入Active还是Standby;HealthMonitor负责监控Master的活动健康情况,是个监视器。
  4. Zookeeper:核心功能是维护一把全局锁控制整个集群上只有一个Active的ResourceManager。

6.3 HDFS HA集群安装

6.3.1 配置jdk的环境变量

配置Hadoop JDK路径修改hadoop-env.sh、mapred-env.sh、yarn-env.sh文件中的JDK路径:

export JAVA_HOME=/opt/modules/soft/jdk1.8.0_171

在这里插入图片描述

6.3.2 配置hdfs-site.xml

在configuration中,添加一下内容:

    <property>
       <!-- 为namenode集群定义一个services name -->
      <name>dfs.nameservices</name>
      <value>ns1</value>
    </property>
    <property>
      <!-- nameservice 包含哪些namenode,为各个namenode起名 -->
      <name>dfs.ha.namenodes.ns1</name>
      <value>nn1,nn2</value>
    </property>
    <property>
      <!--  名为nn1的namenode 的rpc地址和端口号,rpc用来和datanode通讯 -->
      <name>dfs.namenode.rpc-address.ns1.nn1</name>
      <value>master:8020</value>
    </property>
    <property>
      <!-- 名为nn2的namenode 的rpc地址和端口号,rpc用来和datanode通讯  -->
      <name>dfs.namenode.rpc-address.ns1.nn2</name>
      <value>slave1:8020</value>
    </property>
    <property>
      <!--名为nn1的namenode 的http地址和端口号,web客户端 -->
      <name>dfs.namenode.http-address.ns1.nn1</name>
      <value>master:50070</value>
    </property>
    <property>
      <!--名为nn2的namenode 的http地址和端口号,web客户端 -->
      <name>dfs.namenode.http-address.ns1.nn2</name>
      <value>slave1:50070</value>
    </property>
    <property>
      <!--  namenode间用于共享编辑日志的journal节点列表 -->
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://master:8485;slave1:8485;slave2:8485/ns1</value>
    </property>
    <property>
      <!--  journalnode 上用于存放edits日志的目录,该目录可以自己定义,当推荐在hadoop的配置文件夹下创建,方便分发 -->
      <name>dfs.journalnode.edits.dir</name>
      <value>/opt/modules/hadoopha/hadoop-2.7.7/tmp/data/dfs/jn</value>
    </property>
    <property>
      <!--  客户端连接可用状态的NameNode所用的代理类 -->
      <name>dfs.client.failover.proxy.provider.ns1</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
      <!--   -->
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
    </property>
     <!--用于指定你的ssh目录文件,该路径是指ssh无密码登录的私钥存储路径,默认是在/home/.ssh/id_rsa下-->
    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/home/.ssh/id_rsa</value>
   </property>
    <!--指定namenode和datanode的文件目录-->
     <property>
  <name>dfs.namenode.name.dir</name>
  <value>/opt/modules/hadoop-2.7.7/dfsNode/namenode</value>
     </property>
     <property>
  <name>dfs.datanode.data.dir</name>
  <value>/opt/modules/hadoop-2.7.7/dfsNode/datanode</value>
    </property>

6.3.3 配置core-site.xml文件

  <property>
    <!--  hdfs 地址,ha中是连接到nameservice -->
    <name>fs.defaultFS</name>
    <value>hdfs://ns1</value>
  </property>
  <property>
    <!-- 该目录可以自己指定 -->
    <name>hadoop.tmp.dir</name>
    <value>/opt/modules/hadoopha/hadoop-2.7.7/data/tmp</value>
  </property>

hadoop.tmp.dir设置hadoop临时目录地址,默认时,NameNode和DataNode的数据存在这个路径下。

6.3.4 配置slaves文件

配置内容如下:
在这里插入图片描述

6.4.5 分发到其他的节点

分发之前先将share/doc目录删除,这个目录中是帮助文件,并且很大,可以删除。

[hadoop@master hadoop-2.7.7]# scp -r /opt/modules/hadoopha slave1:/opt/modules
[hadoop@master hadoop-2.7.7]# scp -r /opt/modules/hadoopha slave2:/opt/modules

6.3.6 启动HDFS HA集群

三台服务器分别启动Journalnode

[hadoop@master hadoop-2.7.7]# sbin/hadoop-daemon.sh start journalnode
[hadoop@slave1 hadoop-2.7.7]# sbin/hadoop-daemon.sh start journalnode
[hadoop@slave2 hadoop-2.7.7]# sbin/hadoop-daemon.sh start journalnode

可以使用jps查看,可以发现JournalNode是否已正常启动

6.3.7 启动zookeeper

在三台服务器上分别启动zookeeper服务

[hadoop@master hadoop-2.7.7]# zkServer.sh start
[hadoop@slave1 hadoop-2.7.7]# zkServer.sh start
[hadoop@slave2 hadoop-2.7.7]# zkServer.sh start

使用jps查看,可以发现QuorumPeerMain已启动

6.3.8 格式化主节点

[hadoop@master hadoop-2.7.7]# bin/hdfs namenode -format

在这里插入图片描述

6.3.9 启动主节点

[hadoop@master hadoop-2.7.7]# sbin/hadoop-daemon.sh start namenode

6.3.10 格式化备份节点

[hadoop@slave1 hadoop-2.7.7]# bin/hdfs namenode -bootstrapStandby

在这里插入图片描述

6.3.11 启动备份节点

[hadoop@slave1 hadoop-2.7.7]# sbin/hadoop-daemon.sh start namenode

使用jps查看,可以看到master、slave1都已启动namenode节点,此时通过网页查http://master:50070、http://slave1:50070两个页面均处于standy状态。
将master转换成active状态:

[hadoop@master hadoop-2.7.7]# bin/hdfs haadmin -transitionToActive nn1

加上forcemanual 能将slave1强制转换成active状态:

[hadoop@slave1 hadoop-2.7.7]# bin/hdfs haadmin -transitionToActive -forcemanual nn2

在这里插入图片描述
在这里插入图片描述

6.3.12 配置故障转移

利用zookeeper集群实现故障自动转移,在配置故障自动转移之前,要先关闭集群,不能在HDFS运行期间进行配置。

[hadoop@master hadoop-2.7.7]# sbin/hadoop-daemon.sh stop namenode
[hadoop@master hadoop-2.7.7]# sbin/hadoop-daemon.sh stop journalnode
[hadoop@master hadoop-2.7.7]# zkServer.sh stop
[hadoop@slave1 hadoop-2.7.7]# sbin/hadoop-daemon.sh stop namenode
[hadoop@slave1 hadoop-2.7.7]# sbin/hadoop-daemon.sh stop journalnode
[hadoop@slave1 hadoop-2.7.7]# zkServer.sh stop
[hadoop@slave2 hadoop-2.7.7]# sbin/hadoop-daemon.sh stop namenode
[hadoop@slave2 hadoop-2.7.7]# sbin/hadoop-daemon.sh stop journalnode
[hadoop@slave2 hadoop-2.7.7]# zkServer.sh stop

修改hdfs-site.xml,加上下面的配置:

<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>

修改core-site.aml,加上下面的配置:

<property>
   <name>ha.zookeeper.quorum</name>
   <value>master:2181,slave1:2181,slave2:2181</value>
</property>

将hdfs-site.xml、core-site.xml文件分发到slave1,slave2服务器上或者直接上其他的服务器上修改文件也可。
创建一个znode节点用于监听namenode节点
注:在之前注意要先开启zookeeper,还有开启防火墙2181端口(或者直接关闭防火墙)

[hadoop@master hadoop-2.7.7]# bin/hdfs zkfc -formatZK

6.3.13 启动HDFS服务

[hadoop@master hadoop-2.7.7]# sbin/start-dfs.sh

自此,HDFS HA高可用性集群搭建成功.

注:若出现一个namenode启动完后自动关闭的情况时,可以按以下顺序启动hdfs服务:
1、启动zookeeper(每台都执行)
zkServer.sh status
2、启动journalnode(每台都执行)
hadoop-daemon.sh start journalnode
3、启动hdfs(只在作为active状态的服务器上使用)
start-dfs.sh

6.5 安装YARN HA高可用性集群

6.5.1 原理

Hadoop2.4版本之前,ResourceManager也存在单点故障的问题,也需要实现HA来保证ResourceManger的高可也用性。
ResouceManager从记录着当前集群的资源分配情况和JOB的运行状态,YRAN HA 利用Zookeeper等共享存储介质来存储这些信息来达到高可用。另外利用Zookeeper来实现ResourceManager自动故障转移。

6.5.2 修改yarn-site.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>106800</value>
  </property>
  <property>
    <!--  启用resourcemanager的ha功能 -->
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <property>
    <!--  为resourcemanage ha 集群起个id -->
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yarn-cluster</value>
  </property>
  <property>
    <!--  指定resourcemanger ha 有哪些节点名 -->
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm12,rm13</value>
  </property>
  <property>
    <!--  指定第一个节点的所在机器 -->
    <name>yarn.resourcemanager.hostname.rm12</name>
    <value>slave1</value>
  </property>
  <property>
    <!--  指定第二个节点所在机器 -->
    <name>yarn.resourcemanager.hostname.rm13</name>
    <value>slave2</value>
  </property>
  <property>
    <!--  指定resourcemanger ha 所用的zookeeper 节点 -->
    <name>yarn.resourcemanager.zk-address</name>
    <value>master:2181,slave1:2181,slave2:2181</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>
</configuration>

配置完将yarn-site.xml文件,分发到其他服务器上。

6.5.2 启动yarn服务

[hadoop@master hadoop-2.7.7]# sbin/start-yarn.sh

在slave1,slave2上启动resourcemanager:

[hadoop@slave1 hadoop-2.7.7]# sbin/yarn-daemon.sh start resourcemanager
[hadoop@slave2 hadoop-2.7.7]# sbin/yarn-daemon.sh start resourcemanager

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
Web客户端访问slave1机器上的resourcemanager正常,它是active状态的。
http://slave1:8088/cluster
访问另外一个resourcemanager,因为他是standby,会自动跳转到active的resourcemanager
http://slave2:8088/cluster
在这里插入图片描述

七、hbase集群搭建

7.1 hbase集群规划

节点名称ip安装软件运行的进程
Master(主服务器)192.168.0.25Jdk、Hadoop、Zookeeper、hbaseDataNode、HRegionServer、HMaster、NameNode、NodeManager、QuorumPeerMain、DFSZKFailoverController、JournalNode
slave1(备份服务器)192.168.0.26Jdk、Hadoop、Zookeeper、hbaseDataNode、HRegionServer、HMaster、NameNode、NodeManager、QuorumPeerMain、DFSZKFailoverController、JournalNode、ResourceManager
slave1(数据存储服务器)192.168.0.27Jdk、Hadoop、Zookeeper、hbaseDataNode、HRegionServer、NodeManager、QuorumPeerMain、JournalNode、ResourceManager

注:由于hbase集群是建立在hadoop集群之上的,所以必须要先搭建hadoop集群才能够正常运行hbase集群。
Hbase相关节点介绍:

  1. HMaster

HBase的管理节点,通常在一个集群中设置一个主Master,一个备Master,主备角色的"仲裁"由ZooKeeper实现。 Master主要职责:
①负责管理所有的RegionServer。
②建表/修改表/删除表等DDL操作请求的服务端执行主体。
③管理所有的数据分片(Region)到RegionServer的分配。
④如果一个RegionServer宕机或进程故障,由Master负责将它原来所负责的Regions转移到其它的RegionServer上继续提供服务。
⑤Master自身也可以作为一个RegionServer提供服务,该能力是可配置的。

  1. HRegionServer

①存放和管理本地HRegion。
②读写HDFS,管理Table中的数据。
③Client直接通过HRegionServer读写数据(从HMaster中获取元数据,找到RowKey所在的HRegion/HRegionServer后)。

HBase Client通过RPC方式和HMaster、HRegionServer通信;一个HRegionServer可以存放1000个HRegion;底层Table数据存储于HDFS中,而HRegion所处理的数据尽量和数据所在的DataNode在一起,实现数据的本地化;数据本地化并不是总能实现,比如在HRegion移动(如因Split)时,需要等下一次Compact才能继续回到本地化。

7.2 hbase系统架构

在这里插入图片描述
在这里插入图片描述

7.3 HRegion Sever架构图

在这里插入图片描述

7.4 解压hbase

将hbase-1.2.8-bin.tar.gz解压到/opt/modules/soft目录下:
在这里插入图片描述
7.5 配置hbase-env.sh文件

[root@master conf]# vi hbase-env.sh

修改如下内容:

export JAVA_HOME=/opt/modules/soft/jdk1.8.0_171
export HBASE_MANAGES_ZK=false

注:hbase自带zookeeper插件,默认状态下是随hbase启动而启动的,但是由于hbase自带的zookeeper插件,在集群的状态下并不方便管理,所以应该把 HBASE_MANAGES_ZK的值设置成false,相当于不开启hbase自带的zookeeper插件而使用我们自己安装的zookeeper软件,这样更方便管理。

7.6 配置hbase-site.xml文件

[root@master conf]# vi hbase-site.xml

添加如下内容:

<!-- 指定hbase在hdfs上存储的路径 -->
<property>
  <name>hbase.rootdir</name>
  <value>hdfs://ns1/hbase</value>
</property>
<!-- 指定hbase是分布式的 -->
<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
</property>
<!-- 指定zk的地址,多个用“,”分割 -->
<property>
  <name>hbase.zookeeper.quorum</name>
  <value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!--开放60010端口用于浏览器访问,hbase1.2.8版本默认不开启浏览器访问端口-->
<property>
  <name>hbase.master.info.port</name>
  <value>60010</value>
</property>

在这里插入图片描述

7.7 配置regionservers文件

[root@master conf]# vi regionservers

配置结果如下:
在这里插入图片描述

7.8 将hadoop的datanode、namenode映射关系拷贝到/hbase-1.2.8/conf/目录下

[root@master conf]# cd /opt/modules/hadoopha/hadoop-2.7.7/etc/hadoop/
[root@master hadoop]# cp core-site.xml hdfs-site.xml /opt/modules/soft/hbase-1.2.8/conf/

在这里插入图片描述

7.9 创建backup-masters文件,用来存储备份服务器的名称

在这里插入图片描述
注:作为hbase的主服务器的Hadoop的namenode必须处于active状态

7.10 将配置好的hbase分发到slave1、slave2服务器上

[root@master hadoopha]# scp -r hbase-1.2.8 slave1:/opt/modules/hadoopha
[root@master hadoopha]# scp -r hbase-1.2.8 slave2:/opt/modules/hadoopha

7.11 启动hbase

[root@master hbase-1.2.8]# ./bin/start-hbase.sh

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:如果出现HRegionServer启动一会然后又自动关闭的情况时,是因为服务器集群的时间不一致引起的,处理这个问题可以把所有服务器的时间设置在同一个时间,如下:
在这里插入图片描述
当然,其他的服务器也要设置一下时间。除了这个方法,我们还可以通过搭建ntp服务器来调节整个集群环境的时间。本文也推荐使用第二种方法。

7.12 启动shell

[root@master hbase-1.2.8]# ./bin/hbase shell
在这里插入图片描述

7.13 访问hbase的web界面

访问hbase的主服务web界面:
http://master:60010
在这里插入图片描述
若是系统正常运行,可以在下图看到看到regionservers集群的数量:
在这里插入图片描述
可以在下图看到备份服务器的名称,服务端口,运行时间等:
在这里插入图片描述
还可以看到,hbase创建的表:
在这里插入图片描述
访问备份服务器的web界面:
http://slave1:60010/master-status
在这里插入图片描述
可以看到若系统正常运行的状态下,备份服务器是处于standy状态下的,只有master服务器是处于active状态。

7.14 测试hbase服务器集群的高可用性。

停止正在运行的master服务器的HMaster进程,模仿master服务器宕机。
在这里插入图片描述
访问master主服务器的界面:
http://master:60010
在这里插入图片描述
这时候master服务器的主界面已经无法正常使用。
访问备份服务器的界面:
在这里插入图片描述
可以发现备份服务器的服务已启用,通过备份服务器我们依然可以正常的使用hbase集群。

7.15 常见问题

(1)在安装hbase-1.2.8时发现一个问题,hbase能够正常使用,hbase shell 完全可用,但是60010页面却打不开,最后找到问题,是因为1.2.8版本的hbase的master web 默认是不运行的,所以需要自己配置默认端口。
在hbase-site.xml中加入,下面内容:

<property>
    <name>hbase.master.info.port</name>
    <value>60010</value>
</property>

同样道理,也可以配置regionserver web端口。
(2)据有些读者建议,在云服务器上配置hbase集群时出现了很多问题,后来我也测试了发现的确有问题,以下是解决问题的方案:
最后发现服务器的host应该这么设置(vim /etc/hosts):
master:

127.0.0.1 localhost
填你的内网IP master
填你的公网IP slave1
填你的公网IP slave2

slave1:

127.0.0.1 localhost
填你的公网IP master
填你的内网IP slave1
填你的公网IP slave2

slave2:

127.0.0.1 localhost
填你的公网IP master
填你的公网IP slave1
填你的内网IP slave2

解决方案来自香香的七仔,原文章地址:
https://www.baby7blog.com/myBlog?id=66

八、hbase的shell常用命令及java实例

8.1 hbase的shelll常用命令

8.1.1通用命令

(1)status: 提供HBase的状态,例如,服务器的数量。
在这里插入图片描述
(2)version: 提供正在使用HBase版本。
在这里插入图片描述
(3)table_help: 表引用命令提供帮助。
在这里插入图片描述
(4)whoami: 提供有关用户的信息.

在这里插入图片描述

8.1.2 数据定义语言

(1) create: 创建一个表。
在这里插入图片描述
(2)list: 列出HBase的所有表。
在这里插入图片描述
(3)disable: 禁用表。
在这里插入图片描述
(4)is_disabled: 验证表是否被禁用。
表示被禁用:
在这里插入图片描述
表示启用:
在这里插入图片描述
(5)enable: 启用一个表。
在这里插入图片描述
(6)is_enabled: 验证表是否已启用。
表示启用:
在这里插入图片描述
表示被禁用:
在这里插入图片描述
(7)describe: 提供了一个表的描述。
在这里插入图片描述
(8)alter: 改变一个表。
在这里插入图片描述
(9)exists: 验证表是否存在。

在这里插入图片描述
(10)drop: 从HBase中删除表。
分两步:首先disable,然后drop
在这里插入图片描述

(11)drop_all: 丢弃在命令中给出匹配“regex”的表。

hbase> drop_all 't.*'

注意:要删除表,则必须先将其禁用。
假设有一些表的名称如下:
在这里插入图片描述
所有这些表以字母test0开始。首先使用disable_all命令禁用所有这些表如下所示。
在这里插入图片描述
现在,可以使用 drop_all 命令删除它们,如下所示。
在这里插入图片描述
(12)Java Admin API: 在此之前所有的上述命令,Java提供了一个通过API编程来管理实现DDL功能。在这个org.apache.hadoop.hbase.client包中有HBaseAdmin和HTableDescriptor 这两个重要的类提供DDL功能。

8.1.3 数据操纵语言
(1) put: 把指定列在指定的行中单元格的值在一个特定的表。

put 'table name','row ','Column family:column name','new value'

在这里插入图片描述
(2)get: 取行或单元格的内容。

get '<table name>','row1'

在这里插入图片描述
(3)delete: 删除表中的单元格值。

delete '<table name>', '<row>', '<column name >', '<time stamp>'

在这里插入图片描述
(4)deleteall: 删除给定行的所有单元格。

deleteall '<table name>', '<row>',

在这里插入图片描述
(5)scan: 扫描并返回表数据。

scan '<table name>'

在这里插入图片描述
(6)count: 计数并返回表中的行的数目。

count ‘<table name>’

在这里插入图片描述
(7)truncate: 禁用,删除和重新创建一个指定的表。

truncate ‘table name’
在这里插入图片描述
在这里插入图片描述
(8)Java client API: 在此之前所有上述命令,Java提供了一个客户端API来实现DML功能,CRUD(创建检索更新删除)操作更多的是通过编程,在org.apache.hadoop.hbase.client包下。 在此包HTable 的 Put和Get是重要的类。

8.2 java实例

8.2.1 准备

如果是用虚拟机搭建的hbase环境,要对虚拟机服务器的ip进行硬编码.如果是云服务器则可采用域名直接访问hbase服务.进行硬编码时,推荐采用switchhost进行硬编码,不要直接在C盘下操作host文件.
在这里插入图片描述
测试硬编码是否已正常启用可以使用浏览器用:
http://hbase.domain:60010/master-status
在这里插入图片描述

8.2.2 java程序与hbase服务器的交互

详细可参考案例代码:
案例代码:
链接:https://pan.baidu.com/s/1eb0xUI0vg2QNFtZKLC61mA
提取码:nnrd
相关软件:
链接:https://pan.baidu.com/s/1_xEGQYihzdNl3dsDY3-URA
提取码:7fpt

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
HBase是一种分布式数据库,具有高可用性的特点。它通过集群模式来实现高可用性,并确保数据的持久性和可靠性。 首先,HBase采用了主从架构,集群中的每个RegionServer都可以担任主节点或从节点的角色。当主节点发生故障时,可以通过选举算法快速选出新的主节点,保证集群的服务不中断。这种架构使得HBase具备了自动故障转移和容错能力。 其次,HBase还支持数据的冗余备份。在集群中,每个Region都会有多个副本,这些副本可以分布在不同的机器上,甚至可以分布在不同的数据中心。当某个节点或数据中心发生故障时,系统可以自动切换到其他可用的副本,保证数据的可用性和一致性。 此外,HBase还提供了数据的一致性和持久性保证。在写入数据时,HBase会先将数据写入WAL(Write-Ahead Log)中,确保数据的持久化。同时,HBase还支持事务和ACID(原子性、一致性、隔离性和持久性)特性,可以保证多个操作之间的一致性。 最后,HBase还提供了监控和管理功能,可以实时监控集群的状态和性能指标,并提供自动伸缩和负载均衡的功能。这些功能可以帮助管理员及时发现问题并采取相应的措施,提高集群的可用性和性能。 综上所述,HBase集群具备高可用性的特点,通过主从架构、数据备份、故障转移、一致性保证和监控管理等措施,确保了数据的持久性、可靠性和可用性,适用于对数据一致性要求较高的场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值