HBase数据库模型操作-简介

1、表的一些操作

1.1、创建一个表:create命令

  1. 1、使用create命令创建一个新表。您必须指定表名称和ColumnFamily名称。
  2. 2、示例:
  3. -- create 'test', 'cf'

1.2、列出有关表的信息:list命令

  1. 1、使用list命令确认您的表存在
  2. 2、示例
  3. list 'test'

1.3、查看表的详细信息:describe命令

  1. 1、使用describe命令查看详细信息,包括配置默认值
  2. 2、示例
  3. describe 'test'
  4. 3

1.4、插入数据:put命令|batch命令

  1. 1、使用put命令,保存数据到表
  2. 2、示例
  3. put 'testspace:testtable1','20210506_10001','f1:name','zhangsan'
  4. -- '20210506_10001' 代表rowkey
  5. -- 'f1:name' : 代表列族前缀+列限定符后缀
  6. -- 'zhangsan' :代表具体插入的值
  7. 3API文档:
  8. https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Table.html#put-org.apache.hadoop.hbase.client.Put-
  9. https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Table.html#batch-java.util.List-java.lang.Object:A-

1.5、一次扫描表中所有数据:scan命令

  1. 1、使用scan命令扫描表中的数据。您可以限制扫描
  2. 2、示例
  3. scan 'test'
  4. 3API文档
  5. https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Scan.html

1.6、获取单行数据:get命令

  1. 1、要一次获取一行数据,请使用get命令。
  2. 2、示例
  3. get 'test','row1'
  4. 3API文档
  5. https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Table.html#get-org.apache.hadoop.hbase.client.Get-

1.7、禁用|启用表格:disable命令|enable命令

  1. 1、使用disable命令禁用该表。您可以使用enable命令重新启用它。
  2. 2、示例
  3. disable 'test'
  4. enable 'test'

1.8、删除表格:drop命令

  1. 1、使用drop命令,要删除表
  2. 2、示例
  3. drop 'test'

1.9、删除表数据:delete命令

  1. 1API文档
  2. https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Table.html#delete-org.apache.hadoop.hbase.client.Delete-
  3. 2、注意:
  4. 2-1HBase不会就地修改数据,因此删除操作通过创建称为【墓碑】的新标记来处理。这些墓碑以及固定价格将在大压实时清理干净。
  5. 2-2delete: 最小粒度是单元格(Cell),而且不能跨列族操作,如果需要删除表中所有列族在某一行的数据(删除表中一个逻辑行),则需要使用 deleteall 命令

2、命名空间操作{命名空间是表的逻辑分组}

2.1、命名空间管理{在表创建期间}

  1. 1、创建命名空间
  2. 1-1、示例
  3. #Create a namespace
  4. create_namespace 'my_ns'
  5. 2、删除命名空间
  6. 2-1、示例
  7. #drop namespace
  8. drop_namespace 'my_ns'
  9. 3、修改命名空间
  10. 3-1、示例
  11. #alter namespace
  12. alter_namespace 'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}

2.2、预定义的名称空间

  1. 1、有两个预定义的特殊名称空间:
  2. 1-1hbase-系统名称空间,用于包含HBase内部表。
  3. 1-2、默认-没有显式指定名称空间的表将自动落入该名称空间。
  4. 2、示例
  5. #namespace=foo and table qualifier=bar
  6. create 'foo:bar', 'fam'
  7. #namespace=default and table qualifier=bar
  8. create 'bar', 'fam'

3、表[Table]

  1. 1、表在架构定义时预先声明

