hbase基础
NoSQL(not only sql)
- 当数据达到几千万甚至几亿条的时候,传统关系型数据库的性能会明显下降
- CAP定理:
- CAP定理即Consistency Availability and Partition tolerance
- Consistency(强一致性):数据更新操作的一致性,所有数据变动都是同步的
- Availability(高可用性):良好的响应性能
- Partition tolerance(高分区容错性):可靠性
- 所谓CAP定理即任何分布式系统只可能同时满足两点,不可能兼顾三者
- CAP定理即Consistency Availability and Partition tolerance
- 有些数据库再实现性能的时候会牺牲一部分一致性,即数据再更新的时候,不会立即同步,如你发了一条朋友圈,你的一部分朋友立马看到了这条信息,而另一部分朋友可能要等到1分钟之后才能刷出这条消息。虽然有延时,但是对于这样一个社交的场景,这个延时是可以容忍的。
- nosql数据库最初指的是不适用sql标准的数据库,现在泛指非关系型数据库
- nosql数据库意味not only sql,意为不仅仅是sql。很多时候nosql和传统关系型数据库是相辅相成的,谁也不能替代谁
HBase的定义与特点
定义
- hbase是一种分布式、可扩展、支持海量数据存储的nosql数据库
- hbase面向列存储,构建与hadoop之上类似于Google的BigTable,提供对10亿级别表数据的快速随机实时读写!
特点
- 海量存储
- hbase可以存储pb级别的海量数据,再pb级别的数据及廉价pc存储的情况下,仍然可以在几十到百毫秒内返回数据,这是因为hbase有着良好的可扩展性
- 列式存储
- hbase的列式存储其实是列族存储,hbase通过列族储存数据,列族下面可以有非常多的列,列族在创建表的时候就必须指定
- 极易扩展
- hbase的扩展性体现在两个方面:
- 基于上层处理能力(RegionServer)的扩展
- 一个是基于存储的扩展(HDFS)
- 通过横向添加RegionSever的机器,进行水平扩展,提升HBase上层的处理能力,提升Hbase服务更多Region的能力
- hbase的扩展性体现在两个方面:
- 高并发
- 由于目前大部分使用HBase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,HBase的单个IO延迟下降并不多。能获得高并发、低延迟的服务
- 稀疏
- 稀疏主要针对的是hbase列灵活的特点,在列族中你可以指定任意数量的列,在列为空的情况下不会占用内存
hbase的优点
- hdfs有着高容错、高扩展的特点,基于其实现数据存储的hbase同样有着与生俱来的超强的扩展性和吞吐量
- hbase采用kv对的方式存储数据,这意味着即使面临海量数据的增长,也不会导致查询性能的下降
- hbase是一个列式数据库,相对于于传统的行式数据库而言。当你的单张表字段很多的时候,可以将相同的列(以regin为单位)存在到不同的服务实例上,分散负载压力
hbase的缺点
- 架构设计复杂,且使用HDFS作为分布式存储,因此只是存储少量数据,它也不会很快。在大数据量时,它慢的不会很明显
- Hbase不支持表的关联操作,因此数据分析是HBase的弱项。常见的 group by或order by只能通过编写MapReduce来实现
- Hbase部分支持了ACID
hbase的结构:
hbase的数据模型
- namespace
- 命名空间,类似关系型数据库中的数据库,每个命名空间下有多个表。
- HBase两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表是用户默认使用的命名空间
- table
- 类似关系型数据库中的表,不同的是,HBase定义表时只需要声明列族即可,数据属性,比如超时时间(TTL),压缩算法(COMPRESSION)等,都在列族的定义中定义,不需要声明具体的列
- row
- Base表中的每行数据都由一个RowKey和多个Column(列)组成
- 一行包含多个列,这些列通过列族进行分类,行中的数据所属列族只能从该表所定义的列族中选取,不能定义这个表中不存在的列族
- rowkey
- Rowkey由用户指定的一串不重复的字符串定义,是一行的唯一标识
- 数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索,所以RowKey的设计十分重要
- 如果使用已经用过的rowkey,则会直接覆盖之前的数据
- column family
- 列族是多个列的集合
- 一个列族可以灵活的定义多个列
- 表的相关属性大部分都定义在列族上,同一个表里的不同列族可以有完全不同的属性配置,但是同一个列族内的所有列都会有相同的属性
- 列族存在的意义是HBase会把相同列族的列尽量放在同一台机器上,所以说,如果想让某几个列被放到一起,你就给他们定义相同的列族
- 对于每个表来说,列族越少越好
- column qualifier
- Hbase中的列是可以随意定义的,一个行中的列不限名字、不限数量,只限定列族。因此列必须依赖于列族存在
- 因为HBase中的列全部都是灵活的,可以随便定义的,因此创建表的时候并不需要指定列
- 对于当前行来说,其他行有那些列是不确定的,只有扫描数据才能得知
- timeStamp
- 用于标识数据的不同版本(version)。时间戳默认由系统指定,也可以由用户显式指定
- 在读取单元格的数据时,版本号可以省略,如果不指定,Hbase默认会获取最后一个版本的数据返回
- cell
- 一个列中可以存储多个版本的数据,每个版本就被称为一个单元格(cell)
- cell由rowkey、column family、column qualifier、time stamp确定
- cell中的数据是没有类型的,全部是字节码的形式
- region
- refion由一个表的若干行组成,在region中行按照rowkey的字典顺序进行排列
- Region不能跨RegionSever,且当数据量大的时候,HBase会拆分Region
- Region由RegionServer进程管理。HBase在进行负载均衡的时候,一个Region有可能会从当前RegionServer移动到其他RegionServer上
- Region是基于HDFS的,它的所有数据存取操作都是调用了HDFS的客户端接口来实现的
hbase的基本架构
- 架构角色
- region server
- regionServer是一个服务,负责多个数据的管理,其实现类为HRegionServer
- Master
- Master是所有Region Server的管理者,其实现类为HMaster
- Zookeeper
- RegionServer非常依赖ZooKeeper服务,ZooKeeper管理了HBase所有RegionServer的信息,包括具体的数据段存放在哪个RegionServer上
- 客户端每次与HBase连接,其实都是先与ZooKeeper通信,查询出哪个RegionServer需要连接,然后再连接RegionServer
- HDFS
- hdfs为hbase提供了底层数据存储的服务
- region server