原文
HBase与传统的关系数据库(如MySQL、PostgreSQL,Oracle等)非常不同,它的架构和提供给HBase的功能使用它的应用程序。 HBase权衡了其中一些功能,以实现可扩展性和灵活的架构。 这也意味着HBase的数据非常不同模型。 与关系型相比,设计HBase表是一种不同的方式数据库系统。

基本概念

  • Table:HBase将数据组织到表中。 表名是字符串,由可在文件系统路径中安全使用的字符组成
  • Row:在表内,数据根据其行进行存储。 行通过行键唯一标识。 行键没有数据类型,并且始终被视为byte [](字节数组)。
  • Column Family:行中的数据按列族分组。 列族还影响存储在HBase中的数据的物理排列。 因此,必须预先定义它们并且不容易对其进行修改。 表中的每一行都具有相同的列族,尽管行不必在其所有行中存储数据Family。 列族是字符串,由可在文件系统路径中安全使用的字符组成。
  • Column Qualifier:列族中的数据通过其列限定符(或简称为列)进行寻址。 不必提前指定列限定符。行之间的列限定符不必保持一致。 与行键一样,列限定符也没有数据类型,并且始终被视为byte []。
  • Cell:行键,列族和列限定符的组合唯一标识一个单元格。 存储在单元格中的数据称为该单元格的值。 值也没有数据类型,并且始终被视为byte []。
  • 时间戳记:单元内的值已版本化。 版本由版本号标识,默认情况下,版本号是写入单元格的时间戳。 如果在写入过程中未指定时间戳,则使用Timestamp。 如果未为读取指定时间戳,则返回最新的时间戳。 为每个列族配置了HBase保留的单元格值版本数。默认的单元格版本数为三个。

HBase用于数据处理的API包含三种主要方法:Put,Get和Scan。 Get和Put作用于特定行,并且需要提供行键。 Scan是在一定范围的行上完成的。 该范围可以由开始和停止行键定义,如果未定义开始和停止行键意思就是是整个表。有时,将数据模型理解为多维Map会更容易。 图1中表的第一行已在图2中表示为多维映射。

行键映射到列族的列表,列族映射到列限定符的列表,列限定符映射到时间戳的列表,每个时间戳都映射到一个值,即单元格本身。

  • 如果要检索行键映射到的项目,则将从所有列中获取数据。如果要检索特定列族映射到的项目,则将获得所有列限定符和关联的映射
  • 如果要检索特定列限定符映射到的项目,则将获得所有时间戳和关联的值。
    HBase进行了优化,默认情况下仅返回最新版本。也可以在查询中请求多个版本。行键等效于关系数据库表中的主键。设置表后,无法选择更改HBase表中的哪一列将作为行键。换句话说,换句话说,将数据放入表后,无法选择“Person”列族中的“Name”列作为行键(一对多)。

如前所述,有多种描述此数据模型的方法。

  • 可以将其视为键值存储(如图3所示),其中键是行键,值是列中其余数据。 鉴于行键是寻址行的唯一方法,这似乎很合适。
  • 可以将HBase视为键值存储,其中键定义为行键,列族,列限定符,时间戳记,并且值是存储在单元格中的实际数据。
    深入了解底层存储的细节时可以知道,如果想从给定的行中读取特定的单元格,则最终将读取包含该单元格以及其他可能的单元格的数据。 此表示形式也是HBase API和内部结构中KeyValue对象的表示方式。 键由[行键,列族,列限定符,时间戳记]组成,值是单元格的内容。

HBase表设计基础

HBase数据模型与关系数据库系统完全不同。 因此,设计HBase表涉及的方法与关系系统中的方法不同。 可以将设计HBase表定义为在用例上下文中回答以下问题:

  1. 行键结构应该是什么,应该包含什么?
  2. 表应具有多少列族?
  3. 哪些数据进入哪个列族?
  4. 每个列族中有多少列?
  5. 列名应该是什么? 尽管列名不必是在创建表时定义,您在写或读数据时需要了解它们。
  6. 什么信息应该进入Cell?
  7. 每个单元应存储多少个版本?

