Hbase集群部署(三个节点)

概述

HBASE

– HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、 实时读写的分布式数据库
– 利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理 HBase中的海量数据,利用Zookeeper作为其分布式协同服务
– 主要用来存储非结构化和半结构化的松散数据(列存NoSQL数据库)
Hbase的架构图如下所示
在这里插入图片描述
1、Client
包含访问HBase的接口并维护cache来加快对HBase的访问

2、ZooKeeper
2.1、ZooKeeper 为 HBase 提供 Failover 机制,选举 Master,避免单点 Master 单点故障问题
2.2、存储所有 Region 的寻址入口:-ROOT-表在哪台服务器上。-ROOT-这张表的位置信息
2.3、实时监控 RegionServer 的状态,将 RegionServer 的上线和下线信息实时通知给 Master
2.4、存储 HBase 的 Schema,包括有哪些 Table,每个 Table 有哪些 Column Family

3、Master
3.1、为 RegionServer 分配 Region
3.2、负责 RegionServer 的负载均衡
3.3、发现失效的 RegionServer 并重新分配其上的 Region
3.4、HDFS 上的垃圾文件(HBase)回收
3.5、处理 Schema 更新请求(表的创建,删除,修改,列簇的增加等等)

4、RegionServer
4.1、RegionServer 维护 Master 分配给它的 Region,处理对这些 Region 的 IO 请求
4.2、RegionServer 负责 Split 在运行过程中变得过大的 Region,负责 Compact 操作

5、HRegion
table在行的方向上分隔为多个Region。Region是HBase中分布式存储和负载均衡的最小单元,即不同的region可以分别在不同的Region Server上,但同一个Region是不会拆分到多个server上。
Region按大小分隔,每个表一般是只有一个region。随着数据不断插入表,region不断增大,当region的某个列族达到一个阈值时就会分成两个新的region。
每个region由以下信息标识:< 表名,startRowkey,创建时间>
由目录表(-ROOT-和.META.)记录该region的endRowkey

6、Store
每一个region由一个或多个store组成,至少是一个store,hbase会把一起访问的数据放在一个store里面,即为每个 ColumnFamily建一个store,如果有几个ColumnFamily,也就有几个Store。一个Store由一个memStore和0或者 多个StoreFile组成。 HBase以store的大小来判断是否需要切分region

7、MemStore
memStore 是放在内存里的。保存修改的数据即keyValues。当memStore的大小达到一个阀值(默认128MB)时,memStore会被flush到文 件,即生成一个快照。目前hbase 会有一个线程来负责memStore的flush操作。

8、StoreFile
memStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),在合并过程中会进行版本合并和删除工作(majar),形成更大的storefile。

9、HFile
HBase中KeyValue数据的存储格式,HFile是Hadoop的 二进制格式文件,实际上StoreFile就是对Hfile做了轻量级包装,即StoreFile底层就是HFile。

10、HLog
HLog(WAL log):WAL意为write ahead log,用来做灾难恢复使用,HLog记录数据的所有变更,一旦region server 宕机,就可以从log中进行恢复。
HLog文件就是一个普通的Hadoop Sequence File, Sequence File的value是key时HLogKey对象,其中记录了写入数据的归属信息,除了table和region名字外,还同时包括sequence number和timestamp,timestamp是写入时间,sequence number的起始值为0,或者是最近一次存入文件系统中的sequence number。 Sequence File的value是HBase的KeyValue对象,即对应HFile中的KeyValue。

zookeeper

分布、开源的应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态,根据节点的反馈进行下一步合理操作。主要解决分布式应用经常遇到的数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等

基本架构
在这里插入图片描述
1 每个Server在内存中存储了一份数据;
2 Zookeeper启动时,将从实例中选举一个leader(Paxos协议);
3 Leader负责处理数据更新等操作(Zab协议);
4 一个更新操作成功,当且仅当大多数Server在内存中成功修改
数据。
在这里插入图片描述

hadoop

