HBase 是列式存储数据库吗
在介绍 HBase 是不是列式存储数据库之前,我们先来了解一下什么是行式数据库和列式数据库。
行式数据库和列式数据库
在维基百科里面,对行式数据库和列式数据库的定义为:
列式数据库是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理(OLAP)和即时查询。
相对应的是行式数据库,数据以行相关的存储体系架构进行空间分配,主要适合于小批量的数据处理,常用于联机事务型数据处理(OLTP)。
比如我们有以下的表格:

那么行式数据库和列式数据库存储模型分别如上面的左图和右图。
可以看到,行式数据一行的数据是在相邻位置存储的;而列式数据相同列是相邻存储的,比如上面的 session_id 这列是放在一起存储的。
HBase 是列式数据库吗
现在我们已经了解了行式数据库和列式数据库的存储格式的简单区别了。
那么进入正文,我们来看下 HBase 是不是列式数据库。
很多地方介绍 HBase 有这么一句话:HBase is a column-oriented database management system that runs on top of Hadoop Distributed File System (HDFS)。
注意里面的 column-oriented 一词,很多资料或者初学者都把它翻译成列式,这句话就中文翻译就变成 HBase 是运行在 HDFS 之上的列式数据库管理系统。
那么 HBase 到底是不是列式存储呢?
其实 HBase 不是列式存储数据库!
本文就从底层存储模式来解释这个。
不管是存储在内存的
MemStore,还是存储在 HDFS 上的 HFile,其都是基于 LSM(Log-Structured
Merge-Tree)结构存储的。
下图有助于我们简单理解 MemStore 和 HFile 是怎么存储数据的,假设我们有以下一张 HBase
表。

那么,HBase 底层的 KV 存储大概如下所示的:

