– 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。
安装hbase集群需要安装zookeeper集群
安装部署zookeeper:
去zookeeper官网下载安装包,这里下载版本为3.8.1,注意一定要下载*-bin的安装包
apache-zookeeper-3.8.1-bin
tar -xvf apache-zookeeper-3.8.1-bin.tar.gz
cd apache-zookeeper-3.8.1-bin
cp conf/zoo_sample.cfg conf/zoo.cfg
/etc/profile
(追加)export ZOOKEEPER_HOME=/home/zookeeper/apache-zookeeper-3.8.1-bin
export PATH=$PATH:$ZOOKEEPER_HOME/bin
更新
source /etc/profile
更改添加如下内容:
admin.serverPort=10086
clientPort=2181
initLimit=10
syncLimit=5
dataDir=/home/zookeeper/data
dataLogDir=/home/zookeeper/log
# zookeeper cluster,2888为选举端口,3888为心跳端口
server.1=docker:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
tickTime:心跳时间间隔,毫秒
initLimit: 集群中连接到leader的Follower服务器,初始化连接是最长能忍受多少个心跳的时间间隔数
syncLimit: leader与follower之间发送消息,请求和应答时间长度 (5*2000)
将zookeeper的安装包复制到其他节点
scp -r apache-zookeeper-3.8.1-bin slave1:/home/zookeeper/
scp -r apache-zookeeper-3.8.1-bin slave2:/home/zookeeper/
mkdir -p /home/zookeeper/data
mkdir /home/zookeeper/log
在data目录中,创建myid文件,标识当前主机。在三台主机中分别执行,数字为1、2、3,如下所示
echo "1" >/opt/zookeeper/data/myid
#slave1
echo "2" >/opt/zookeeper/data/myid
#slave2
echo "3" >/opt/zookeeper/data/myid
分别在三台机器上执行如下命令:(在bin目录下执行)
[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
在Linux中进行hadoop集群搭建(完全分布式)_linux hadoop分布式_Best_Liu~的博客-CSDN博客
上传安装包到/home/hbase
解压
tar -zvxf hbase-2.5.0-bin.tar.gz -C /home/hbase/
环境变量/etc/profile
(追加)
## HBASE_HOME
export HBASE_HOME=/home/hbase/hbase-2.5.0
export PATH=$PATH:$HBASE_HOME/bin
更新
source /etc/profile
配置--三台主机均需配置
跳转到/home/hbase/hbase-2.5.0/conf/
目录
export JAVA_HOME=/usr ## 根据环境更改java_home
export HBASE_MANAGES_ZK=false ##不使用hbase自带的zookeeper
hbase.rootdir
hdfs://docker:9000/home/hbase/hbase_db
hbase.master.info.port
16010
hbase.regionserver.info.port
16030
hbase.cluster.distributed
true
hbase.zookeeper.quorum
docker:2181,slave1:2181,slave2:2181
hbase.master
docker:60000
hbase.zookeeper.property.dataDir
/home/hbase/zookeeper
hbase.tmp.dir
./tmp
hbase.unsafe.stream.capability.enforce
false
docker
slave1
slave2
运行(在NameNode节点主机上,master,HBase安装目录下)
bin/start-hbase.sh
停止
bin/stop-hbase.sh
hbase shell
create 'StudentAndCourse','student','course1','course2','course3'
①新增学号为2015001的学生的所有信息
put 'StudentAndCourse','2015001','student:S_Name','Zhangsan'
put 'StudentAndCourse','2015001','student:S_Sex','male'
put 'StudentAndCourse','2015001','student:S_Age','23'
put 'StudentAndCourse','2015001','course1:C_No','123001'
put 'StudentAndCourse','2015001','course1:C_Name','Math'
put 'StudentAndCourse','2015001','course1:C_Credit','2.0'
put 'StudentAndCourse','2015001','course1:Score','86'
put 'StudentAndCourse' ,'2015001','course3:C_No','123003'
put 'StudentAndCourse' ,'2015001','course3:C_Name','English'
put 'StudentAndCourse' ,'2015001','course3:C_Credit','3.0'
put 'StudentAndCourse' ,'2015001','course3:Score','69'
②、新增学号为2015002的学生的所有信息
put 'StudentAndCourse' ,'2015002','student:S_Name','Mary'
put 'StudentAndCourse' ,'2015002','student:S_Sex','female'
put 'StudentAndCourse' ,'2015002','student:S_Age','22'
put 'StudentAndCourse' ,'2015002','course2:C_No','123002'
put 'StudentAndCourse' ,'2015002','course2:C_Name','Conputer Science'
put 'StudentAndCourse' ,'2015002','course2:Credit','5.0'
put "StudentAndCourse" ,'2015002','course2:Score','77'
put 'StudentAndCourse' ,'2015002','course3:C_No','123003'
put 'StudentAndCourse' ,'2015002','course3:C_Name','English'
put 'StudentAndCourse' ,'2015002','course3:Credit','3.0'
put 'StudentAndCourse' ,'2015002','course3:Score','99'
③、新增学号为2015003的学生的所有信息
put 'StudentAndCourse' ,'2015003','student:S_Name','Lisi'
put 'StudentAndCourse' ,'2015003','student:S_Sex','male'
put 'StudentAndCourse' ,'2015003','student:S_Age','24'
put 'StudentAndCourse' ,'2015003','course1:C_No','123001'
put 'StudentAndCourse' ,'2015003','course1:C_Name','Math'
put 'StudentAndCourse' ,'2015003','course1:C_Credit','2.0'
put 'StudentAndCourse' ,'2015003','course1:Score','98'
put 'StudentAndCourse' ,'2015003','course2:C_No','123002'
put 'StudentAndCourse' ,'2015003','course2:C_Name','Computer Science'
put 'StudentAndCourse' ,'2015003','course2:C_Credit','5.0'
put 'StudentAndCourse' ,'2015003','course2:Score','95'
scan 'StudentAndCourse'
退出hbase shell
exit