分布式数据库HBase:从零开始了解列式存储

在接触过大量的传统关系型数据库后你可能会有一些新的问题: 无法整理成表格的海量数据该如何储存? 在数据非常稀疏的情况下也必须将数据存储成关系型数据库吗? 除了关系型数据库我们是否还有别的选择以应对Web2.0时代的海量数据?

如果你也曾经想到过这些问题, 那么HBase将是其中的一个答案, 它是非常经典的列式存储数据库. 本文首先介绍HBase的由来以及其与关系数据库的区别, 其次介绍其访问接口、数据模型、实现原理和运行机制. 即便之前没有接触过HBase的相关知识也不影响阅读该文章.

请添加图片描述

如果想了解其他的非关系型数据库也可以查看我的博客文章:NoSQL数据库

概述

HBase是谷歌公司BigTable的开源实现. 而BigTable是一个分布式存储系统, 使用谷歌分布式文件系统GFS作为底层存储, 主要用来存储非结构化和半结构化的松散数据. HBase的目标是处理非常庞大的表, 可以通过水平扩展的方式利用廉价计算机集群处理超过10亿行数据和百万列元素组成的数据表.


GFS、HDFS、BigTable、HBase的关系:
HDFS是GFS的开源实现. HBase是BigTable的开源实现.

GFS是BigTable的底层文件系统, BigTable的数据存储在GFS上.
HDFS是HBase的底层存储方式. 虽然HBase可以使用本地文件系统, 但是为了提高数据可靠性一般还是会选择HDFS作为底层存储.


HBase和BigTable底层技术对应关系

项目BigTableHBase
文件存储系统GFSHDFS
海量数据处理系统MapReduceHadoop MapReduce
协同服务系统ChubbyZookeeper

与传统的数据库相比主要区别在于:

  1. 数据类型: 关系数据库采用关系模型, HBase则采用更加简单的数据模型–将数据存储为未经解释的字符串.
  2. 数据操作: 关系数据库通常包括丰富的操作, 涉及复杂的多表连接. HBase则不存在复杂的多表关系, 只有简单的增删查改.
  3. 存储模式: 关系数据库是基于行模式存储的, 元组或行被连续地存储在磁盘中. HBase是基于列存储的.
  4. 数据索引: 关系数据库可以针对不同列构建复杂的多个索引以提高访问效率. HBase则只有一个索引–行键.
  5. 数据维护: 关系数据库中更新操作会用新值替换旧值. HBase则会保留旧数据, 仅仅生成一个新的版本.
  6. 可伸缩性: 关系数据库很难进行横向扩展, 纵向扩展的空间也比较有限. HBase作为分布式数据库可以轻易地通过增加集群中的机器数量来达到性能的伸缩.

访问接口

HBase提供了多种访问方式, 不同的方式适用于不同的场景.

类型特点场合
Native Java API最常规高效的访问方式适合Hadoop MapReduce作业并行批处理HBase表数据
HBase ShellHBase的命令行工具, 最简单的接口适合HBase管理
Thrift Gateway利用Thrift序列化技术, 支持C++, PHP, Python等多种语言适合其他异构系统访问HBase
REST Gateway解除语言限制支持REST风格的HTTP API访问HBase
Pig使用Pig Latin流式编程语言来处理HBase的数据适合做数据统计
Hive简单可以用类似SQL语言的方式来访问

数据模型

数据模型是一个数据库产品的核心, 接下来将介绍HBase列族数据模型并阐述HBase数据库的概念视图和物理视图的差异.

相关概念

HBase实际上是一个稀疏、多维、持久化存储的映射表, 采用行键、列族、列限定符和时间戳进行索引, 每个值都是未经解释的字节数组byte[].

表由行和列组成, 列被分为若干个列族

每个HBase表都由若干行组成, 每个行由行键(Row Key)进行标识.

访问表中的行有3种方式:

  1. 通过单个行键访问
  2. 通过行键区间访问
  3. 全表扫描

行键可以是任意字符串(最大长度64KB, 实际应用中一般为10-100字节). 在HBase内部将行键保存为 字节数组, 按照行键的 字典序 排序. 所以在设计行键时可以充分考虑该特性, 将需要一起读的行存储在一起.

