删除指定的行是在构造 Delete 对象的时候只传入行健
7.1 HBase 表设计
7.1 HBase 表设计
致均衡分布,这样设计有个好处是能将 RegionServer 负载均衡,否则容易产生所有新数据都在一个 RegionServer 上堆积的现象,这一点还可以结 合表的预切分一起设计。 eger.MAX_VALUE - rowkey 的方式将 Row Key 进行转换,最大的变最小,最小的变最大,在应用层再转回来即可完成排序需求。2) Row Key 的散列原则:如果 Row Key 是类似时间戳的方式递增的生成,建议不要使用正序直接写入 Row Key ,而是采用 reverse 的方式 反转 Row Key 。
7.1 HBase 表设计
• 3. 列族设计
设计 HBase Schema 的时候,要尽量只有一个 Column Family ,目前 HBase 并不能很好的处理超过 2~3 个 Column Family 的表。
Flush 和 Compaction 触发的基本单位都是 Region 级别,当一个列族有大量的数据的时候会触发整个 Region 里面的其他列族的 MemStore( 其实这 些 MemStore 可能仅有少量的数据,还不需要 Flush) 也发生 Flush 动作;另外 Compaction 触发的条件是当 StoreFile 的个数 ( 不是总的 Store File 的大小 ) 达到一定数量的时候会发生,而 Flush 产生的大量 StoreFile 通常会导致 Compaction , Flush 和 Compaction 会发生很多 I/O 相 关的负载,这对 HBase 的整体性能有很大影响,所以选择合适的列族个数很重要。
• 4. 列
对于列需要扩展的应用,列可以按普通的方式设计,但是对于列相对固定的应用,最好采用将一行记录封装到一个列中的方式,这样能够节省存储空间。
封装的方式推荐使用 Protocol Buffer 。
例:身份证表 Card 和人表 Person 之间一对一关系 ( 左是 MySQL 设计,右图是 HBase 设计 )
HBase Person 表
字段 说明
Row Key person_id 行健
Column Family
7.1 HBase 表设计
order_date 订单日期 日期
user_id 外键关联 User 表 id 主键 整型
HBase Orders 表
字段 说明
Row Key order_code 订单编码,行健,逆排序
Column Family
info:username 用户名 info:password 密码 info:address 家庭住址 info:order_date 订单日期
7.1 HBase 表设计
• 4. 列
例:商品表 Product 和订单表 Order 之间多对多的关系
一个商品可能被多个订单购买,而一个订单也可能有多个商品。为了表达两者多对多的关系,需要通过中间表 Orders_Item 表达多对多关系。
( 上边是 MySQL 设计,下图是 HBase 设计 )
Product 表 Order 表 Orders_Item 表
字段 说明 属性 字段 说明 属性 字段 说明 属性
id Product 表主键 整型,自动增加 1 id Order 表主键 整型,自动增加 1 product_id 外键关联 Product 表 id 主键 整型
product_code 商品编码 字符串 code 订单编码 字符串 order_id 外键关联 Order 表 id 主键 整型
product_name 商品名称 字符串 order_date 订单日期 日期
product_price 商品价格 浮点型 user_id 外键关联 User 表 id 主
键 整型
HBase Product 表 HBase Order 表
字段 说明 字段 说明
Row Key product_code 商品编码,行健,逆排序 Row Key order_code 订单编码,行健,逆排序
Column Family product:name 商品名称
Column Family info:date 订单日期
product:price 商品价格 info:price 商品价格
Column Family order:code 订单编码
Column Family
product_code 商品编码
order:date 订单日期 product:name 商品名称
product:price 商品价格