天天看点

HBase 数据模型

HBase 数据模型

rowkey cf1:q2 获取最新数据

rowkey , CF1, q2, t2 四维数据库,获取指定列族指定列指定时间戳的数据

rowkey 列族 列名 时间戳 四个纬度

row key

  1. 决定一行数据
  2. 按照字典顺序排序的。
  3. Row key 只能存储 64k 的字节数据(UTF-8 编码格式下 2.133w 多个汉字)

Column Family 列族 & qualifier 列

  1. HBase 表中的每个列都归属于某个列族,列族必须作为表模式(schema)定义的一部分 预先给出。 create ‘tb_user’, ‘cf’ 或 create ‘test’, ‘course’;
  2. 列名以列族作为前缀,每个“列族”都可以有多个列成员(column);如 course:math, course:english, 新的列族成员(列)可以随后按需、动态加入;
  3. 权限控制、存储以及调优都是在列族层面进行的;
  4. HBase 把同一列族里面的数据存储在同一目录下,由几个文件保存。

Cell 单元格

  1. 由行和列的坐标交叉决定;
  2. 单元格是有版本的;
  3. 单元格的内容是未解析的字节数组;
  4. 由{row key, column( = +), version} 唯一确定的单元。
  5. cell 中的数据是没有类型的,全部是字节数组形式存贮。

Timestamp 时间戳

rowkey - liezu:biaozhifu version cell value 在 HBase 每个 cell 存储单元对同一份数据有多个版本,根据唯一的时间戳来区分每个版本 之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。 rowkey cf name 时间戳的类型是 64 位整型。 时间戳可以由 HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。 时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯 一性的时间戳。 在 HBase 0.96 之前,保留的默认版本数为 3,但是在 0.96 中,更新版本已更改为 1。 hbase 可以容忍不同 regionserver 之间的时间差 30s,否则失败。 做时间同步 yum install ntp -y service ntpd start chkconfig ntpd on

HLog(WAL log)

WAL:WRITE AHEAD LOG HLog 文件就是一个普通的 Hadoop Sequence File,Sequence File 的 Key 是 HLogKey 对象,HLogKey 中记录了写入数据的归属信息,除了 table 和 region 名字外, 同时还包括 sequence number 和 timestamp,timestamp 是”写入时间”,sequence number 的起始值为 0,或者是最近一次存入文件系统中 sequence number。 HLog SequeceFile的Value是HBase的KeyValue对象,即对应HFile中的KeyValue。23

键(四个维度)value(单元格的值) 该文件作用是保证数据不丢失。

目录表

目录表 hbase:meta 作为 HBase 表存在,并从 hbase shell 的 list 命令中过滤掉,但 实际上是一个表,就像任何其他表一样。 hbase:meta 表(以前称为.META.),保有系统中所有 region 的列表。hbase:meta 存储在 zookeeper 中。 表结构如下:

key:
  region 的 key,结构为:[table],[region start key],[region id] 
values: 
  info:regioninfo(当前 region 序列化的 HRegionInfo 实例) 
  info:server(包含当前 region 的 RegionServer 的 server:port) 
  info:serverstartcode(包含当前 region 的 RegionServer 进程的开始时间)      

当表正在拆分时,将创建另外两列,称为 info:splitA 和 info:splitB。 这些列代表两个 子 region。 这些列的值也是序列化的 HRegionInfo 实例。区域分割后,将删除此行。 空键用于表示表开始和表结束。具有空开始键的 region 是表中的第一个 region。如果 某个 region 同时具有空开始和空结束键,则它是表中唯一的 region。 启动顺序:首先,在 zookeeper 中查找 hbase:meta 的位置。其次,使用服务器和启动 代码更新 hbase:meta 的值

给 RegionServer 赋值 region(最好理解) 当 hbase 启动的时候,region 通过如下步骤赋值给 regionserver:

1、系统启动的时候,master 调用 AssignmentManager(赋值管理器)

2、AssignmentManager 在 hbase:meta 中查找已经存在的 region 条目

3、如果 region 条目依旧是正确的(比如说 regionserver 依然在线),就保留该赋值信息

4、如果赋值不正确,就调用 LoadBalancerFactory 对 region 进行赋值。负载平衡器将 region 赋 值 给 一 个 regionserver 。 hbase1.0 中 默 认 的 负 载 均 衡 器 是 StochasticLoadBalancer。

5、在 regionserver 打开 region 的时候使用 regionserver 的开始代码更新 hbase:meta 中 regionserver 的赋值。

当客户端访问的时候,regionserver 失败的时候:

1、由于 regionserver 宕机,region 立即不可用

2、master 检测到该 regionserver 的失败

3、认为 region 的赋值不正确,使用启动顺序的流程重新给 region 赋值

4、正在进行的查询会重试,而不是丢失。

5、在下述时间内操作会转移到新的 regionserver:zookeeper session timeout+split time+assignment/replay time

Client->regionserver1(宕机了,在 zk 上对应的临时节点一定时间后消失) 
Client->hbase:meta-->regionserver2(重新分配一个 regionserver) 
Client->regionserver2->对应的 region      
  • 强大的一致读/写:HBase 不是“最终一致”的 DataStore。它非常适合高速计数 器聚合等任务。
  • 自动分片:HBase 表通过 region 分布在群集上,并且随着数据的增长,region 会 自动分割和重新分配。 25

    26

  • 自动的 RegionServer 故障转移。
  • Hadoop/HDFS 集成:HBase 支持 HDFS 作为其分布式文件系统
  • MapReduce:HBase 支持通过 MapReduce 进行大规模并行处理,将 HBase 用 作 源 和 漏 。 HBASE->MR->HDFS HBASE->MR->HBASE HDFS->MR->HBASE
  • Java 客户端 API:HBase 支持易于使用的 Java API 以进行编程访问。 - Thrift/REST API:HBase 还支持非 Java 前端的 Thrift 和 REST。
  • 块缓存和布隆过滤器:HBase 支持块缓存和布隆过滤器,以实现大容量查询优化。
  • 运维管理:HBase 提供内置网页,用于运维监控和 JMX 指标。 HBase 不支持行间事务(情侣转账 520) HBase 支持行内事务