HBase是一种构建在HDFS之上的分布式、面向列的存储系统。适合做实时读写、随机访问超大规模数据集。
传统的关系型数据库使用面向行的存储方式,并没有考虑超大规模和分布式的特点,行式数据库按照行存储,行式数据擅长随机读操作,不适合用于大数据。
列式数据库从一开始就是在面向大数据环境下数据仓库的数据分析而产生的。
一、面向行存储的数据库
数据库以行列二维表的形式存储数据,如下表所示。
表中的列是固定的,表中的属性也不能动态增加,这个表存储在计算机的内存和硬盘中,数据库必须把这个二维表存储在一系列一维的“字节”中,由操作系统写入到内存或硬盘中;没有索引的查询需要使用大量I/O,建立索引和视图需要花费大量时间和资源。
二、面向列存储的数据库
列式数据库是把一列中的数据串在一起存储起来,然后再存储下一列的数据。
两种数据库的存储方式都是从上至下,从左至右排列的。行式列的组合,行存储以一行记录为单位,列存储以列数据集合为单位(或称列族)
三、行存储与列存储的对比
1. 行存储的读写过程是一致的,都是从第一列开始,到最后一列结束。
2. 列存储的读取是列数据集中的一段或是全部数据,写入时,一行数据被超分成多列,每一列追加到对应列的末尾处
3. 写入操作行存储 > 列存储,行存储的写入是一次完成的,列存储需要把一行数据拆分成多列分别存储,所以写入次数明显多于行存储,再加上磁头在盘片上移动和定位花费的时候,实际时间消耗会更大。
4. 修改操作行存储 > 列存储,数据修改实际也是一次写入过程,不同的是数据修改是对磁盘上的记录做删除标记。行存储是在指定位置写入一次,列存储是将次哦按定位到多个列上分别写入,这个过程任是行存储时间的倍数。
5. 数据解析操作列存储 > 行存储,数据读取时,由于列存储的每一列数据类型是相同的,不存在二义性问题(如某个数据为整型,它所在的列的所有数据都是整型),但是行存储中的一行数据中可能存储多种类型的数据,数据解析需要在多种类型之间频繁转换,这个操作很消耗CPU,增加解析时间。
行存储的写入是一次完成的,消耗的时间比列存储少,且能保证数据的完整性,但是在数据读取过程中会产生冗余数据,如果只是读取少量数据,此影响可以忽略,数据量大可能会影响数据的处理效率。
列存储在写入效率,数据完整性上都不如行存储,但是在读取过程中不会产生冗余数据,适合做对数据完整性要求不高的大数据处理。