HBase数据库模型操作-简介
1、表的一些操作
1.1、创建一个表:create命令
1、使用create命令创建一个新表。您必须指定表名称和ColumnFamily名称。
2、示例:
-- create 'test', 'cf'
1.2、列出有关表的信息:list命令
1、使用list命令确认您的表存在
2、示例
list 'test'
1.3、查看表的详细信息:describe命令
1、使用describe命令查看详细信息,包括配置默认值
2、示例
describe 'test'
3、
1.4、插入数据:put命令|batch命令
1、使用put命令,保存数据到表
2、示例
put 'testspace:testtable1','20210506_10001','f1:name','zhangsan'
-- '20210506_10001' : 代表rowkey
-- 'f1:name' : 代表列族前缀+列限定符后缀
-- 'zhangsan' :代表具体插入的值
3、API文档:
https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Table.html#put-org.apache.hadoop.hbase.client.Put-
https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Table.html#batch-java.util.List-java.lang.Object:A-
1.5、一次扫描表中所有数据:scan命令
1、使用scan命令扫描表中的数据。您可以限制扫描
2、示例
scan 'test'
3、API文档
https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Scan.html
1.6、获取单行数据:get命令
1、要一次获取一行数据,请使用get命令。
2、示例
get 'test','row1'
3、API文档
https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Table.html#get-org.apache.hadoop.hbase.client.Get-
1.7、禁用|启用表格:disable命令|enable命令
1、使用disable命令禁用该表。您可以使用enable命令重新启用它。
2、示例
disable 'test'
enable 'test'
1.8、删除表格:drop命令
1、使用drop命令,要删除表
2、示例
drop 'test'
1.9、删除表数据:delete命令
1、API文档
https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Table.html#delete-org.apache.hadoop.hbase.client.Delete-
2、注意:
2-1、HBase不会就地修改数据,因此删除操作通过创建称为【墓碑】的新标记来处理。这些墓碑以及固定价格将在大压实时清理干净。
2-2、delete: 最小粒度是单元格(Cell),而且不能跨列族操作,如果需要删除表中所有列族在某一行的数据(删除表中一个逻辑行),则需要使用 deleteall 命令
2、命名空间操作{命名空间是表的逻辑分组}
2.1、命名空间管理{在表创建期间}
1、创建命名空间
1-1、示例
#Create a namespace
create_namespace 'my_ns'
2、删除命名空间
2-1、示例
#drop namespace
drop_namespace 'my_ns'
3、修改命名空间
3-1、示例
#alter namespace
alter_namespace 'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
2.2、预定义的名称空间
1、有两个预定义的特殊名称空间:
1-1、hbase-系统名称空间,用于包含HBase内部表。
1-2、默认-没有显式指定名称空间的表将自动落入该名称空间。
2、示例
#namespace=foo and table qualifier=bar
create 'foo:bar', 'fam'
#namespace=default and table qualifier=bar
create 'bar', 'fam'
3、表[Table]
1、表在架构定义时预先声明
4、行[Row]|行键[RowKey]
1、row key - 概述
1-1、可以决定一行数据。
1-2、行键是未解释的字节。按字典顺序对行进行排序,最低顺序在表中排在最前面。空字节数组用于表示表名称空间的开始和结束。
1-3、只能存储64k的字节数据
2、row key - 特点
2-1、RowKey类似于主键,可以唯一的标识一行记录
2-2、由于数据按照RowKey的字典序(byte order)排序存储,因此HBase中的数据永远都是有序的。
2-3、RowKey可以由用户自己指定,只要保证这个字符串不重复就可以了。
3、row key - 使用
3-1、get:通过指定单个RowKey来获取对应的唯一一条记录;
3-2、like:通过RowKey的range来进行匹配;
3-3、scan:通过设置startRow和stopRow参数来进行范围匹配(注意:如果不设置就是全表扫描)。
4、row key - 作用简介
4-1、Hbase在读写数据时需要通过RowKey找到对应的Region,从而避免{热点现象}
4-1-1、热点现象-概述
-- 当大量请求访问HBase集群的一个或少数几个节点,造成少数RegionServer的读写请求过多,负载过大,而其他RegionServer负载却很小,这样就造成热点现象。
4-1-2、热点现象-处理:通过RowKey的优化,避免热点现象
-- 反转(Reversing): 把固定长度或者数字格式的 rowkey进行反转,反转分为一般数据反转和时间戳反转,其中以时间戳反转较常见。
-- 加盐(Salting):在原RowKey的前面添加固定长度的随机数,也就是给RowKey分配一个随机前缀使它和之前的RowKey的开头不同。
-- 哈希(Hashing):基于RowKey的完整或部分数据进行Hash,而后将哈希后的值完整替换或部分替换原RowKey的前缀部分。这里说的hash常用的有MD5、sha1、sha256 或 sha512 等算法。
4-2、MemStore和HFile中的数据都是按照 RowKey 的字典序排序。
5、row key - 设计原则
5-1、长度原则、
5-2、唯一原则、
5-3、排序原则、
5-4、散列原则、
4.1、行键[RowKey]详细简介
https://blog.csdn.net/weixin_36140358/article/details/112096313
5、列簇[Column Family]
1、HBase中的列分为多个列族。列族的所有列成员都具有相同的前缀。
1-1、比如:'课程:历史'、'课程:数学',列都是'课程',使用冒号(:)分隔列簇和列簇限定符,
1-2、列族前缀必须由可打印字符(printable characters)组成。限定尾部(列族限定符)可以由任意字节组成。
1-3、列族必须在架构定义时预先声明,而不必在架构时定义列,
2、HBase把同一列族中的数据存储在同一目录下,由几个文件保存
6、单元格[Cells]
1、一个{行、列、版本}指定一个cell在HBase中是唯一的
2、cell中的数据是没有类型的,全部是字节数组形式存储。
7、Timestamp时间戳
1、HBase每个cell存储单元对同一份数据有多个版本,根据唯一时间戳来区分每个版本直接的差异,不同版本的数据按照时间倒序排序,最新的数据排在最前面。
2、时间戳类型是64位整型。
3、时间戳可由HBase在数据写入时自动赋值(当前系统时间,单位ms),也可由客户显示赋值,但要注意唯一性。
8、Table中ColumnFamily和ColumnQualifier的关系与区别
1、Table可以直接理解为表,而Family和Qualifier其实都可以理解为列,一个Family下面可以有多个Qualifier。
2、可以简单的理解为,HBase中的列是二级列,也就是说Family是第一级列,Qualifier是第二级列。两个是父子关系。
3、从性能的角度应该如何设置family和qualifier呢?{数据的读写效率上考虑}
3-1、最极端的,可以每一列都设置成一个family,也可以只有一个family,但所有列都是其中的一个qualifier
3-2、如果只有一个family,那么每一次读都会读取当前rowkey的所有数据,网络和io上会有一些损失。
3-3、不同的family是在同一个region下面。而每一个family都会分配一个memstore,所以更多的family会消耗更多的内存。
9、官方文档:
http://hbase.apache.org/book.html#quickstart