• 沒有找到結果。

删除指定的行是在构造 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 商品价格

相關文件