我本想用MySQL来与HBase作比较,但发现他们两者毫无可比性,因为两者运用领域不同,各自有各自的优点,就好比爬山穿登山鞋,潜水穿脚蹼一般。
一门技术的兴起,一个优秀的开源项目的存在肯定是有它所存在的意义,正如大数据一样,正是因为随着时间的发展,随着技术的发展导致我们每天的数据增量达到一个非常庞大的状态,同时在数据之中又能挖掘到很多有用的信息。所以才有了大数据技术的飞速发展。
而学习HBase不仅仅是因为他属于Hadoop生态圈,而且他很特殊;
我想各位在接触HBase之前可能就没有看到过哪个数据库是面向列存储的,我也不知该如何简述他的与众不同,总之我们就沉浸下来,由笔者带各位从下文的学习中深刻体会一下吧。
HBase是什么
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统;
HBase是Apache的Hadoop项目的子项目;
HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库;
HBase另一个不同的是HBase基于列的而不是基于行的模式;
HBase利用Hadoop的HDFS作为其文件存储系统,利用zookeeper作为其分布式协调服务主要用来存储半结构化或非结构化的松散数据。
海量数据存储:
上百亿行 x 上百万列
并没有列的限制
当表非常大的时候才能发挥这个作用, 最多百万行的话,没有必要放入hbase中
百亿行 x 百万列,在百毫秒以内
Hbase在实际场景中的应用
1). 交通方面:
船舶GPS信息,全长江的船舶GPS信息,每天有1千万左右的数据存储
2). 金融方面:
消费信息,贷款信息,信用卡还款信息等
3). 电商:
淘宝的交易信息等,物流信息,浏览信息等
4). 移动:
通话信息等,都是基于HBase的存储
容量大:
传统关系型数据库,单表不会超过五百万,超过要做分表分库
Hbase单表可以有百亿行、百万列,数据矩阵横向和纵向两个维度所支持的数据量级都非常具有弹性
面向列:
面向列的存储和权限控制,并支持独立检索,可以动态增加列,即,可单独对列进行各方面的操作
列式存储,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段的时候,能大大减少读取的数量
多版本:
Hbase的每一个列的数据存储有多个Version,比如住址列,可能有多个变更,所以该列可以有多个version
稀疏性:
为空的列并不占用存储空间,表可以设计的非常稀疏。
不必像关系型数据库那样需要预先知道所有列名然后再进行null填充
拓展性:
底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点服务(机器)就可以了
高可靠性:
WAL机制,保证数据写入的时候不会因为集群异常而导致写入数据丢失
Replication机制,保证了在集群出现严重的问题时候,数据不会发生丢失或者损坏
Hbase底层使用HDFS,本身也有备份。
高性能:
底层的LSM数据结构和RowKey有序排列等架构上的独特设计,使得Hbase写入性能非常高。
Region切分、主键索引、缓存机制使得Hbase在海量数据下具备一定的随机读取性能,该性能针对Rowkey的查询能够到达毫秒级别
LSM树,树形结构,最末端的子节点是以内存的方式进行存储的,内存中的小树会flush到磁盘中(当子节点达到一定阈值以后,会放到磁盘中,且存入的过程会进行实时merge成一个主节点,然后磁盘中的树定期会做merge操作,合并成一棵大树,以优化读性能。)
总结:
面向列,容量大,写入比mysql快但是读取没有,超过五百万条数据的话建议读写用Hbase。


在HBase中有些术语需要提前了解一下:
命名空间类似于关系型数据库中数据库的概念,它其实是表的逻辑分组。
命名空间是可以管理维护的,可以创建,删除或者更改命名空间
HBase有两个特殊定义的命名空间:
default:没有明确指定命名空间的表将自动划分到此命名空间
hbase:系统命名空间,用于包含HBase内部表
HBase采用表来组织数据;
他不同于MySQL的是他的表不是单纯由行(记录)列(字段)组成
他的表由RowKey、Colum Family、Colum Qualifier、Timestamp、cell共同构成
RowKey是用来检索记录的主键,是一行数据的唯一标识
RowKey可以是任意字符串最大长度是64KB,以字节数组保存
存储时,数据按照Row Key的字典序排序,设计RowKey时要充分考虑排序存储这个特性,将经常读取的行存放到一起
列族在物理上包含了许多列与列的值,每个列族都有一些存储的属性可配置
将功能相近的列存放到同一个列族中,相同列族中的列会存放在同一个store中
列族一般需要在创建表的时候声明,一般一个表中的列族不超过3个
列隶属于列族,列族隶属于表
列族的限定词,理解为列的唯一标识。但是列标识是可以改变的,因此每一行会有不同的列标识
使用的时候必须列族:列
列可以根据需求动态添加或删除,同一个表中的不同行的数据列都可以不同