HBase是面向列存储的列式数据库
列式数据库:对数据库中的数据存储时,是按照列来存储的。
附:对于普通的行式关系型数据库,对于查询语句SELECT ID, NAME FROM STUDENT,则处理该查询命令时,是先从STUDENT表中将所有列的数据都查出来返回给客户端,然后再客户端在将ID列和NAME列过滤出来呈现给客户,这样对于磁盘的IO消耗太大,查询速度就会降低。对于列式数据库来说,则查询时不需要把所有的列数据都查出来。
列式数据库的优势:对表中数据的查询只查询一部分列时,查询速率很快,因为不需要查询那些不需要的列数据;当表中数据的大量列的字段值为空时,不会存储空值,这样节省空间。
行式数据库的优势:在定义表的时候,表的列定义已经固定了有哪些列,每一列的类型也是固定的,这样对于给定的一行数据,其最大长度是固定的。因为行式数据库存储时是按照行进行存储的,即存储完一行数据,接着存储下一行数据(且每一行数据的长度是固定大小的),所以在查询的时候,根据存储首地址和行键可以快速定位到要查询的数据的存储位置,因此查询效率非常高。
HBase使用HDFS作为文件存储系统,采用Hadoop的MapReduce来完成HBase对海量数据的操作,利用Zookeeper作为协调工具。
HBase数据在存储数据时,是按照行健存储的,而关系型数据库则是按照插入时间进行存储。
HBase在查询时,也只可以根据行键进行查询,但是我们可以根据API进行进一步过滤。
-ROOT-和.META.是hbase的系统内部表。用户请求过来的时候,首先通过Zookeeper找到-ROOT-表,然后根据-ROOT-表找到对应的.META. 然后根据.META.找到对应的RegionServer,然后根据RegionServer找到最终存放数据的Server。
在HBase中,使用delete删除列时,例如命令delete ‘stu’ , ’2’, ’bas:age’,最后删除的是stu表中的行键为2的列簇为bas的其下面的列为age的该列,但是并没有删除stu表中行键非2的列簇为bas下面的age列,即查询get ‘stu’,’1’, ’bas:age’仍保留原数据。
Hbase中的put命令实际上并没有修改值,而是插入新值,因为put时和原数据的时间戳不一样,这样两个版本都存在,默认查询的是最新的,但是旧的仍保留。
利用MapReduce将数据从HDFS中批量导入HBase中的方法:
1、 在HBase中创建表
2、 确定表的行键是什么,确定列
Scan也具有强大的过滤功能:作用于客户端上,即查询出所有记录,在客户端进行过滤
Filter同样具有过滤功能:直接作用于RegionServer上,直接根据过滤条件在查询中过滤,只查询需要的数据。直接作用于服务器端。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/9549.html