HBase数据模型(1)

本文介绍了HBase的数据模型,包括其特性和逻辑模型。详细解释了表、行、列族等概念,并阐述了HBase如何通过列族组织数据,以及单元格如何存储不同版本的数据。此外还介绍了HBase的基本操作,如Get、Put、Scan和Delete。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HBase数据模型(1)
HBase数据模型(2)

1.0 HBase的特性

  • Table
    • HBase以表(Table)的方式组织数据,数据存储在表中。
  • Row/Column
    • 行(Row)和列(Column)共同组成HBase的表。
  • Column Family
    • 列族(Column)将一列或者多列组织在一起,HBase的列必须属于某一个列族。
  • Cell
    • 行和列的交叉点称为单元格(Cell),单元格是版本化的。
    • 单元格的内容是列的值,是不可分割的字节数组,以二进制形式存储。
  • Rowkey
    • 行键(Rowkey)可以将HBase表进行分区,行键也是唯一确定一行的标识。

2.0 HBase逻辑模型

2.1 HBase大部分特性和GoogleBigTable开源分布式数据库相同。

2.2 逻辑模型上是一个稀疏的、长期存储的、多维度的和排序的映射表,表中的每一行可以有不同的列。

2.3 HBase最基本的单位是列,一列或者多列构成了行,行有行键(RowKey),每一行的行键都是唯一的,相同行键的插入操作被认为是同一行操作。

2.4 HBase中一个表有多行,每行都有多列,列中的值有多个版本,每个版本称为一个单元格。每个单元存储的是不同时刻该列的值。

2.5 列名表示为 “列族前缀+修饰符”的方式,如(anchor:cssnsi.com和anchor:my.look.ca其中,列族是anchor,修饰符分别是cssnsi.com和my.look.ca )

3.0 HBase物理模型

3.1 在物理上,表是按列分开存储的。HBase的列是按列族分组的,HFile是面向列的,存放行的不同物理文件,一个列族的数据存放在多个HFile中,最重要的是一个列族的数据会被用一个Region管理,物理上存放在一起。

3.2 Region是管理HFile的一种机制。

4.0 HBase数据模型的操作

主营包含4个操作Get、Put、Scan和Delete。因为创建HTable实例需要扫描.META.表,会增加代价,所以用户最好只创建一次HTable是咧,而且每个线程创建一个,可以使用HTablePool类来复用多个HTable实例。

4.1 读Get

  • 从客户端获取已存取的数据
  • get()方法默认一次取回改行全部列的数据,可以限定只取某个列族对于的列的数据。
  • 可以从服务器获取特定的返回值。

4.2 写Put

  • HBase没有Update操作,通过Put对数据进行修改
  • Put向表增加新行(新的key)或者更新行(key已经存在)。
  • 对于数千次RPC操作可以显示打开缓冲区选项,进行一次性写入。

4.3 扫描Scan

Scan允许多行特定属性迭代,可以指定starRow参数来定义扫描读取HBase表的起始行键,同时可选stopRow参数来限定到何处停止。

4.4 删除Delete

HBase的Delete操作可以指定删除某个列族或者某个列,或者指定某个时间戳,删除比这个时间早的数据。

HBase的Delete操作并不是真正地从磁盘上删除数据,而是通过创建墓碑(tombstones)标志进行处理。这些墓碑标记的值和小于该时间版本的单元格在大合并(major compact)时被清楚。
HBase数据模型(1)
HBase数据模型(2)

### HBase 数据模型详解 HBase数据模型是一种稀疏、分布式的多维映射表,其核心概念包括表(Table)、行(Row)、列族(Column Family)以及单元格(Cell)。以下是关于 HBase 数据模型的具体结构和设计: #### 表(Table) HBase 中的数据是以表的形式组织的。类似于传统的关系型数据库,但是它的设计更加灵活。每个表由行和列组成,并且可以动态扩展。 #### 行(Row) 每一行都有一个唯一的标识符——`RowKey`[^3]。所有的数据都是按 `RowKey` 的字典顺序存储的,这意味着可以通过指定范围来高效地扫描一组连续的行。由于数据是按照这种顺序排列的,因此 `RowKey` 的设计对于性能至关重要。 #### 列族(Column Family) 与传统的二维表格不同,在 HBase 中引入了一个新的概念叫作 **列族**。每一个列都需要归属于某个特定的列族[^1]。列族是在创建表的时候定义好的,并且一旦设定就很难修改。同一个列族内的所有列共享相同的存储属性配置,比如压缩方式、TTL(Time To Live)等参数。 #### 单元格(Cell) 在一个具体的行列交叉点上的值被称为 Cell 或者 KeyValue 对象。值得注意的是,除了基本的内容之外,每个 cell 都会附加时间戳信息用于版本控制。默认情况下保留最新三个版本;如果需要的话也可以调整这个数值甚至关闭版本管理功能。 #### 时间戳(Timestamp) 为了实现多版本支持,每写入操作都会自动记录当前的时间作为该条记录的时间戳[^2]。这样即使同一位置多更新也不会覆盖旧有数据而是新增加一条带有新 timestamp 的 entry。 ```java Put put = new Put(Bytes.toBytes("row1")); put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("col1"), System.currentTimeMillis(), Bytes.toBytes("value1")); table.put(put); ``` 以上代码展示了如何向名为 "cf" 的 column family 下面增加一条 key-value pair:"col1"=>"value1". --- ### 物理存储布局 从物理层面来看,Hbase 将逻辑上的 table 分割成若干 region,这些 regions 被均匀分布在集群节点上以达到负载均衡的目的;而每个region内部则进一步划分为storefiles 和 memstores 来分别处理持久化磁盘读取请求及内存缓存机制. 当客户端发起 get/scan 请求时,hmaster 会定位到目标所在的regionserver 并返回对应的结果集.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值