HBase 入门容易,但如果想要把 HBase 用好,需要紧密结合实际业务,根据不同的业务设计 HBase 表结构和存储策略。下面是在学习和工作中的几点总结,拿出来分享。
配置案例:
如果没有很重的读负载,每台机器给HBase最大使用6T的磁盘空间;Java Heap 设置为32G,每个region 20G,每个memstores 128M,其他默认配置。
- 列族数量
HBase对于2个或3个以上的列族的支持不好,所以应该尽量减少列族的数量。当一个列族承载着大量数据进行flushes的时候,在每个region上的 flushing和 compactions将被下线;相邻的列族也会被flush即使列族承载的数据量很小。当许多列族存在 flush和compaction的时候,可能浪费大量的不必要的IO。
- Row 设计
可预测的散列
* 35.2 单调递增的Row Keys*
失败案列:monotonically increasing values are bad;
时间序列
成功案例: opentsdb;
35.3 最小化row和column的大小
- 支持的数据类型
HBase支持”bytes-in/bytes-out”,任何可以转换成byte数组的值都可以存储在HBase中。输入可以是字符串、数字、复杂对象,甚至是图片。
当值的大小有实际的限制(HBase存储10-50M的对象将可能太大而不适合存储);
- Joins
如果你有多张表,不要忘记把需要joins的潜在因素加入到表的设计中。
- 二级索引和胶体查询
周期更新的二级索引
在另一张表中建立二级索引,并通过MR任务周期的更新。任务在一天内执行,但是依赖于载入数据的策略,索引表很有可能和主数据表不一致。
双写二级索引
写入数据表的同时,写入索引表。如果数据表数据已经存在,则通过MR任务建立二级索引。
简单表
这时间范围广(例如一年的报告)和数据量庞大的场景,简单表是普遍的方法。
协处理器二级索引
43. Schema Design Case Studies