4、行[Row]|行键[RowKey]

  1. 1row key - 概述
  2. 1-1、可以决定一行数据。
  3. 1-2、行键是未解释的字节。按字典顺序对行进行排序,最低顺序在表中排在最前面。空字节数组用于表示表名称空间的开始和结束。
  4. 1-3、只能存储64k的字节数据
  5. 2row key - 特点
  6. 2-1RowKey类似于主键,可以唯一的标识一行记录
  7. 2-2、由于数据按照RowKey的字典序(byte order)排序存储,因此HBase中的数据永远都是有序的。
  8. 2-3RowKey可以由用户自己指定,只要保证这个字符串不重复就可以了。
  9. 3row key - 使用
  10. 3-1get:通过指定单个RowKey来获取对应的唯一一条记录;
  11. 3-2like:通过RowKeyrange来进行匹配;
  12. 3-3scan:通过设置startRowstopRow参数来进行范围匹配(注意:如果不设置就是全表扫描)。
  13. 4row key - 作用简介
  14. 4-1Hbase在读写数据时需要通过RowKey找到对应的Region,从而避免{热点现象}
  15. 4-1-1、热点现象-概述
  16. -- 当大量请求访问HBase集群的一个或少数几个节点,造成少数RegionServer的读写请求过多,负载过大,而其他RegionServer负载却很小,这样就造成热点现象。
  17. 4-1-2、热点现象-处理:通过RowKey的优化,避免热点现象
  18. -- 反转(Reversing): 把固定长度或者数字格式的 rowkey进行反转,反转分为一般数据反转和时间戳反转,其中以时间戳反转较常见。
  19. -- 加盐(Salting):在原RowKey的前面添加固定长度的随机数,也就是给RowKey分配一个随机前缀使它和之前的RowKey的开头不同。
  20. -- 哈希(Hashing):基于RowKey的完整或部分数据进行Hash,而后将哈希后的值完整替换或部分替换原RowKey的前缀部分。这里说的hash常用的有MD5sha1sha256 sha512 等算法。
  21. 4-2MemStoreHFile中的数据都是按照 RowKey 的字典序排序。
  22. 5row key - 设计原则
  23. 5-1、长度原则、
  24. 5-2、唯一原则、
  25. 5-3、排序原则、
  26. 5-4、散列原则、

4.1、行键[RowKey]详细简介

https://blog.csdn.net/weixin_36140358/article/details/112096313

5、列簇[Column Family]

  1. 1HBase中的列分为多个列族。列族的所有列成员都具有相同的前缀。
  2. 1-1、比如:'课程:历史''课程:数学',列都是'课程',使用冒号(:)分隔列簇和列簇限定符,
  3. 1-2、列族前缀必须由可打印字符(printable characters)组成。限定尾部(列族限定符)可以由任意字节组成。
  4. 1-3、列族必须在架构定义时预先声明,而不必在架构时定义列,
  5. 2HBase把同一列族中的数据存储在同一目录下,由几个文件保存

6、单元格[Cells]

  1. 1、一个{行、列、版本}指定一个cellHBase中是唯一的
  2. 2cell中的数据是没有类型的,全部是字节数组形式存储。

7、Timestamp时间戳

  1. 1HBase每个cell存储单元对同一份数据有多个版本,根据唯一时间戳来区分每个版本直接的差异,不同版本的数据按照时间倒序排序,最新的数据排在最前面。
  2. 2、时间戳类型是64位整型。
  3. 3、时间戳可由HBase在数据写入时自动赋值(当前系统时间,单位ms),也可由客户显示赋值,但要注意唯一性。

8、Table中ColumnFamily和ColumnQualifier的关系与区别

  1. 1Table可以直接理解为表,而FamilyQualifier其实都可以理解为列,一个Family下面可以有多个Qualifier
  2. 2、可以简单的理解为,HBase中的列是二级列,也就是说Family是第一级列,Qualifier是第二级列。两个是父子关系。
  3. 3、从性能的角度应该如何设置familyqualifier呢?{数据的读写效率上考虑}
  4. 3-1、最极端的,可以每一列都设置成一个family,也可以只有一个family,但所有列都是其中的一个qualifier
  5. 3-2、如果只有一个family,那么每一次读都会读取当前rowkey的所有数据,网络和io上会有一些损失。
  6. 3-3、不同的family是在同一个region下面。而每一个family都会分配一个memstore,所以更多的family会消耗更多的内存。

9、官方文档:

  1. http://hbase.apache.org/book.html#quickstart