前言:
在大数据领域有一个非常著名的产品-hbase,其有别于传统的rdbms,被称之为列式数据库。那么什么是列式数据库呢?既然有列,那是不是也有行式数据库呢?
行式数据库:可以简单的理解为是传统的rdbms这些数据库,存放的是结构化的数据,非常有利于全表数据的扫描,但是相对来说,对于个别字段的扫描,就不那么方便了。
列式数据库:列式数据库是对行式数据库的一个改进,将部分列(或者说有关联的一些列)存放到单独的一个文件中,其他列存在其他多个文件中,我们在进行 查询的时候,只需要读取这些常用的列即可完成工作,这样减少了文件IO的读写,提高读写的效率(不用再像行式数据库那样进行全表的扫描,然后过滤相关字段)。
一、hbase简介
1.是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,
2.HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,(利用zookeeper作为协调工具)。
3.特点
(1)hbase自身的特点
①高可靠性
②高性能
③面向列
④可伸缩
(2)hbase中表的特点
①可以纵向扩展
②可以横向扩展
二、hbase体系结构
1.逻辑结构(重点)
①表(table)
划分数据集合的概念,和传统的db中的表的概念是一样的。
②行键(rowkey)
一行数据的唯一标识,若想要操作hbase表中的一条数据,必须通过行键来定位,行键在hbase底层是使用字节数组进行存放的,所以方便我们使用rowkey来进行排序。
一行数据的唯一标示,要想操作(read/write)一条数据,必须通过行健,其在hbase底层都是使用字节数组进行存放,所以方便我们使用rk进行排序,
③列族(columnFamily)
简单的认为是一系列“列”的集合,列族是以单独的文件来进行存储的。
④列限定符(column Qualifier)
通常称之为列。列里边的数据定位通过列限定符,每个列族可以有一个或多个列成员(ColumnQualifier)。列成员不需要再定义表时规定,后期新加就可以了,可以动态注入。每个新加的列都会附带一个时间戳。在单元格中可以存放多个版本的数据。
⑤单元格(cell)
cell由行键,列族:限定度,时间戳唯一决定的,cell中的数据时没有类型的,全部以字节码形式存储,在使用java api去请求hbase数据时,所得的数据基本都存储在cell中。
2.物理结构(重点)
①HMaster --- 类似于hadoop的NameNode
作用:管理节点,用于管理hbase中的Table和Region的结构操作,比如用户增、删、修改表的操作。
在hbase集群中,可以启动多个HMaster,但是只能有一个HMaster属于Active的状态,通过zookeeper和其他standby状态的HMaster进程完成状态的切换或者选举。
我们可以使用HMaster的shutdown来关闭整个集群,在关闭整个集群的时候,需要通知HRegionServer进行关闭,并反馈给HMaster,HMaster才自行关闭。
②HRegionServer --- 类似于hadoop中的DataNode
存放Region的服务器,需要再HMaster进行注册,只有注册成功后,HMaster才可以对其进行管理,在HBase集群中,可以部署多个HregionServer。HRegionServer是hbase中最核心的模块,直接负责对用户I/O的相应,直接向hdfs读写数据,一个HRegionServer中拥有一个HLog和多个HRegion。
按这样来说,一个HRegionServer中的多个HRegion共享一个HLog,也就是说多张表共享一个HLog,HLog接受用户的操作数据,当然HRegion也会写数据,当HRegion数据写入成功之后,会发送一条删除数据的指令(数据写入成功的指令),Hlog的相关数据会首次被标记删除,等到一个阈值后,Hlog会执行一次文件的大合并(major Compact)。
③HRegion
其是真正用来存储数据的,而且它可以简单的理解为表的一个分区,存放一张表中的一部分数据,当该region中的数据超过一定数量的时候,会自动分裂成两个region(一分为二),从这个角度上而言,Region是对hbase中表横向的划分。
每一个HRegion有多个HStore组成,每一个HRegion是一张表中所有的列组成的(列是所有的列,但不一定是所有的行),每一个region都有一个startkey和endkey。
假设,我一张表里面有100条记录,我要把它分别存放到10个region里面,又因为存放在hbase里面的数据都是有序的,是能够进行一个高速随机读写的
也就是说有序能够保证我的快读,就需要能够通过rowkey,快速的定位到当前记录在哪一个region里面,然后当定位到region之后,再去扫描当前region,获取数据
为了满足于此,我们就对这些region进行划分,编号,也是为了方便管理。这里每一个region的范围:
[startKey, endKey),需要注意一定最后一个region的endkey是需要被包含进去的。
region 0 [null, 10)
region 1 [10, 20)
region 2 [20, 30)
region ... ...
region 9 [90, null]④HStore
④ HStore
每一个HRegion由多个HStore来组成,一个HStore对应HRegion中的一个列族,一个HStore有一个MemStore和一系列的StoreFiles组成。
HStore级别不会持有锁以及事务,锁和事务是在高一级别的HRegion持有的,HStore最核心的一个service就是合并memstore刷新到磁盘里边的storefiles,然后把多个storefiles合并成为一个storefile,写到hdfs里边,当storefile写到hdfs后就会被称为hfile。
在写的过程中,唯一涉及到hlog的部分就是关于hlog日志的重建过程,当hstore将用户提交的数据最终写到hdfs之后,会反馈给hlog,并将其里边冗余的数据删除掉。
可以在配置文件中指定hstore数量为多少时开启hstore的合并工作。
hbase.hstore.compactionThreshold=3, --代表党hstore数量为3时,开始store的合并工作。
拓展:
①Compaction:
minjor compaction(小合并):
就是将多个HFile合并成为一个大的HFile,然后对之前的HFile做清除处理。
常见的会在执行删除数据的动作、以及达到hbase.hstore.compactionThreshold触发条件的时候发生
删除数据:不会立即删除,做一个标记(标记删除),等到执行合并操作的时候,才进行数据的处理
marjor compaction(大合并):
将一个列族中的所有的HFile合并成为一个HFile,然后对之前的HFile做清除处理。
大合并非常消耗性能,非常耗时,不建议操作,当然是直接可以在shell执行操作的。
②把在HBase中的HLog存在的意义称之为WAL(write ahead log,预写日志)机制,这种机制有对应的专业的数据结构
SLM-Tree(Structured Log Merge-Tree), 这是HBase能够达到高速随机写,而且能够保障数据不丢失根本原因。
⑤memstore
注意:在memstore写的过程中,必须不能是多线程(并行)调用的,hstore在调用的过程中必须持有一个读锁和写锁。
在写的过程中,预先将数据在memstore中进程排序,因为数据最终是有序存放的,当memstore中的数据量超过阈值之后,就会舒心到磁盘文件 storefile中。
hbase.hregion.memstore.flush.size=128M,storeFile 默认的大小就是128M---->刚好对应了一个datanode的block块的大小
⑥storeFile
最终保存在HStore数据的文件,数据时有memstore不断向磁盘刷新过程中产生的,当storefile达到一定量的时候,会将这些
storefile组成一个storefiles。,且这个storefiles有可能持有其他store里边的storefile。
⑦HFlie
在hdfs上存放数据之前的一个物理结构,用于接收从客户端提交过来的数据。
HFile中的数据都是key-value键值对的方式存储,并且key和value都是字节数组,并且因为数据已经在memstore中排序过了,所以数据在hfile中也是有序的。
hfile同时是由一个个的block来组成的,最终k-v实际上是在这一个个的block中的,block的推荐的大小在8k~1M之间,默认
大小65536byte-->16kb。
三、hbase的安装
1.软件环境
(1)我现在使用hbase的版本是hbase-1.2.5
(2)hadoop
(3)zookeeper
(4)java
hadoop、zookeeper的安装我会在以后的文章中为大家介绍的~或者大家可以先在网上找一些资料,学习怎么去安装~
2.单机版本
(1)解压
tar -zxvf soft/hbase-1.2.5-bin.tar.gz
(2)将hbase添加至环境变量
vi /etc/profile
export HBASE_HOME=/opt/hbase
(3)修改配置文件
在安装hbase时,主要是修改两个配置文件,hbase-env.sh和hbase-site.xml
hbase-env.sh:
在这里配置比较简单,只要添加两条记录即可。
export JAVA_HOME=/opt/jdk
export HBASE_MANAGES_ZK=false -- (这里指明不适用hbase自己的zookeeper,要使用我们安装的)
hbase-site.xml :
<property>
<name>hbase.rootdir</name>
<value>hdfs://ns1/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master</value>
</property>
(4) 启动
sh $HBASE_HOME/bin/start-hbase.sh
在这个时候,我们使用jps命令,当HMaster、HRegionServer两个进程都启动的时候,这证明我们的单机hbase已经启动成功了,见以下两张图,因为我搭建的是集群,所有HMaster、HRegionServer没有在一台服务器上。
(5)停止
sh $HBASE_HOME/bin/stop-hbase.sh
(6)单个进程启动
HMaster的启动: hbase-daemon.sh start master
HRegionserver的启动: hbase-daemon.sh start regionserver
(7)访问
web访问: http://127.0.0.1:16010
cli访问: bin/hbase shell
3.分布式安装
(1)既然我们已经完成了单机安装,那么分布式的安装也就比较简单了,只需要在单机的版本上新增一个配置文件conf/regionservers, 并在其内添加两个节点(两行):
slave01
slave02
注意:如果已经配置过单机版,我们需要将hbase在hdfs上的目录,以及hbase在zk中的目录清楚,以免和我们的集群版本操作发生冲突。
(2)修改配置文件hbase-site.xml
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave01,slave02</value>
</property>
(3)拷贝master上面的数据到slave01和slave02
scp -r /opt/hbase root@slave01:/opt
scp -r /opt/hbase root@slave02:/opt
同样在slave01和slave02上面添加相关环境变量
scp /etc/profile root@slave01:/etc/profile.d/
scp /etc/profile root@slave02:/etc/profile.d/
注意:在我们每次修改环境变量后,一定别忘记使用souce命令使其生效。
注意:在我们每次修改环境变量后,一定别忘记使用souce命令使其生效。
注意:在我们每次修改环境变量后,一定别忘记使用souce命令使其生效。
(4)启动hbase集群
sh $HBASE_HOME/bin/start-hbase.sh
这个时候在master机器上面,有一个进程HMaster,在slave01和slave02上面分别有一个HRegionServer (如上面截图)
至此,我们hbase的简单介绍以及安装已经介绍完了,希望对大家能够有所帮助~