概述
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
与FUJITSU Cliq等商用大数据产品不同,HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用 Chubby作为协同服务,HBase利用Zookeeper作为对应。
HBase的特点
- Hbase可以往数据里面insert,也可以update一些数据,但update的实际上也是insert,只是插入一个新的时间戳的一行。delete数据,也是insert,只是insert一行带有delete标记的一行。Hbase的所有操作都是追加插入操作。Hbase是一种日志集数据库。它的存储方式,像是日志文件一样。它是批量大量的往硬盘中写,通常都是以文件形式的读写。这个读写速度,取决于硬盘与机器之间的传输有多快。
- Hbase中数据可以保存许多不同时间戳的版本(即同一数据可以复制许多不同的版本,准许数据冗余,也是优势)。数据按时间排序,因此Hbase特别适合寻找按照时间排序寻找Top n的场景。找出某个人最近浏览的消息,最近写的N篇博客,N种行为等等,因此Hbase在互联网应用非常多。
- Hbase只有主键索引,因此在建模的时候会遇到了问题。例如,在一张表中,很多的列我都想做某种条件的查询。但却只能在主键上建快速查询。
- Hbase是列式数据库,列式数据库的优势在于数据分析。
- Hbase中的数据都是字符串,没有其他类型。
行式数据库与列式数据库的区别
行式数据库
以Oracle为例,数据文件的基本组成单位:块/页。块中数据是按照一行行写入的。这就存在一个问题,当我们要读一个块中的某些列的时候,不能只读这些列,必须把这个块整个的读入内存中,再把这些列的内容读出来。换句话就是:为了读表中的某些列,必须要把整个表的行全部读完,才能读到这些列。这就是行数据库最糟糕的地方。
列式数据库
列式数据库是以列作为元素存储的。同一个列的元素会挤在一个块。当要读某些列,只需要把相关的列块读到内存中,这样读的IO量就会少很多。通常,同一个列的数据元素通常格式都是相近的。这就意味着,当数据格式相近的时候,数据就可以做大幅度的压缩。所以,列式数据库在数据压缩方面有很大的优势,压缩不仅节省了存储空间,同时也节省了IO。(这一点,可利用在当数据达到百万、千万级别以后,数据查询之间的优化,提高性能,示场景而定)
HBase架构
HBase采用Master/Slave架构搭建集群,它隶属于Hadoop生态系统,由以下类型节点组成:HMaster节点、HRegionServer节点、ZooKeeper集群,而在底层,它将数据存储于HDFS中,因而涉及到HDFS的NameNode、DataNode等节点。
Zookeeper
Zookeeper Quorum存储-ROOT-表地址、HMaster地址。HRegionServer把自己以Ephedral方式注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康状况。
HMaster
HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master在运行。
HMaster主要负责Table和Region的管理工作
- 实现DDL操作(Data Definition Language,namespace和table的增删改,column familiy的增删改等)。
- 管理HRegionServer的负载均衡,调整Region分布。
- 管理和分配HRegion,比如在HRegion split时分配新的HRegion;在HRegionServer退出时迁移其内的HRegion到其他HRegionServer上。
- 权限控制(ACL)。
HRegionServer
HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据。
- 存放和管理本地HRegion。
- 读写HDFS,管理Table中的数据。
- Client直接通过HRegionServer读写数据(从HMaster中获取元数据,找到RowKey所在的HRegion/HRegionServer后)。
HRegion
HBase使用RowKey将表水平切割成多个HRegion,从HMaster的角度,每个HRegion都纪录了它的StartKey和EndKey(第一个HRegion的StartKey为空,最后一个HRegion的EndKey为空),由于RowKey是排序的,因而Client可以通过HMaster快速的定位每个RowKey在哪个HRegion中。HRegion由HMaster分配到相应的HRegionServer中,然后由HRegionServer负责HRegion的启动和管理,和Client的通信,负责数据的读(使用HDFS)。
HBase集群搭建
如果HDFS是HA集群,需要把HDFS的core-site.xml和hdfs-site.xml copy到conf下。
hbase-env.sh
|
|
hbase-site.xml
|
|
regionservers
配置regionserver的节点,为了尽量实现数据本地化,可以与DataNode在同一个节点上。
HBase常用Shell命令
|
|