Hadoop是一个由Apache基金会所开发的分布式系统基础架构,包括HDFS(分布式文件系统),YARN(分布式资源调度系统),MapReduce(分布式计算系统),等等。
在这里插入图片描述
Namenode 和 Datanode
HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。

Namenode和Datanode被设计成可以在普通的商用机器上运行。这些机器一般运行着GNU/Linux操作系统(OS)。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其它机器分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。
集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过Namenode。

block
一般用户数据存储在HDFS文件。在一个文件系统中的文件将被划分为一个或多个段和/或存储在个人数据的节点。这些文件段被称为块。换句话说,数据的HDFS可以读取或写入的最小量被称为一个块。缺省的块大小为64MB,但它可以增加按需要在HDFS配置来改变

准备

三个节点:
操作系统:centos
ip:
master:192.168.122.130
node1:192.168.122.104
node2:192.168.122.216

在每台机器上上配置hosts文件,如下:
cat /etc/hosts

192.168.122.130    master
192.168.122.104    node1
192.168.122.216    node2

配置免密登录:
在master节点执行:

ssh-keygen
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh-copy-id node1
ssh-copy-id node2

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

关闭selinux

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

部署zookeeper集群

三台机器都安装jdk,本次实验直接使用yum安装,也可以去下载jdk包进行安装。

yum -y install java java-devel
[root@master ~]# java -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)

安装部署zookeeper:

	wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
	tar -xvf zookeeper-3.4.14.tar.gz
	cd zookeeper-3.4.14
	cp conf/zoo_sample.cfg conf/zoo.cfg

编辑conf/zoo.cfg文件,更改添加如下内容:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data
dataLogDir=/opt/zookeeper/log
# zookeeper cluster,2888为选举端口,3888为心跳端口
server.1=master:2888:3888
server.2=node1:2888:3888
server.3=node2:2888:3888

tickTime:心跳时间间隔,毫秒
initLimit: 集群中连接到leader的Follower服务器,初始化连接是最长能忍受多少个心跳的时间间隔数
syncLimit: leader与follower之间发送消息,请求和应答时间长度 (5*2000)

将zookeeper的安装包复制到其他节点

scp -r zookeeper-3.4.14 node1:/root/
scp -r zookeeper-3.4.14 node2:/root/

创建data和log目录:

 mkdir -p /opt/zookeeper/data
 mkdir /opt/zookeeper/log

在data目录中,创建myid文件,标识当前主机。在三台主机中分别执行,数字为1、2、3,如下所示

 echo "1" >/opt/zookeeper/data/myid

配置环境变量,编辑~/.bashrc文件,添加如下内容:

export ZOOKEEPER_HOME=/root/zookeeper-3.4.14
export PATH=$ZOOKEEPER_HOME/bin:$PATH

sourc ~/.bashrc

启动zookeeper服务,分别在三台机器上执行如下命令:

[root@master ~]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

启动成功,查看当前节点的状态,包括leader、follower属性:

