hbase简单介绍
一、 概念
hbase是高可靠、面向列的、可伸缩的、分布式的数据库,适用于非结构化的数据存储数据库;
运行在hadoop之上,受zookeeper管理。
二、数据模型
Row Key | Timestamp | Column Family | |
URI | Parser | ||
r1 | t3 | url=http:// | title= |
t2 | host=com | ||
t1 | |||
r2 | t5 | url=http:// | content=每天… |
t4 | host=com |
Row key:行键,Table的主键,Table中的记录默认按照Row Key的字典序升序排序;
最大不超过64k,一般越短越好。
Timestamp:时间戳,每次数据操作对应的时间戳,可以看作是数据的version number;
Column Family:列簇,Table在水平方向有一个或者多个Column Family组成,一个Column Family中可以由任意多个Column组成,即Column Family支持动态扩展,无需预先定义Column的数量以及类型,所有Column均以二进制格式存储,用户需要自行进行类型转换。
但是,目前hbase对列簇超过2-3列支持不是太好,所以设计中最多不超过3列。列簇越少越好,设计表时预习设计好一个列簇。
Region:当Table随着记录数不断增加而变大后,会逐渐分裂成多份splits,成为regions,一个region由[startkey,endkey)表示,不同的region会被Master分配给相应RegionServer进行管理。Region相当于文件系统中划分的block块。
三、系统架构
Client:客户端与HMaster通信负责管理hbase的regionServer服务运行、数据迁移、资源划分。直接与regionServer通信负责数据的读写。
HRegionServer:主要负责响应用户I/O请求,向HDFS文件系统中读写数据,供region运行的服务器;内部管理了一系列HRegion对象。
HRegion:对应table中的一个region,一个table可以拆分为多个region.
HStore:包含两个部分,一个是MemStore,读写数据的内存缓冲区,当MemStore满值后会将内容向storeFile写入。storeFile基于HFile实现,是hdfs的二进制存储文件。当storeFile到了一定的阈值后会触发文件的合并。合并的过程中对列的版本数据进行合并和更新,合并包括大文件合并和小文件合并,控制好合并的minor和major阈值对性能提升很重要。当storefile合并大小到达一定阈值会触发split将region拆分。Hlog文件是在向MemStore写文件的同时要写入,避免宕机情况出现导致memstore中的数据丢失。
四、Mapreduce支持
Mepreduce不仅支持从hdfs中读写数据,还支持向hbase中读写数据。Mapreduce从hbase读写数据时Map端业务逻辑类不再继承Mapper,而是继承TableMapper;reduce端继承TableReduce;相关Job类中mapper和reduce的设置方式也有改变。
Map端从hbase的table中的各个region读数据,根据不同的key将读取的数据划分到各个分组中,然后分组数据向reduce端混排合并,合并后相同的key交给同一个reduce处理,然后将处理结果输出到hbase而不是hdfs中。