非关系型数据库——HBase

Posted 小企鹅推雪球!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非关系型数据库——HBase相关的知识,希望对你有一定的参考价值。

文章目录

HBase 简介

  1. HBase是一个分布式海量列式非关系型数据库系统,可以提供超大规模数据集的实时随机读写。
  2. HBase适合海量明细数据的存储,并且后期需要有很好的查询性能(单表超千万、上亿,且并发要求高)

HBase的特点

  1. 海量存储: 底层基于HDFS存储海量数据
  2. 列式存储:HBase表的数据是基于列族进行存储的,一个列族包含若干列
  3. 极易扩展:底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加DataNode服务节点就可以
  4. 高并发:支持高并发的读写请求
  5. 稀疏:稀疏主要是针对HBase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的
  6. 数据的多版本:HBase表中的数据可以有多个版本值,默认情况下是根据版本号去区分,版本号就是插入数据的时间戳
  7. 数据类型单一:所有的数据在HBase中是以字节数组进行存储

Hbase 概念视图

  1. 表 webtable,其中包含两行(com.cnn.www 和 com.example.www)以及名为 contents、anchor 和 people 的三个列族
  2. 对于第一行(com.cnn.www), anchor 包含两列(anchor:cssnsi.com,anchor:my.look.ca),并且 contents 包含一列(contents:html
  3. webtable包含具有行键 com.cnn.www 的行的5个版本,以及具有行键 com.example.www 的行的一个版本
  4. contents:html 列限定符包含给定网站的整个 HTML。锚(anchor)列族的限定符每个包含与该行所表示的站点链接的外部站点以及它在其链接的锚点(anchor)中使用的文本.
  5. people 列族代表与该网站相关的人员。
  6. 列名称:按照约定,列名由其列族前缀和限定符组成。例如,列内容: html 由列族contents和html限定符组成。冒号字符(:)从列族限定符分隔列族。
  7. webtable 中显示为空的单元格在 HBase 中不占用空间或实际上存在。这正是使 HBase “稀疏”的原因.
  8. 表格视图并不是查看 HBase 数据的唯一可能的方法。
  9. HBase 概念视图中显示的空单元根本不存储。因此,对时间戳为 t8 的 contents:html 列值的请求将不返回任何值。
  10. 在时间戳为 t9 中一个anchor:my.look.ca 值的请求也不会返回任何值
  11. 如果未提供时间戳,则会返回特定列的最新值。给定多个版本,最近的也是第一个找到的,因为时间戳按降序存储。因此,如果没有指定时间戳,则对行 com.cnn.www 中所有列的值的请求将是: 时间戳 t6 中的 contents:html,时间戳 t9 中 anchor:cnnsi.com 的值,时间戳 t8 中 anchor:my.look.ca 的值。

Hbase 物理视图

  1. 在 HBase 概念视图中,表格被视为一组稀疏的行的集合,但它们是按列族进行物理存储的。可以随时将新的列限定符(column_family:column_qualifier)添加到现有的列族。
  2. ColumnFamily anchor 表:
  3. ColumnFamily contents 表:

HBase命名空间

  1. HBase命名空间 namespace 是与关系数据库系统中的数据库类似的表的逻辑分组。这种抽象为即将出现的多租户相关功能奠定了基础:

    1. 配额管理(Quota Management)(HBASE-8410) - 限制命名空间可占用的资源量(即区域,表)。
    2. 命名空间安全管理(Namespace Security Administration)(HBASE-9206) - 为租户提供另一级别的安全管理。
    3. 区域服务器组(Region server groups)(HBASE-6721) - 命名空间/表可以固定在 RegionServers 的子集上,从而保证粗略的隔离级别。
  2. 创建、删除或更改命名空间。通过指定表单的完全限定表名,在创建表时确定命名空间成员权限

    #Create a namespace
    create_namespace 'my_ns'
    
    #create my_table in my_ns namespace
    create 'my_ns:my_table', 'fam'
    
    #drop namespace
    drop_namespace 'my_ns'
    
    #alter namespace
    alter_namespace 'my_ns', METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'
    
  3. 在 HBase 中有两个预定义的特殊命名空间:

    1. hbase:系统命名空间,用于包含 HBase 内部表
    2. default:没有显式指定命名空间的表将自动落入此命名空间
    #namespace=foo and table qualifier=bar
    create 'foo:bar', 'fam'
    
    #namespace=default and table qualifier=bar
    create 'bar', 'fam'
    

HBase表、行与列族

  1. HBase 中表是在 schema 定义时被预先声明的。在 HBase shell 中创建表的语法必须指定表名和列族名:

    create ‘<table name>,<column family>
  2. HBase中的行是逻辑上的行,物理上模型上行是按列族(colomn family)分别存取的。行键是未解释的字节,行是按字母顺序排序的,最低顺序首先出现在表中。空字节数组用于表示表命名空间的开始和结束。

  3. HBase 中的列分为列族和列的限定符。列的限定符是列族中数据的索引。例如给定了一个列族 content,那么限定符可能是 content:html,也可以是 content:pdf。列族在创建表格时是确定的了,但是列的限定符是动态地并且行与行之间的差别也可能是非常大的。

  4. Hbase表中的每个列都归属于某个列族,列族必须作为标模式(schema)定义的一部分预先给出。如 create’test’,'‘course’。

  5. 列名以列族做为前缀,每个“列族”都可以有多个成员(colunm):如 course:math,course:english,新的列族成员(列)可以随后按需、动态加入权限控制、存储以及调优都是在列族层面进行的。

HBase数据模型操作

  1. 在 HBase 中有四个主要的数据模型操作,分别是:Get、Put、Scan 和 Delete。
  2. Get(读取):Get 指定行的返回属性。读取通过 Table.get 执行.
    1. 语法:get ’<table name>’,’row1’
    2. 扫描 emp 表的第一行
    hbase(main):012:0> get 'emp', '1'
    
    1. 读取指定列语法:get 'table name', ‘rowid’, COLUMN => ‘column family:column name ’
    2. 读取 HBase 表中的特定列
    hbase(main):015:0> get 'emp', 'row1', COLUMN=>'personal:name'
    
  3. Put(写):Put 可以将新行添加到表中(如果该项是新的)或者可以更新现有行(如果该项已经存在).Put 操作通过 Table.put(non-writeBuffer)或 Table.batch(non-writeBuffer)执行。
    1. put 语法:put ‘table name’,’row ’,'Column family:column name',’new value’。新给定的值将替换现有的值,并更新该行。
    2. 将员工名为“raju”的城市值更新为“Delhi”
     put 'emp','row1','personal:city','Delhi'
    
  4. Scan(扫描):Scan 允许在多个行上对指定属性进行迭代。
    1. Scan语法:scan ‘<table name>’
  5. Delete(删除):Delete 操作用于从表中删除一行。Delete 通过 Table.delete 执行。
    1. Delete 命令的语法:delete ‘<table name>’, ‘<row>’, ‘<column name >’, ‘<time stamp>’
    2. 删除特定单元格:
    delete 'emp', '1', 'personal data:city',
    
    1. deleteall 命令删除表的所有单元格:deleteall ‘<table name>’, ‘<row>’,
    2. 使用“deleteall”命令删除 emp 表 row1 的所有单元
     deleteall 'emp','1'
    

HBase排序顺序、列元数据以及联合查询

HBase排序顺序:

  1. 所有数据模型操作 HBase 以排序顺序返回数据。首先按行,然后按列族(ColumnFamily),然后是列限定符,最后是时间戳(反向排序,因此首先返回最新的记录)。

HBase列元数据

  1. ColumnFamily 的内部 KeyValue 实例之外不存储列元数据。所以 HBase 不仅可以支持每行大量的列数,而且还能对行之间的一组异构列进行维护。
  2. 获得 ColumnFamily 存在的一组完整列的唯一方法是处理所有行。

HBase联合查询

  1. HBase 中读取的数据模型操作是 Get 和 Scan,同时HBase不支持联合

ACID

  1. ACID,指数据库事务正确执行的四个基本要素的缩写,即:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。
  2. HBase 支持特定场景下的 ACID,即对同一行的 Put 操作保证完全的 ACID.

以上是关于非关系型数据库——HBase的主要内容,如果未能解决你的问题,请参考以下文章

HBase原理 | 一文读懂HBase多租户

非关系型数据库——HBase扩展

HBase 的表结构

Zookeer-- 上搭建 hbase

开源的非关系型分布式数据库--HBase

HBase简单介绍