Hbase认识

bigtable认识

BigTable是一种压缩的、高性能的、高可扩展性的,基于Google文件系统(Google File System,GFS)的数据存储系统,用于存储大规模结构化数据,适用于云计算。

BigTable是Table-oriented的NOSQL,优势在于扩展性和性能适用性广泛、可扩展、高性能和高可用性。

BigTable的Table数据结构包括row keyN、col key和timestamp,其中row key用于存储倒转的URL,例如www.google.com必须改成com.google.www。

特点: 1、适合大规模海量数据,PB级数据; 2、分布式、并发数据处理,效率极高; 3、易于扩展,支持动态伸缩; 4、适用于廉价设备;H 5、适合于读操作,不适合写操作。 6、不适用于传统关系型数据库。

hbase 认识

HBase是一个开源NoSQL,运行于HDFS文件系统之上,提供类似于BigTable 规模的服务,可以容错地存储海量稀疏的数据。

HBase的表能够作为MapReduce任务的输入和输出,可以通过Java API来访问数据,也可以通过Thrift的API来访问。

先看一下Hbase在hadoop系统应用中的位置:

HBase位于结构化存储层,Hadoop HDFS为HBase提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制。

一句话:

在Zookeeper提供分布式集群的配置管理与共享内存应用下,Hmaster管理控制一系列HRegionServer完成数据接收、然后写入到Hadoop集群下进行持久化的过程。

hbase系统构成

组成部件说明

Client:

使用HBase RPC机制与HMaster和HRegionServer进行通信 Client与HMaster进行通信进行管理类操作 Client与HRegionServer进行数据读写类操作

Zookeeper:

Zookeeper Quorum存储-ROOT-表地址、HMaster地址 HRegionServer把自己以Ephedral方式注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康状况 Zookeeper避免HMaster单点问题

HMaster:

HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master在运行 主要负责Table和Region的管理工作: 1 管理用户对表的增删改查操作 2 管理HRegionServer的负载均衡,调整Region分布 3 Region Split后,负责新Region的分布 4 在HRegionServer停机后,负责失效HRegionServer上Region迁移

HRegionServer:

HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据 HRegionServer管理一系列HRegion对象; 每个HRegion对应Table中一个Region,HRegion由多个HStore组成; 每个HStore对应Table中一个Column Family的存储; Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效

HStore:

HBase存储的核心。由MemStore和StoreFile组成。 MemStore是Sorted Memory Buffer。

数据存储过程:

Client写入

-> 存入MemStore,一直到MemStore满

-> Flush成一个StoreFile,直至增长到一定阈值

-> 出发Compact合并操作

-> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除

-> 当StoreFiles Compact后,逐步形成越来越大的StoreFile

-> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上

hbase表结构

关系数据库表结构

如有一表:t_account,有字段:id, name, phone,其中表结构是在使用前就定义好的

create table t_account (
    `id` int(11) NOT NULL DEFAULT '0' ,
    `name` varchar(32) NOT NULL DEFAULT '',
    `phone` varchar(32) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据操作是:

insert into t_account values(...)

结构

id name phone
1 Jim 1521788
2 Tom 1789099

当用户需要记录用户余额时,得添加字段Money。

操作sql:

ALTER TABLE `t_account` ADD COLUMN `money` DEFAULT 0 int(10) AFTER `phone`;

即变成:

id name phone money
1 Jim 1521788 0
2 Tom 1789099 0

关系数据库特点: 1)使用前需要先定义表名及表结构 2)插入数据时需指定字段名 3)二维结构,存储行与列 4)添加字段不容控制

hbase表结构

HBase 中的每一张表就是所谓的 BigTable。BigTable 会存储一系列的行记录,行记录有三个基本类型的定义:Row Key、Time Stamp、Column。

1、Row Key 是行在 BigTable 中的唯一标识。

2、Time Stamp 是每次数据操作对应关联的时间戳,唯一值。

3、Column 定义为< family>:< label>,通过这两部分可以指定唯一的数据的存储列,family 的定义和修改需要对 HBase 进行类似于 DB 的 DDL 操作,而 label ,不需要定义直接可以使用,这也为动态定制列提供了一种手段 。

建表时要指定的是:表名、列族

建表语句

create 't_account', 'base_info', 'ext_info'

这里指定了表名: t_account; 有两个列族: base_info, ext_info

NOTE: 列族 是列的集合,一个列族中包含多个列

这时的表结构为:

row key base_info ext_info
... ... ... ...

NOTE: row key 是行键,每一行的ID,是唯一的,可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。存储时,数据按照Row key的字典序(byte order)排序存储。

比如 有一批用户,我们定义row key为唯一的账号ID 插入一条用户数据:name为‘Tom’,phone为‘1581788’

put 't_account', 'com.china.123', 'base_info:name', 'Tom'
put 't_account', 'com.china.123', 'base_info:phone', '1581788'

name和phone就是具体字段,属于base_info这个列族

这时的表结构:

row key time stamp base_info ext_info
com.china.123 time1 name:Tom, phone:1581788

再插入添加数据:money为100, 指定money为ext_info列族中的列

put 't_account', 'com.china.123', 'ext_info:money', '110'

这时的表结构:

row key time stamp base_info ext_info
com.china.123 time1 name:Tom, phone:1581788
com.china.123 time2 money:100

如果再插入一个账号信息: name为'Jim', 指定money为110

put 't_account', 'com.china.124', 'base_info:name', 'Jim'
put 't_account', 'com.china.124', 'ext_info:money', '110'
row key time stamp base_info ext_info
com.china.123 time1 name:Tom, phone:1581788
com.china.123 time2 money:100
com.china.124 time3 name:Jim money:110

rowkey的散列原则:

IMPORTANT: 如果rowkey是类似时间戳的方式递增的生成,建议不要使用正序直接写入rowkey,而是采用reverse的方式反转rowkey,使得rowkey大致均衡分布,这样设计有个好处是能将regionserver的负载均衡

物理存储

每个Table 在行的方向上分割为多个HRegion,每个HRegion分散在不同的RegionServer中。

每个HRegion由多个Store构成,每个Store由一个memStore和0或多个StoreFile组成,每个Store保存一个Columns Family。

StoreFile以HFile格式存储在HDFS中。