列族

HBase中一个表被分为多个列族, 列族是最基本的访问控制单元. 表中的每个列都必须属于一个列族, 我们可以将其理解为 把列按照需求分到不同的组中, 就如同整理文件到不同的文件夹中去.

为什么要这么做?

  1. 控制权限. 我们通过列族可以实现权限的控制, 例如某些应用只可以修改某些数据.
  2. 获得更高的压缩率. 同一个列族中的所有数据都属于同一种数据类型, 着通常意味着更高的压缩率.

缺点

  1. 列族数量不可太多. HBase的一些缺陷导致列族只能有几十个.
  2. 不能频繁修改.
列限定符

列族中的数据是通过列限定符来定位的. 列限定符无需事先定义, 也没有数据类型, 总被视为字节数组byte[].

单元格

在HBase的表中, 通过行、列和列限定符可以确定一个"单元格(Cell)". 单元格中存储的数据没有数据类型, 总被视为字节数组byte[].

每个单元格中可以保留一个数据的多个版本, 每个版本对应一个不同的时间戳.

时间戳

每个单元格都保留了同一个数据的多个版本, 这些版本采用时间戳进行索引. 事实上每一次对于一个单元格执行的操作(增删改)时, HBase都会自动生成并存储一个时间戳, 通常这个时间戳是64位整型. 当然, 这个时间戳也可以由用户自己赋值, 用以避免应用程序中出现数据版本冲突.

一个单元格中的不同版本的数据是以时间戳降序排序的, 以便于读到最新的数据版本.

我认为下面的一张图可以很好地表述上面的5个概念. 类比于关系数据库, 行键就是主键行号, 列限定符就是列名, 列族就是列名组成小组的组名, 单元格就是具体存储数据的格子, 时间戳则标识了一个单元格中不同时间的数据版本.

请添加图片描述

一个HBase数据模型的实例

数据坐标

相较于我们所熟悉的关系数据库, HBase无法仅使用行号和列号确定一个数据. 在HBase中, 我们需要: 行键、列族、列限定符和时间戳 这4个东西来确定一个数据.

[行键, 列族, 列限定符, 时间戳]被称为是HBase的坐标, 可以通过这个坐标来直接访问数据. 在这种层面上讲, HBase也可以被视为一个键值数据库.

概念视图

在HBase的概念视图中, 一个表是一个稀疏、多维的映射关系.

时间戳列族 contents列族 anchor
com.cnn.wwwt5anchor:cnnsi.com="CNN"
t4anchor:my.look.ca="CNN.com"
com.cnn.wwwt3contents:html="xxxx"
t2contents:html="xxxx"
t1contents:html="xxxx"

上表存储了一个网页的页面内容(html代码)和一些反向连接. contents中存储的是网页内容, anchor中存储的是反向连接. 不过有几个地方需要额外注意:

  1. 行键. 行键采用的是url的倒序, 因为HBase的行键采用字典倒序排列, 这样可以使得相同的网页都保存在相邻的位置
  2. 每个行都包含了相同的列族, 即便有些列族不需要存储数据(为空)

物理视图

列族 contents

时间戳列族 contents
com.cnn.wwwt3contents:html="xxxx"
t2contents:html="xxxx"
t1contents:html="xxxx"

列族 anchor

时间戳列族 anchor
com.cnn.wwwt5anchor:cnnsi.com="CNN"
t4anchor:my.look.ca="CNN.com"

我们可以轻易发现, 在物理的存储层面上来看HBase采用了基于列的存储方式, 而不是传统关系数据库那样基于行来存储. 这也是HBase与传统关系数据库间的重要区别.

与概念视图的不同

  1. 列族的分开存放. 可以看到contents和anchor两个列族被分开存放.
  2. 不存在空值. 在概念视图中有些列是空的, 但是在物理视图中这些值根本不会被存储.

总结

