hbase高可用性分布式集群搭建(3节点超详细集群安装)
一、前言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....
一、前言
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 服务器集群功能规划
Master | Slave1 | Slave2 |
---|---|---|
NameNode | NameNode | – |
QuorumPeerMain | QuorumPeerMain | QuorumPeerMain |
NodeManager | NodeManager | NodeManager |
DFSZKFailoverController | DFSZKFailoverController | – |
JournalNode | JournalNode | JournalNode |
DataNode | DataNode | DataNode |
– | ResourceManager | ResourceManager |
节点介绍:
- NameNode
目录的管理者,每一个集群都有一个,记录实时的数据变化,如果没有namenode,HDFS就无法工作,系统中的文件将会全部丢失,就无法将位于不同datanode上的文件快(blocks)重建文件。因此它的容错机制很有必要。
它主要负责:
接收用户的请求;
维护文件系统的目录结构;
管理文件与Block之间的练习
- DataNode
是文件系统的工作节点,他们根据客户端或者是namenode的调度存储和检索,并且定期向namenode发送他们所存储的块(block)的列表。
集群中的每个服务器都运行一个DataNode后台程序,这个后台程序负责把HDFS数据块读写到本地的文件系统。当需要通过客户端读/写某个 数据时,先由NameNode告诉客户端去哪个DataNode进行具体的读/写操作,然后,客户端直接与这个DataNode服务器上的后台程序进行通信,并且对相关的数据块进行读/写操作。
它主要负责:
存放数据;
文件被分割以Block的形式被存储在磁盘上;
- ResourceManager
①与客户端进行交互,处理来自于客户端的请求,如查询应用的运行情况等。
②启动和管理各个应用的ApplicationMaster,并且为ApplicationMaster申请第一个Container用于启动和在它运行失败时将它重新启动。
③管理NodeManager,接收来自NodeManager的资源和节点健康情况汇报,并向NodeManager下达管理资源命令,例如kill掉某个container。
④资源管理和调度,接收来自ApplicationMaster的资源申请,并且为其进行分配。这个是它的最重要的职能。
- NodeManager
NM是ResourceManager在每台机器上的代理,负责容器管理,并监控它们的资源使用情况,以及向ResourceManager/Scheduler提供资源使用报告。
- JournalNode
JournalNode可以让两个namenode之间进行相互通信,达到数据同步的作用。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了。
运行的JournalNode进程非常轻量,可以部署在其他的服务器上。注意:必须允许至少3个节点。当然可以运行更多,但是必须是奇数个,如3、5、7、9个等等。当运行N个节点时,系统可以容忍至少(N-1)/2(N至少为3)个节点失败而不影响正常运行。
- QuorumPeerMain
Zookeeper的运行进程,zookeeper的详细介绍可以参考5.1的解说。
- DFSZKFailoverController
DFSZKFailoverController是Hadoop-2.7.7中HDFS NameNode HA实现的中心组件,它负责整体的故障转移控制等。它是一个守护进程,通过main()方法启动,继承自ZKFailoverController.
6.2.2 HDFS HA架构图
- HDFS HA架构中有两台NameNode节点,一台是处于活动状态(Active)为客户端提供服务,另外一台处于热备份状态(Standby)。
- 元数据文件有两个文件:fsimage和edits,备份元数据就是备份这两个文件。JournalNode用来实时从Active NameNode上拷贝edits文件,JournalNode有三台也是为了实现高可用。
- Standby NameNode不对外提供元数据的访问,它从Active NameNode上拷贝fsimage文件,从JournalNode上拷贝edits文件,然后负责合并fsimage和edits文件,相当于SecondaryNameNode的作用。最终目的是保证Standby的NameNode上的元数据信息和Active NameNode上的元数据信息一致,以实现热备份。
- Zookeeper来保证在Active NameNode失效时及时将Standby NameNode修改为Active状态。
- ZKFC(失效检测控制)是Hadoop里的一个Zookeeper客户端,在每一个NameNode节点上都启动一个ZKFC进程,来监控NameNode的状态,并把NameNode的状态信息汇报给Zookeeper集群,其实就是在Zookeeper上创建了一个Znode节点,节点里保存了NameNode状态信息。当NameNode失效后,ZKFC检测到报告给Zookeeper,Zookeeper把对应的Znode删除掉,Standby ZKFC发现没有Active状态的NameNode时,就会用shell命令将自己监控的NameNode改为Active状态,并修改Znode上的数据。
- Znode是个临时的节点,临时节点特征是客户端的连接断了后就会把znode删除,所以当ZKFC失效时,也会导致切换NameNode。
- DataNode会将心跳信息和Block汇报信息同时发给两台NameNode,DataNode只接受Active NameNode发来的文件读写操作指令。
6.2.3 YARN HA 架构图
- MasterHADaemon:控制RM的 Master的启动和停止,和RM运行在一个进程中,可以接收外部RPC命令。
- 共享存储:Active Master将信息写入共享存储,Standby Master读取共享存储信息以保持和Active Master同步。
- ZKFailoverController:基于Zookeeper实现的切换控制器,由ActiveStandbyElector和HealthMonitor组成,ActiveStandbyElector负责与Zookeeper交互,判断所管理的Master是进入Active还是Standby;HealthMonitor负责监控Master的活动健康情况,是个监视器。
- 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.25 | Jdk、Hadoop、Zookeeper、hbase | DataNode、HRegionServer、HMaster、NameNode、NodeManager、QuorumPeerMain、DFSZKFailoverController、JournalNode |
slave1(备份服务器) | 192.168.0.26 | Jdk、Hadoop、Zookeeper、hbase | DataNode、HRegionServer、HMaster、NameNode、NodeManager、QuorumPeerMain、DFSZKFailoverController、JournalNode、ResourceManager |
slave1(数据存储服务器) | 192.168.0.27 | Jdk、Hadoop、Zookeeper、hbase | DataNode、HRegionServer、NodeManager、QuorumPeerMain、JournalNode、ResourceManager |
注:由于hbase集群是建立在hadoop集群之上的,所以必须要先搭建hadoop集群才能够正常运行hbase集群。
Hbase相关节点介绍:
- HMaster
HBase的管理节点,通常在一个集群中设置一个主Master,一个备Master,主备角色的"仲裁"由ZooKeeper实现。 Master主要职责:
①负责管理所有的RegionServer。
②建表/修改表/删除表等DDL操作请求的服务端执行主体。
③管理所有的数据分片(Region)到RegionServer的分配。
④如果一个RegionServer宕机或进程故障,由Master负责将它原来所负责的Regions转移到其它的RegionServer上继续提供服务。
⑤Master自身也可以作为一个RegionServer提供服务,该能力是可配置的。
- 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
更多推荐
所有评论(0)