[root@master ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower

jps可查看zk的进程:

[root@node1 bin]# jps
11496 QuorumPeerMain
11566 Jps

部署hadoop集群

安装部署hadoop

wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz
cd hadoop-3.1.3

配置Hadoop:主要需要修改6个配置文件:hadoop-env.sh、workers、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
1.修改hadoop-env.sh指定JAVA_HOME

[root@master hadoop-3.1.3]# vim etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr

2.配置文件core-site.xml

这个是hadoop的核心配置文件,这里需要配置的就这两个属性,fs.default.name配置了hadoop的HDFS系统的命名,位置为主机的9000端口;
hadoop.tmp.dir配置了hadoop的tmp目录的根位置。这里使用了一个文件系统中没有的位置,所以要先用mkdir命令新建一下。

[root@master hadoop-3.1.3]# vim etc/hadoop/core-site.xml
<configuration>
    <property>
       <name>fs.defaultFS</name> <!--NameNode 的URI-->
    <value>hdfs://master:9000</value>
  </property>

  <property>
    <name>hadoop.tmp.dir</name> <!--hadoop临时文件的存放目录-->
    <value>file:/root/hadoop-3.1.3/tmp</value>
  </property>
</configuration>

3.配置文件hdfs-site.xml

这个是hdfs的配置文件,dfs.http.address配置了hdfs的http的访问位置;
dfs.replication配置了文件块的副本数,一般不大于从机的个数

vim etc/hadoop/hdfs-site.xml
<configuration>
    <property> <!--Namenode持久存储名字空间及事务日志的本地文件系统路径-->
      <name>dfs.namenode.name.dir</name>
    <value>/opt/hadoop/dfs/data</value>     <!--目录无需预先创建,会自动创建-->
  </property>

  <property>  <!--DataNode存放块数据的本地文件系统路径-->
      <name>dfs.datanode.data.dir</name>
    <value>/opt/hadoop/dfs/data</value>
  </property>

  <property>  <!--数据需要备份的数量,不能大于集群的机器数量-->
    <name>dfs.replication</name>
    <value>1</value>
  </property>

  <property>
     <name>dfs.namenode.secondary.http-address</name>
     <value>master:9001</value>
  </property>

  <property>  <!--设置为true,可以在浏览器中IP+port查看-->
     <name>dfs.webhdfs.enabled</name>
     <value>true</value>
  </property>
</configuration>

4.配置文件mapred-site.xml

这个是mapreduce任务的配置,由于hadoop2.x使用了yarn框架,所以要实现分布式部署,必须在mapreduce.framework.name属性下配置为yarn。mapred.map.tasks和mapred.reduce.tasks分别为map和reduce的任务数,同时指定:Hadoop的历史服务器historyserver,Hadoop自带了一个历史服务器,可以通过历史服务器查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息。默认情况下,Hadoop历史服务器是没有启动的,我们可以通过下面的命令来启动Hadoop历史服务器
$ /root/hadoop-3.1.3/sbin/mr-jobhistory-daemon.sh start historyserver
这样我们就可以在相应机器的19888端口上打开历史服务器的WEB UI界面。可以查看已经运行完的作业情况。

vim etc/hadoop/mapred-site.xml
<configuration>
    <property> <!--mapreduce运用了yarn框架,设置name为yarn-->
      <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>

  <property> <!--历史服务器,查看Mapreduce作业记录-->
    <name>mapreduce.jobhistory.address</name>
    <value>master:10020</value>
  </property>

  <property>  <!--历史服务器的web地址-->
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>master:19888</value>
  </property>
</configuration>

5.配置节点yarn-site.xml

该文件为yarn框架的配置,主要是一些任务的启动位置

vim etc/hadoop/yarn-site.xml
<configuration>

<!-- Site specific YARN configuration properties -->
    <property> <!--NodeManager上运行的附属服务,用于运行mapreduce-->
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>

  <property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>

  <property> <!--ResourceManager 对客户端暴露的地址-->
    <name>yarn.resourcemanager.address</name>
    <value>master:8032</value>
  </property>

  <property> <!--ResourceManager 对ApplicationMaster暴露的地址-->
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>master:8030</value>
  </property>

  <property> <!--ResourceManager 对NodeManager暴露的地址-->
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>master:8031</value>
  </property>

  <property> <!--ResourceManager 对管理员暴露的地址-->
    <name>yarn.resourcemanager.admin.address</name>
    <value>master:8033</value>
  </property>

  <property> <!--ResourceManager 对外web暴露的地址,可在浏览器查看-->
    <name>yarn.resourcemanager.webapp.address</name>
    <value>master:8088</value>
  </property>
</configuration>

6.编辑datanode节点

 vim etc/hadoop/workers
 node1
 node2

格式挂HDFS

hdfs namenode -format

设置用户,因为实验使用的是root用户所以设置如下:

export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_SECONDARYNAMENODE_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
export YARN_NODEMANAGER_USER="root"

启动服务

 mr-jobhistory-daemon.sh start historyserver ##如果需要可以通过此命令启动历史服务器
 start-dfs.sh    ##启动hdfs
 start-yarn.sh	##启动yarn
或者可以直接执行start-all.sh

启动成功后会看到相应进程
master

[root@master hadoop-3.1.3]# jps
16928 SecondaryNameNode
17617 JobHistoryServer
16658 NameNode
17682 Jps
17204 ResourceManager
11627 QuorumPeerMain

node

root@node1 ~]# jps
14129 Jps
14003 NodeManager
11496 QuorumPeerMain
13902 DataNode