行式数据库使用 NSM(N-ary Storage Model) 存储模型, 将一个元组(或行)连续地存储在磁盘页中. 数据被一行一行地储存, 写完第一行再写第二行. 在读取数据时需要从磁盘中顺序扫描每个元组的完整内容. 显然, 如果每个元组只有少量属性的值对查询有用时, NSM模型会浪费许多磁盘空间.

列式数据库采用 DSM(Decomposition Storage Model) 存储模型, 将关系进行垂直分解, 以列为单位存储, 每个列单独存储. 该方法最小化了无用的I/O.

行式存储主要适合于小批量的数据处理, 比如联机事务处理. 列式数据库主要适用于批量数据处理和即席查询(Ad-Hoc Query). 列式数据库的优点是: 降低I/O开销, 支持大量用户并发查询, 数据处理速度比传统方法快100倍, 并且具有更高的数据压缩比.

如果严格从关系数据库的角度来看, HBase并不是一个列式存储的数据库, 毕竟它是以列族为单位进行分解的, 而不是每个列都单独存储. 但是HBase借鉴和利用了磁盘上这种列存的格式, 所以某种角度上来说它可以被视为列式数据库. 常用的商业化列式数据库有: Sybase IQ, Verticad等.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/367951.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程】lighttpd配置端口反向代理

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 1、修改配置文件: sudo vim /etc/lighttpd/lighttpd.conf2、先添加mod_proxy: 3、然后添加端口映射: 4、保存&…

24位DAC转换的FPGA设计及将其封装成自定义IP核的方法

在vivado设计中,为了方便的使用Block Desgin进行设计,可以使用vivado软件把自己编写的代码封装成IP核,封装后的IP核和原来的代码具有相同的功能。本文以实现24位DA转换(含并串转换,使用的数模转换器为CL4660)为例,介绍VIVADO封装IP核的方法及调用方法,以及DAC转换的详细…

SpringBoot 通过Knife4j集成API文档 在线调试

介绍 Knife4j 是一款基于 Swagger 构建的增强型 API 文档生成工具&#xff0c;它提供了更多的定制化功能和界面优化&#xff0c;使得生成的 API 文档更加美观和易用。它可以帮助开发者快速生成和管理 API 文档&#xff0c;支持在线调试和交互。 依赖 <!--knife4j--> &…

不用编码构建本地RAG聊天机器人

前言 还记得开发一个智能聊天机器人需要花费数月编码的时间吗&#xff1f; 像 LangChain 这样的框架确实简化了开发&#xff0c;但是对于非程序员来说&#xff0c;数百行代码仍然是一个障碍。⁤ 就在那时&#xff0c;我发现了“Lang Flow”&#xff0c;这是一个基于 Python 版…

鸿蒙开发设备管理:【@ohos.settings (设置数据项名称)】

设置数据项名称 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 本模块提供设置数据项的访问功能相关接口的说明及示例。 导入模块 import settings from ohos.settings;settings.getUri…

Windows Hello | 看起来您已经在另一个帐户上设置了 Windows Hello。

问题&#xff1a; 换了新电脑之后一直设置不了Window Hello&#xff0c;报错是 "it looks like youve already setup Windows Hello on another account."。 >>重复set up不行。 >>从旧电脑移除了Windows Hello设置也不行。 >>确认过我的Local…

工具:颜色查询 / CMYK颜色查询RGB、HSL、HSV、XYZ的颜色值

一、颜色查询-网址 RGB(90,223,9),#5ADF09 颜色查询,颜色梯度,色彩搭配,色盲模拟 - RGB颜色查询 - 在线工具 - Fontke.com 二、CMYK颜色查询RGB、HSL、HSV、XYZ的颜色值 三、颜色梯度 四、色彩搭配 五、色盲模拟 六、欢迎交流指正

素颜简约的个人导航网站源码

源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 素颜简约的个人导航网站源码

高级IO_多路转接之select

文章目录 [TOC](文章目录) 前言文件描述符的阻塞和非阻塞fcntl 多路转接之selectselect接口select的缺点 前言 关于IO&#xff0c;我们已经用过了不少IO接口&#xff0c;从最简单的printf、scanf->C语言文件接口fprintf、fscanf->系统文件接口read、write->再到我们的…

docker -run hello-world超时