从上图可以看出:
- 不同的列族存在不同的文件中(上面两个表格代表不同的 HFile);
- 整个数据是按照 Rowkey 进行字典排序的;
- 每一列数据在底层 HFile 中是以 KV 形式存储的;
- 相同的一行数据中,如果列族也一样,那么这些数据是顺序放在一起的。
到这里大家应该可以看到,HBase 其实不是列式数据库,因为同一行数据,如果列族也一样,这些数据是存储在相邻位置的;这和上面的列式存储不太一样。
所以说,HBase 既不像行式存储,又不像列式存储。它其实更像是面向列族的存储数据库,因为不同行相同的列族数据是相邻存储的;而同一行不同列族的数据是存储在不同位置的。
注意:HBase实际存储在hdfs上的形式:/hbase/data/default/<tbl_name>/<region_id>/<cf>/<hfile_id>
这也是创建表时,必须指定表名与列族的原因!
所以 HBase is a column-oriented database management system that runs on top of Hadoop Distributed File System (HDFS) 这句话应该翻译成 HBase 是运行在 HDFS 之上的面向列的数据库管理系统。
HBase 是列式存储数据库吗的更多相关文章
- [转载] 【每周推荐阅读】C-Store:列式存储数据库
Record-based与column-based是数据库和存储系统里面两种不同的data layout.我们的思维逻辑是基于行记录的,即Record-based data layout,数据记录都是 ...
- Linux系统:Centos7下搭建ClickHouse列式存储数据库
本文源码:GitHub·点这里 || GitEE·点这里 一.ClickHouse简介 1.基础简介 Yandex开源的数据分析的数据库,名字叫做ClickHouse,适合流式或批次入库的时序数据.C ...
- 列式存储(三)JFinal DB.tx()事务
上一篇中说道了列式存储中新增表单时后台接收数据问题,在存入数据库时一次插入多条数据,就要用到事务. JFinal中有个封装好的事务应用,用起来非常方便简单. 写法1: Db.tx(new IAtom( ...
- 【HBase】与关系型数据库区别、行式/列式存储
[HBase]与关系型数据库区别 1.本质区别 mysql:关系型数据库,行式存储,ACID,SQL,只能存储结构化数据 事务的原子性(Atomicity):是指一个事务要么全部执行,要么不执行,也就 ...
- 五分钟轻松了解Hbase面向列的存储
说明:从严格的列式存储的定义来看,Hbase并不属于列式存储,有人称它为面向列的存储,请各位看官注意这一点. 行式存储 传统的数据库是关系型的,且是按行来存储的.如下图: 其中只有张三把一行数据填满了 ...
- 为什么列式存储会被广泛用在 OLAP 中?
大家好,我是大D. 不知是否有小伙伴们疑问,为什么列式存储会广泛地应用在 OLAP 领域,和行式存储相比,它的优势在哪里?今天我们一起来对比下这两种存储方式的差别. 其实,列式存储并不是一项新技术,最 ...
- 列式存储(二)JFinal如何处理从前台传回来的二维数组
上一篇说到了列式存储,这一篇说它的存储问题,将每个模块的所有属性字段单独存到一张表中,新增页面时,所有的字段都去数据库请求,这样多个模块的新增功能可以共用一个jsp.由于每个模块的字段个数不一样,有的 ...
- 列式存储 V.S. 行式存储
列式数据库 http://zh.wikipedia.org/wiki/%E5%88%97%E5%BC%8F%E6%95%B0%E6%8D%AE%E5%BA%93 列式存储与行式存储 http://my ...
- oracle 12c 列式存储 ( In Memory 理论)
随着Oracle 12c推出了in memory组件,使得Oracle数据库具有了双模式数据存放方式,从而能够实现对混合类型应用的支持:传统的以行形式保存的数据满足OLTP应用:列形式保存的数据满足以 ...
随机推荐
- Jenkins时区设置为北京时间
打开 [系统管理]->[脚本命令行]运行下面的命令 System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/ ...
- 【微信小程序云开发】从陌生到熟悉
前言 微信小程序在9月10号正式上线了云开发的功能,弱化后端和运维概念,以前开发一个小程序需要申请一个小程序,准备一个https的域名,开发需要一个前端一个服务端,有了云开发只有申请一个小程序,一个前 ...
- SQL Server查询所有的表名、字段名、注释
SELECT 表名 then d.name else '' end, 表说明 then isnull(f.value,'') else '' end, 字段序号=a.colorder, 字段名=a.n ...
- [六] 函数式接口的复合方法示例 predicate 谓词逻辑运算 Function接口 组合运算 比较器 逆序 比较链
复合的方法 有些函数式接口提供了允许复合的方法 也就是可以将Lambda表达式复合成为一个更加复杂的方法 之前的章节中有说到: 接口中的compose, andThen, and, or, negat ...
- springboot情操陶冶-web配置(七)
参数校验通常是OpenApi必做的操作,其会对不合法的输入做统一的校验以防止恶意的请求.本文则对参数校验这方面作下简单的分析 spring.factories 读者应该对此文件加以深刻的印象,很多sp ...
- 一篇文章彻底搞懂es6 Promise
前言 Promise,用于解决回调地狱带来的问题,将异步操作以同步的操作编程表达出来,避免了层层嵌套的回调函数. 既然是用来解决回调地狱的问题,那首先来看下什么是回调地狱 var sayhello = ...
- Redis数据类型使用场景及有序集合SortedSet底层实现详解
Redis常用数据类型有字符串String.字典dict.列表List.集合Set.有序集合SortedSet,本文将简单介绍各数据类型及其使用场景,并重点剖析有序集合SortedSet的实现. Li ...
- 详解什么是平衡二叉树(AVL)(修订补充版)
详解什么是平衡二叉树(AVL)(修订补充版) 前言 Wiki:在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树.查 ...
- 关于 vue 不能 watch 数组变化 和 对象变化的解决方案
原文地址:关于 vue 不能 watch 数组变化 和 对象变化的解决方案 vue 监听数组和对象的变化 vue 监听数组 vue 实际上可以监听数组变化,比如: data () { return { ...
- Spring webflux
Spring-webflux Spring 5.0 Spring-webflux 是一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的.非堵塞的.事件驱动的服务. sprin ...