Hadoop 课程笔记:HBase
HBase 是一个分布式、面向列的开源数据库。
- HDFS 为 HBase 提供存储支持
- MapReduce 为 HBase 提供计算能力
- Zookeeper 为 HBase 集群服务
Table
基本概念
HBase 的表是面向列或列族进存储和权限控制,每一列都独立检索。
对于空的列,并不占用存储空间,因此表可以设计的非常稀疏。
- Rowkey 行键。任意字符串,保存为字节数组,并按照字典顺序排列存储。用于检索记录,可通过单个 rowkey 或指定 rowkey 的范围访问;
- Column Family 列族,Column 列。一个列族是多个列的集合,列名以
列族名:
作为前缀,列中数据均以二进制存储没有类型,创建表时声明; - Timestamp 时间戳。64位整型,由 HBase 自动赋值,精确到毫秒,也可以由客户端赋值;
- Cell 单元。通过 row 和 column 可以确定的一个存储单元即为单元,每一个单元保存着一个数据的多个版本(最新的版本在最前面,版本通过时间戳索引)。单元中的数据均以字节码存储没有类型
物理存储
Table 在水平方向分割为多个 HRegion(划分为多个行集合),当某个分区的数据不断增大并达到阈值时,等分为两个新的 HRegion。
HRegion 是分布式存储和负载均衡的最小单位,无法拆分到不同的服务器上。一个 HRegion 由多个 Store 组成,每个 Store 存储一个列族,每个 Store 又由一个 MemStore 和可能的多个 StoreFile 组成。StoreFile 即存储在 HDFS 上的 HFile。
结构
Client
Client 包含访问 Client 的接口,并维护着一些缓存加速 HBase 访问,比如 HRegion 所在的位置等。
Client 访问 HBase 上的数据无需 HMaster 参与,寻址时访问 Zookeeper 和 Reigon Server,数据读写访问 Reigon Server,HMaster 仅仅维护 Table 和 HRegion 的元数据信息,负载低。
HMaster
管理用户对 Table 的 Schema 操作(修改表结构)
调整 HRegionServer 分布做到负载均衡
在某个HRegionServer 停机后,负责新 Region 的迁移
HMaster 由多个,通过 Zookeeper 确保只有一个 Active,其余均为备份节点
Zookeeper
保证只有一个 Active 的 HMaster
存储所有 Region 的寻址入口
实时监控 HRegion Server 的状态
存储 HBase 的 Schema
HRegionServer
HRegionServer 内部管理了一系列 HRegion 对象(每个 HRegion 对应 Table 中的一个 Region)
数据紧缩
Minor Compaction:选取小的、相邻的 StoreFile 合并为一个更大的 StoreFile
Major Compaction:将所有的 StoreFile 合并为一个 StoreFile,并丢弃已被删除和过期的 Cell,超过最多版本数的 Cell 也被丢弃。会重写所有 Store,开销较大,建议手动运行。
操作
建表
1 | create 'table_name','column_family_1','column_family_2' |
删表
1 | disable 'table_name' |
增加记录(4个参数)
1 | put 'table_name','row_key_name','column_family:column','string' |
读取记录(2个参数及以上)
1 | get 'table_name', 'row_key_name'[, 'column_family'][, 'column_family:column'] |
Scan 查询记录
VERSION => N
用于查询版本最新的 N 个
1 | scan 'table_name', {COLUMNS => 'column_family__name'[, RAW => true] [, VERSIONS=>3]} |
添加列族(修改列族时应该先 disable 表)
1 | alter 'table_name', NAME => 'f1' |
删除列族
1 | alter 'table_name', NAME => 'f1', METHOD => 'delete' |
修改列族版本
1 | alter 'table_name', {NAME => 'f1'}, {NAME => 'f1', VERSIONS => 5} |