安装部署hbase

wget http://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.1.7/hbase-2.1.7-bin.tar.gz
tar -xvf hbase-2.1.7-bin.tar.gz
cd hbase-2.1.7

1.添加环境变量 vim ~/.bashrc

export HBASE_HOME=/root/hbase-2.1.7
export PATH=$HBASE_HOME/bin:$PATH

2.编辑文件 vim conf/hbase-env.sh

export JAVA_HOME=/usr                       ## 根据环境更改java_home
export HBASE_MANAGES_ZK=false   ##不使用hbase自带的zookeeper

3.配置hbase-site.xml文件

vim conf/base-site.xml

<configuration>
    <property>
      <name>hbase.rootdir</name> <!-- hbase存放数据目录 -->
    <value>hdfs://master:9000/opt/hbase/hbase_db</value> <!-- 端口要和Hadoop的fs.defaultFS端口一致-->
  </property>

  <property>
    <name>hbase.cluster.distributed</name> <!-- 是否分布式部署 -->
    <value>true</value>
  </property>

  <property>
    <name>hbase.zookeeper.quorum</name> <!-- list of  zookooper -->
    <value>master:2181,node1:2181,node2:2181</value>
  </property>

    <property> <!--指定master节点-->
        <name>hbase.master</name>
        <value>master:60000</value>
    </property>

  <property><!--zookooper配置、日志等的存储位置 -->
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/opt/hbase/zookeeper</value>
  </property>
</configuration>

4.配置regionservers

vim conf/regionservers

node1
node2

5.将配置好的文件复制到node节点

scp -r hbase-2.1.7 node1:/root
scp -r hbase-2.1.7 node2:/root

启动服务

start-hbase.sh

错误记录:

本次实验为初次部署,遇到版本不兼容的问题。可以根据具体的问题替换相应的jar包。
在部署hbase时候,regionserver节点出现 “java.lang.NoClassDefFoundError: com/ctc/wstx/io/InputBootstrapper” 错误。原因是在替换jar包时出错,导致引入的jar包不全。

Hbase简单操作

1、进入HBase客户端命令操作界面

$ bin/hbase shell

2、查看当前数据库中有哪些表

hbase(main):001:0> list

3、创建一张表( create ‘表名’,‘列祖名’ )

hbase(main):002:0> create ‘test’,‘info’

4、向表中存储一些数据( put ‘表名’,‘ROWKEY’,‘列族名:列名’,‘值’ )

hbase(main):003:0> put ‘test’,‘100’,‘info:test1’,‘game’

hbase(main):004:0> put ‘test’,‘100’,‘info:test2’,‘play’

5、扫描查看存储的数据

hbase(main):005:0> scan ‘test’

hbase(main):005:0> scan 'test'
ROW                                        COLUMN+CELL
 100                                       column=info:test1, timestamp=1574694449357, value=game
 100                                       column=info:test2, timestamp=1574694457129, value=play
1 row(s)
Took 0.0276 seconds

6、查看表结构

hbase(main):006:0> describe ‘student’

参考:
https://www.cnblogs.com/lxbmaomao/p/9387659.html
http://www.mamicode.com/info-detail-2354995.html
https://www.cnblogs.com/jokerq/p/10206287.html
https://www.cnblogs.com/raphael5200/p/5229164.html
https://www.cnblogs.com/arjenlee/articles/9224366.html
http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html


版权声明:本文为weixin_45870145原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。