Hbase的Schema设计

Preface

下面将描述几个Hbase典型数据接入用户案例,Rowkey如何设计和构造的方法;

提示:这些只是提供可能的方法,非详尽的方法,这取决于你的业务需求。

Log Data / Timeseries Data

假设如下数据元素已经归集:

  • Hostname

  • Timestamp

  • Log event

  • Value/message

我们可以在Hbase表里存储数据并命名LOG_DATA

Timestamp In The Rowkey Lead Position(时间戳优先)

这样,rowkey格式 [timestamp][hostname][log-event] 面临rowkey线性增长的问题。

另一个模式经常提到的“桶‘,对时间戳使用MOD操作,这个将更多注意在“桶”的个数上。

long bucket = timestamp % numBuckets 

rowkey构造:

[bucket][timestamp][hostname][log-event]

 

基于以上,为在特定时间范围查询数据,Scan将调优各个“桶”。

比如,100个“桶”,分布在更大的键值空间,需要100 个Scans获取单个时间戳数据,因此需要平衡。

Host In The Rowkey Lead Position(主机名优先)

rowkey [hostname][log-event][timestamp] 格式是备选,如果大量主机有读写的情况下。

Timestamp, or Reverse Timestamp

 取决于特定场景

Variable Length or Fixed Length Rowkeys?

当hostname & event type 长度较短的时候,rowkey会非常小。

hostname & event type 长度较长时,则有二个方法:hased 和numeric。

Rowkey Hashes组合:

  • [MD5 hash of hostname] = 16 bytes

  • [MD5 hash of event-type] = 16 bytes

  • [timestamp] = 8 bytes

Rowkey Numeric组合:ref Hbase counter

  • [substituted long for hostname] = 8 bytes

  • [substituted long for event type] = 8 bytes

  • [timestamp] = 8 bytes

Log Data / Timeseries on Steroids

如果是这类数据接入:

[hostname][log-event][timestamp1]
[hostname][log-event][timestamp2]
[hostname][log-event][timestamp3]

 

可能用这类分开的rowkeys:

[hostname][log-event][timerange]

Customer/Order

假设HBase存储用户和订单信息,两个核心记录类型接入:用户记录类型、订单记录类型。

客户记录信息:

  • Customer number

  • Customer name

  • Address (e.g., city, state, zip)

  • Phone numbers, etc.

订单记录信息:

  • Customer number

  • Order number

  • Sales date

  • A series of nested objects for shipping locations and line-items

例如客户编号、销售编号这二个属性做为组合rowkey:

[customer number][order number]

可以用二种类型:

 Rowkey  Hashes 组合:

  • [MD5 of customer number] = 16 bytes

  • [MD5 of order number] = 16 bytes

Rowkey Numeric/Hash 组合 :

  • [substituted long for customer number] = 8 bytes

  • [MD5 of order number] = 16 bytes

单表或多表

传统设计方法对CUSTOMER 和 SALES分开表方式:

单表:

Customer Record Type Rowkey:

  • [customer-id]

  • [type] = type indicating `1' for customer record type

Order Record Type Rowkey:

  • [customer-id]

  • [type] = type indicating `2' for order record type

  • [order]

 CUSTOMER++这类方法优点在于能组织多个客户ID的多种记录类型,缺点是不易扫描特定记录类型。

 

Tall/Wide/Middle Schema Design

 

List Data

 

ref : 

hbase.apache.org/book.html#schema.casestudies

posted @ 2021-03-31 10:41  lenomail  阅读(246)  评论(0编辑  收藏  举报