HBase - 行键基础

Posted

技术标签:

【中文标题】HBase - 行键基础【英文标题】:HBase - rowkey basics 【发布时间】:2013-04-10 05:22:11 【问题描述】:

注意:几个小时前,我开始使用 HBase,我来自 RDBMS 背景:P

我有一个类似于 RDBMS 的表 CUSTOMERS,其中包含以下列:

    CUSTOMER_ID 字符串 CUSTOMER_NAME STRING CUSTOMER_EMAIL 字符串 CUSTOMER_ADDRESS 字符串 CUSTOMER_MOBILE STRING

我想到了以下 HBase 等效项:

表:CUSTOMERS 行键:CUSTOMER_ID

列族:CUSTOMER_INFO

columns : NAME EMAIL ADDRESS MOBILE

根据我的阅读,RDBMS 表中的主键与 HBase 表的行键大致相似。因此,我想保留 CUSTOMER_ID 作为行键。

我的问题既愚蠢又直截了当:

    无论我使用的是 shell 命令还是 HBaseAdmin java 类,我如何定义行键?我没有找到任何事情要做 无论是在 shell 中还是在 HBaseAdmin 类中(比如 HBaseAdmin.createSuperKey(...)) 给定一个 HBase 表,如何确定行键详细信息,即哪些值用作行键? 我知道 rowkey 设计很重要。假设客户 id 接收 CUST_12345、CUST_34434 等值,HBase 将如何使用 rowkey 来决定特定行驻留在哪个区域(假设区域概念类似于 DB 水平分区)?

***编辑添加示例代码sn-p

我只是想在 shell 中使用“put”为客户表创建一行。我这样做了:

hbase(main):011:0> put  'CUSTOMERS', 'CUSTID12345', 'CUSTOMER_INFO:NAME','Omkar Joshi'
0 row(s) in 0.1030 seconds

hbase(main):012:0> scan 'CUSTOMERS'
ROW                              COLUMN+CELL
 CUSTID12345                     column=CUSTOMER_INFO:NAME, timestamp=1365600052104, value=Omkar Joshi
1 row(s) in 0.0500 seconds

hbase(main):013:0> put  'CUSTOMERS', 'CUSTID614', 'CUSTOMER_INFO:NAME','Prachi Shah', 'CUSTOMER_INFO:EMAIL','Prachi.Shah@lntinfotech.com'

ERROR: wrong number of arguments (6 for 5)

Here is some help for this command:
Put a cell 'value' at specified table/row/column and optionally
timestamp coordinates.  To put a cell value into table 't1' at
row 'r1' under column 'c1' marked with the time 'ts1', do:

  hbase> put 't1', 'r1', 'c1', 'value', ts1


hbase(main):014:0> put  'CUSTOMERS', 'CUSTID12345', 'CUSTOMER_INFO:EMAIL','Omkar.Joshi@lntinfotech.com'
0 row(s) in 0.0160 seconds

hbase(main):015:0>
hbase(main):016:0* scan 'CUSTOMERS'
ROW                              COLUMN+CELL
 CUSTID12345                     column=CUSTOMER_INFO:EMAIL, timestamp=1365600369284, value=Omkar.Joshi@lntinfotech.com
 CUSTID12345                     column=CUSTOMER_INFO:NAME, timestamp=1365600052104, value=Omkar Joshi
1 row(s) in 0.0230 seconds

作为投入最大。 5 个参数,我无法弄清楚如何在一个 put 命令中插入整行。这导致同一行的增量版本不是必需的,我不确定 CUSTOMER_ID 是否被用作行键! 谢谢和问候!

【问题讨论】:

【参考方案1】:

    你不知道,键(以及任何其他列)是一个字节数组,你可以在其中放置任何你想要的东西——甚至封装子实体

    不确定我是否理解 - 每个值都存储为键 + 列族 + 列限定符 + 日期时间 + 值 - 所以键就在那里。

    HBase 会计算出一条记录将在哪个区域移动。当区域变得太大时,它会重新分区。此外,当垃圾太多时,HBase 也会不时执行压缩以重新整理文件。您可以在自己预先分区时控制它,这是您将来绝对应该考虑的事情。但是,由于您似乎刚刚开始使用 HBase,您可以从 HBase 开始处理它。一旦你更好地了解了你的使用模式和数据,你可能会想再看一遍。

您可以阅读/听到一些关于 HBase 架构设计 here 和 here 的信息

【讨论】:

您好阿农,感谢您的回复!我已经详细阐述了我的问题,以便我更清楚我不清楚的内容:D 谢谢和问候! 据我所知,您不能在 hbase shell 中插入多列。您可以通过客户端 API hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/… 做到这一点(它仍然是多个 put) 有什么问题? - 多个 put 仍然可以作为原子更新。 关键是我不确定 CUSTOMER_ID 是否作为(主键)行键工作 - 你可以从表扫描的输出中确认吗? 正如我在上面写的,每个值都有键、列族、限定符、时间戳和值,所以当你插入一个“行”时,你会在扫描中得到很多行(每个值),你'd 会看到 key 出现多次。

以上是关于HBase - 行键基础的主要内容,如果未能解决你的问题,请参考以下文章

HBase

HBase里的优秀行键设计

HBase 行键设计

hbase 行键设计

如何设置开始和结束行键 HBASE

hbase 的最佳行键设计