主要原因就是尝试拉取库的时候没有从阿里云镜像里拉&#xff0c;所以设置一下就好了 这里使用的是ubuntu系统&#xff08;命令行下逐行敲就行了&#xff09; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": [&quo…

Unity Shader 极坐标

Unity Shader 极坐标 前言项目简单极坐标极坐标变体之方形极坐标变体之圆形拉花封装方法 鸣谢 前言 极坐标记录 项目 简单极坐标 极坐标变体之方形 极坐标变体之圆形 拉花 封装方法 鸣谢 【菲兹杂货铺】【Unity Shader教程】极坐标实现以及极坐标的两种变体

使用dot来画流程图

Dot是一种图形描述语言&#xff0c;属于Graphviz软件的一部分。Graphviz是一个用于可视化图形&#xff08;图表、网络图等&#xff09;的开源工具集。使用Dot语言&#xff0c;你可以创建并描述节点和边&#xff0c;从而生成图形。以下是如何使用Dot语言画图的基本步骤&#xff…

巴西市场有哪些电商平台?巴西最畅销的产品有哪些?

巴西&#xff0c;作为南美洲最大的经济体之一&#xff0c;近年来在电子商务领域展现出强劲的增长势头。随着互联网的普及和消费者购物习惯的改变&#xff0c;电商平台在巴西市场上“打”得热火朝天&#xff0c;不过占据市场份额最大的依然还是美客多。本文将探讨巴西市场上的主…

[C++][设计模式][访问器]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受1.代码一2.代码二 1.动机 在软件构件过程中&#xff0c;由于需求的变化&#xff0c;某些类层次结构中常常需要增加新的行为(方法)&#xff0c;如果直接在基类中做这样的更改&#xff0c; 将会给子类带来很繁重的变更负担&#xff0c…

数据泄露时代的安全之道:访问认证的重要性

引言 想象一下&#xff1a;你一觉醒来&#xff0c;收到一条通知——你的公司遭遇了数据泄露。你感到恐惧&#xff0c;因为这意味着客户数据被曝光&#xff0c;公司声誉受损&#xff0c;还有巨额罚款在等着你。在当今的数字化环境中&#xff0c;这种情况太常见了。全球各地的组…

数据库组成及原理

属性&#xff1a; 把数据库中的一个表类比成一个公司&#xff0c;那么公司里的每个人都是一个“属性”&#xff08;表中的一个字段视为一个属性&#xff09;&#xff0c;不管老板还是员工&#xff0c;只要是公司里的人&#xff0c;就都是一个属性。 主键&#xff1a; 老板就是“…

R语言学习,入门

我是一名6年开发经验的程序员&#xff0c;后端&#xff0c;大数据&#xff0c;前端都会。 现在加入了医疗行业&#xff0c;要做数据分析&#xff0c;前同事的实验室生信专业的&#xff0c;用的是R语言&#xff0c;为了跑通他的程序。就来学一下吧&#xff0c;看了一下好像挺简…

色彩魔术-空气远近法

1. 定义 空气远近法&#xff0c;是使用色彩差异表现远近的一种方法&#xff0c;即色彩透视法。 色彩透视法&#xff1a;也称色彩远近法&#xff0c;它是空气透视法的一种&#xff0c;它也是跟空气的厚薄有关&#xff0c;景物距离观察者越远其颜色饱和度越低&#xff0c;亮度也…

尝试修改苍穹外卖为”李小罗餐厅“

学习苍穹外卖后&#xff0c;将其修改为自己所需要的项目&#xff0c;也是对苍穹外卖项目的加深理解 对项目之间的连接等关系进一步清晰&#xff0c;那么便开始吧 d1_开始修改 修改名字为”李小罗餐厅“ src\views\login\index.vue src\router.ts 结果展示 修改进来之后的展示…

nginx转发的问题

我在项目配置的时候遇到一个问题&#xff1a; 配置了域名转发&#xff0c;且配置了https nginx配置如下&#xff1a; server {listen 443 ssl;server_name yourdomain.com;ssl_certificate /path/to/your/certificate.crt;ssl_certificate_key /path/to/your/private.key;loca…