在HBase表中定义的最重要的事情是行键结构。 为了有效地定义访问权限,重要的是预先定义访问模式(读取和写入)。 要定义架构,必须考虑有关HBase表的几个属性:

  1. 索引仅基于RowKey。
  2. 表按行键存储。 表中的每个Region负责部分行键空间,并由开始和结束行键标识。
  3. HBase表中的所有内容都存储为byte []类型。
  4. 仅在行级别保证原子性。 行之间没有原子性保证,这意味着不存在多行事务。
  5. 必须在表创建时预先定义列族。
  6. 列限定符是动态的,可以删除

尝试在HBase表中对Twitter关系(用户紧随其他用户之后)进行建模。后续关系本质上是图类型,并且有专门的图形数据库可以更有效地使用此类数据集。 但是,这个特殊的用例为在HBase表中建模提供了一个很好的例子。开始对表进行建模的第一步是定义访问模式。 在诸如Twitter之类的应用程序的关注者跟踪关系的上下文中,访问模式可以定义如下:

读取访问模式:

  1. 用户关注谁?
  2. 特定用户A是否跟随用户B?
  3. 谁关注特定用户A?

写访问模式:

  1. 用户关注一个新用户。
  2. 用户取消关注他们关注的人

考虑一些表格设计选项,并探讨其优缺点。 从图4所示的表设计开始。此表在一行中存储特定用户正在跟随的用户列表,其中行键是关注者用户的用户ID,每列包含该用户的用户ID。 被关注。 如图5所示为带有数据的该设计表。

该表设计适用于概述的第一个读取模式。 它也解决了第二个问题,但是如果要关注的用户列表很大并且可能需要遍历整个列表来回答该问题,则可能会很麻烦。 在此设计中,添加用户有些棘手。 由于没有保留计数器,因此在添加用户之前先将整行读完,否则将无法找到下一个用户应使用的编号。 一个可能的解决方案是只保留一个计数器,此时该表将如图6所示。


图7为新增加一个用户,直接读取计数器,然后给新用户赋值为用户5.图6中的设计比以前的设计逐步改进,但并不能解决所有问题。 取消关注用户仍然很棘手,必须读取整行以找出需要删除的列。 这对于计数也是不理想的,因为不遵循将导致漏洞。 最大的问题是,要添加用户,必须在客户端代码中实现某种事务逻辑,因为HBase不会为进行跨行或RPC调用的事务。 此方案中添加用户的步骤如图7所示。
并且,之前提到的属性之一是列限定符是动态的,并且像单元格一样存储为byte []。 这样一来,便可以将任意数据放入其中,这在本设计中可能会为带来帮助。 考虑一下图8中的表。在此设计中,不需要计数,因此添加用户的复杂性降低了。 取消跟踪也得到了简化。 在这种情况下,单元格仅包含一些任意的小值,没有任何影响。

最新的设计解决了我们定义的几乎所有访问模式。 在读取模式列表上,剩下的是#3:谁跟随特定用户A? 在当前设计中,由于仅对行键进行索引,因此需要进行全表扫描以回答此问题。 关注的用户应该以某种方式输入索引。 有两种方法可以解决此问题。 首先是仅维护另一个包含反向列表的表(用户和所有跟随用户的列表)。 第二种是使用不同的行键将信息保留在同一表中(请记住,它是所有字节数组,并且HBase不在乎在其中放置什么内容)。在两种情况下,都需要分别具体化该信息,以便无需进行大量扫描即可快速访问它。当前表结构中还有进一步的优化可能。 考虑图9中所示的表。

在此设计中,需要注意两点:行键现在包含关注者和关注用户;并且列族名称已缩短为f。简短的列族名称,减少需要从HBase读取/写入的数据来减少I / O负载(磁盘和网络),因为族名是返回给客户端的每个KeyValue [4]对象的一部分。。现在,获取关注的用户列表将变成简短的扫描,而不是获取操作。由于将Gets内部实现为长度为1的扫描,因此对性能几乎没有影响。

取消关注并回答问题“ A是否跟随B?”分别变成简单的删除和获取操作,并且不需要遍历早期表设计中该行的整个用户列表。这是回答该问题的便宜得多的方法,尤其是在关注的用户列表很大的情况下。带有基于此设计的示例数据的表将如图10所示。

