1、hbase产生背景
hadoop擅长存储各种格式的庞大的数据,任意格式甚至非结构化的数据的处理。
但是hadoop对于数据的处理,存在如下问题:
hadoop只能执行批量处理,并且只以顺序方式访问数据。
即使一个简单的搜索工作,也必须搜索整个数据集。而工作中,存在如下需求:需要从庞大的数据集中随机访问某个数据,hadoop不能解决。
于是诞生了:Hbase、Cassandra、MongoDB等数据库,这些数据库可以存储大量的数据并能以随机方式访问数据库中的数据。
2、什么是hbase?
1)、hbase是BigTable的开源版本,源码使用java编写。
2)、hbase是apache hadoop的数据库,是建立在hdfs之上。
3)、hbase是一个高可靠性、高性能、可伸缩的基于列存储的nosql的分布式数据存储系统。
4)、hbase可以实现对大型数据的实时、随机的读写访问。
注:hbase需要依赖hdfs做底层的数据存储;依赖mapReduce做数据计算;依赖zookeeper做服务协调。
3、hbase数据库的特点
1)、hbase查询数据功能很简单,但是不支持join等复杂操作。
2)、hbase不支持复杂的事务,只支持行级事务。(可以通过hive支持来实现多表join等复杂操作)
3)、hbase介于nosql和RDBMS之间,仅能通过主键(rowkey)和主键的range来检索数据
4)、hbase中支持的数据类型只有byte[]即字节数组,底层存储的所有数据都是字节数组。
5)、hbase主要用来存储结构化和半结构化的松散数据。
4、hbase中的表如下图所示:
1)、RowKey:行键,用来区分某一行的数据
rowKey可以是任意字符串(最大长度是64KB,实际应用中长度一般为10-100bytes),最好是16bytes。
rowKey保存为字节数组,hbase会对表中的数据按照rowKey排序(即字典排序)
hbase只支持3种查询方式:1)、基于Rowkey的单行查询;2)、基于Rowkey的范围扫描;3)、全表扫描。
2)、ColumnFamily:列簇
hbase通过列簇划分数据的存储,列簇下面可以包含任意多的列,实现灵活的数据存储。就像家族由很多家庭组成一样,列簇是由很多列组成的。
hbase表在创建的时候就必须指定列簇,就像关系型数据库创建的时候必须指定具体的列一样。
hbase的列簇并不是越多越好,官方推荐的列簇最好小于或者等于3,我们使用的场景一般是1个列簇。
3)、Column:列
4)、TimeStamp:时间戳
TimeStamp是实现Hbase多版本的关键,在hbase中使用不同的timestamp来标识相同rowkey行对应的不同版本的数据。
时间戳的类型是64位整型,可以由hbase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前的系统时间。
时间戳也可以由客户自己赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。
每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在多版本造成的管理(存储和索引)负担,hbase提供了两种数据版本的回收方式
1)、保存数据的最后N个版本
2)、保存最近一段时间内的版本(设置数据的声明周期TTL)
5、hbase中表的特点
1)、大:一个表可以有上十亿的行,上百万的列
2)、面向列:hbase是基于列的存储,列可以独立检索
3)、稀疏松散:对于为空(null)的列,并不占用存储空间,因此表的设计非常稀疏松散
4)、无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列。
6、hbase的基本架构
通过上述架构图,了解架构角色如下:
6.1、Master:其实现类为HMaster
它是所有Region Server的管理者
作用如下:
1)、对表进行create、delete、alter,以及列簇的增加等操作
2)、为RegionServer分配Region
3)、发现失效的RegionServer并重新分配其上的Region
4)、hdfs上的垃圾文件(hbase)回收
5)、负责RegionServer的负载均衡
6.2、RegionServer:其实现类为HRegionServer
RegionServer是Region的管理者
它的作用如下:
1)、对表中的数据进行操作:get查询、put新增、delete删除
2)、维护master分配给它的Region,处理对这些Region的IO请求
3)、regionServer负载split在运行过程中变得过大的region,负责compact操作。
6.3、zookeeper
hbase通过zookeeper来做master的高可用、regionServer的监控、元数据的入口以及集群配置的维护等工作。