HBase 是什么
- HBase 是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。
HBase 如何存储
-
使用 Hadoop HDFS 作为其文件存储系统。
-
存储结构:HMaster、HRegionSever、HRegion、HLog、Store、MemStore、StoreFile、HFile。
-
Table 在行的方向上分割为多个 HRegion(分散在不同的 RegionServer),每个 HRegion 由多个 Store 构成,每个 Store 由一个 MemStore 和 0或多个 StoreFile 组成,每个 Store 保存一个 Columns Family(列族),StoreFile 以 HFile 格式存储在 HDFS 中。
HBase 适用场景
-
需要实时读写、随机访问超大规模数据集时,可以使用 HBase。
-
需要横向、纵向伸缩扩展的数据存储,伸缩能力强。
HBase 如何查询
- 通过单个 rowkey 访问。
- 通过 rowkey 的范围。
- 全表扫描。
注:通过 rowkey 访问效率高。
Rowkey 如何设计
- Rowkey 行键可以任意字符串(最大长度64KB,实际应用中长度一般为10-100bytes),在 HBase 内部 RowKey 保存为字节数组。
- Rowkey 设计规则:唯一、排序、散列(Region 热点问题,Rowkey 开头不能相同)。
注:Rowkey 设计时要注意避免数据热点,对于 Rowkey 前几位相似度高的,考虑逆序,保证前几位分布平均。
- Rowkey 长度规则:越短越好,不建议超过100字节,列族名、列名等都尽量使用短名字。
注:Rowkey 长度建议为8的倍数,满足电脑内存对齐特性,效率更高。
HBase 行、列族、列名
- 行的一次读写是原子操作(不论一次读写多少列)。
- 列簇是表的 schema 的一部分(而列不是),必须在使用表之前定义,HBase 表中的每个列,都归属于某个列簇。
(1)访问控制,磁盘和内存的使用统计都是在列簇层面进行的;
(2)列簇上的控制权限能管理不同类型的应用;允许一些应用可以添加新的基本,一些应用可以读取基本数据并创建继承的列簇、一些应用则只允许浏览数据。
- 列名都以列簇作为前缀。
HBase时间戳
- HBase 中通过 row 和 columns 确定的为一个存储单元称为 cell。每个 cell 都保存着同一份数据的多个版本,版本通过时间戳来索引。
HBase使用注意事项
- 如果只有一个 family,每次都会读当前 rowkey 的所有数据,网络和 IO 会有损失。
- Hbase 官方建议不超过2~3个 column family。
(1)最优设计:将所有相关性很强的 key-value 放在同一个列簇下;
(2)既能做到查询效率最高,也能保持尽可能少的访问不同的磁盘文件;
(3)以用户信息为例,将必须的基本信息放一个列族,附加的额外信息放另一列族。
- 提前预分区,每一个 region 维护着 startRow 与 endRowKey,如果加入的数据符合某个 region 维护的 rowKey 范围,则该数据交给这个 region 维护。
(1)依照此原理,可将数据所要投放的分区提前大致规划好,以提高HBase性能。
- 建表高级属性
(1)BLOOMFILTER:对列族启用,节省读磁盘过程,有助于降低读取延迟;
(2)VERSIONS:设置老版本保留数量,设为1能节约 2/3 的空间;
(3)COMPRESSION:指定列族是否采用压缩,及采用的压缩算法;
(4)TTL:该列族数据的存活时间,超时不再显示,待下次 major compact 时彻底删除数据,默认2147483647,约68年 。
注:触发 major compaction 的可能条件有:major_compact 命令、majorCompact() API、region server自动运行,此操作用于处理小文件过多。