注意,行键的长度在整个表中是可变的。 由于每次对表的调用要传输的数据都是可变的,因此这种变化可能很难推理性能。 解决此问题的方法是在行键中使用哈希值。 为了在当前表中获得一致的行键长度,可以散列各个用户ID并将其串联,而不是将用户ID本身串联起来。 由于始终知道要查询的用户,因此可以重新计算哈希值,并使用结果摘要值查询表。 具有哈希值的表将类似于图11。

此表设计可有效回答我们前面概述的所有访问模式。

HBase Schema设计简介相关推荐

  1. Hbase Schema设计与数据模型操作

    一.Hbase Schema设计 1,Schema 创建 使用 Apache HBase Shell 或使用 Java API 中的 Admin 来创建或更新 HBase 模式. Configurat ...

  2. 数据库之Schema设计

    为什么80%的码农都做不了架构师?>>> 在数据库 Schema 设计理论方面,一直有一个被大家奉为"葵花宝典"的规范化范式理论.通过范式 理论所设计的数据库 S ...

  3. BigData之Hbase:Hbase数据管理的简介、下载、案例应用之详细攻略

    BigData之Hbase:Hbase数据管理的简介.下载.案例应用之详细攻略 目录 Hbase数据管理的简介--基于Hadoop的非结构化.基于列的数据存储的数据库 1.HBase的架构体现及与HD ...

  4. mysql schema设计_mongodb 的 schema 设计方法

    mongodb 的schema设计方法 前言 mongodb是NoSQL的代表,从使用关系型数据库(MySQL)到使用非关系型数据库(mongodb),其中的一些以前的设计的思维惯性总是在不知不觉的影 ...

  5. 案例篇-HBase RowKey 设计指南

    1.为什么 Rowkey 这么重要 1.1 RowKey 到底是什么 我们常说看一张 HBase 表设计的好不好,就看它的 RowKey 设计的好不好.可见 RowKey 在 HBase 中的地位.那 ...

  6. PHP实现微信随机红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

  7. BizTalk开发系列(十二) Schema设计之Group与Order

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk ...

  8. 插件式架构设计实践:插件式系统架构设计简介

    本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软S ...

  9. hbase动态更改行键设计_谈笑间学会Hbase Rowkey设计

    谈笑间学会-Hbase Rowkey设计 1.为什么Rowkey这么重要 1.1.Rowkey是什么 类似于MySQL.Oracle中的主键,用于标示唯一的行 完全是由用户指定的一串不重复的字符串: ...

最新文章

  1. 量子计算何时具有真正的商业价值?
  2. 算法 - pyhton - 二分查找
  3. css阻止input select默认事件
  4. Missing the OpenSSL lib
  5. Sublime Text 3 import Anaconda 无法正常补全模块名解决办法
  6. 数据产品-指标体系和埋点设计
  7. 计算机知识技能大赛主持稿,计算机知识技能大赛.doc
  8. Windows下Appium环境搭建小结
  9. 使用Helix QAC对OpenHarmony代码做静态分析
  10. nginx转发https网页加载http图片乱码问题
  11. Android面部动态识别(眼睛+嘴巴+鼻子轮廓标记)
  12. 世界上有10种人,一种是懂二进制的人,一种是不懂二进制的人。
  13. wp下载吧主题模板_内含newzhan2.60无授权版本
  14. gridview ItemTemplate下绑定数据
  15. 一、Excel简介、Excel的基本概念及操作、简单小工具
  16. 4g网络设置dns地址_4G网速越来越慢?别再去过多的责怪运营商,不妨试试这几个方法...
  17. echarts自定义柱状图柱体形状
  18. SpringData JPA 日常使用
  19. [ArcGIS] 空间分析(九)3D视线分析(构造视线、通视性) ArcScene简单使用
  20. 易搜题,你与学霸之间的距离只差了一个iSearch

热门文章

  1. OpenIM:如何打造安全可靠的即时通讯服务
  2. 静态内部类实现单例模式及其线程安全相关原理
  3. [COGS2653]源符「厌川的翡翠」-网络流
  4. python 画素描画
  5. 等保测评之安全运维管理
  6. 美团——小美的用户名
  7. Qt处理路径里的斜杠和反斜杠
  8. DiskLruCache硬盘缓存
  9. 练习SpringBoot烘培坊项目
  10. 概率密度变换公式 雅可比矩阵_雅克比行列式在连续型随机变量函数分布密度中的应用...