Hbase Schema设计与数据模型操作

46 篇文章 6 订阅
13 篇文章 0 订阅
本文介绍了HBase的Schema创建和更新步骤,包括通过HBaseShell或JavaAPI进行表和列族管理。在Schema设计中强调了目标区域大小、单元格限制和列族数量等关键点。同时,文章详细阐述了HBase中的数据模型操作,如Get、Put、Scan和Delete,展示了如何在HBase中读取、写入、扫描和删除数据。
摘要由CSDN通过智能技术生成

一、Hbase Schema设计

1,Schema 创建

使用 Apache HBase Shell 或使用 Java API 中的 Admin 来创建或更新 HBase 模式。

Configuration config = HBaseConfiguration.create();
Admin admin = new Admin(conf);
TableName table = TableName.valueOf("myTable");

admin.disableTable(table);

HColumnDescriptor cf1 = ...;
admin.addColumn(table, cf1);      // adding new ColumnFamily
HColumnDescriptor cf2 = ...;
admin.modifyColumn(table, cf2);    // modifying existing ColumnFamily

admin.enableTable(table);

2,Schema 更新

当对表或 ColumnFamilies (如区域大小、块大小) 进行更改时,这些更改将在下一次出现重大压缩并重新写入 StoreFiles 时生效。

3,HBase Schema 设计规则

(1)目标区域的大小介于10到50 GB之间。
(2)目的是让单元格不超过10 MB,如果使用 mob,则为50 MB 。否则,请考虑将您的单元格数据存储在 HDFS 中,并在 *HBase 中存储指向数据的指针。
(3)典型的模式在每个表中有1到3个列族。HBase 表不应该被设计成模拟 RDBMS 表。
(4)对于具有1或2列族的表格,大约50-100个区域是很好的数字。请记住,区域是列族的连续段。
(5)尽可能短地保留列族名称。列族名称存储在每个值 (忽略前缀编码) 中。它们不应该像在典型的 RDBMS 中一样具有自我记录和描述性。
(6)如果您正在存储基于时间的机器数据或日志记录信息,并且行密钥基于设备 ID 或服务 ID 加上时间,则最终可能会出现一种模式,即旧数据区域在某个时间段之后永远不会有额外的写入操作。在这种情况下,最终会有少量活动区域和大量没有新写入的较旧区域。对于这些情况,您可以容忍更多区域,因为您的资源消耗仅由活动区域驱动。
(7)如果只有一个列族忙于写入,则只有该列族兼容内存。分配资源时请注意写入模式。

二、HBase数据模型操作

在 HBase 中有四个主要的数据模型操作,分别是:Get、Put、Scan 和 Delete。

1,Get(读取)

Get 指定行的返回属性。

(1)读取通过 Table.get 执行。

语法:
get ’<table name>’,’row1’

示例:
hbase(main):012:0> get 'emp', '1'

   COLUMN                     CELL
   
personal : city timestamp=1417521848375, value=hyderabad

personal : name timestamp=1417521785385, value=ramu

professional: designation timestamp=1417521885277, value=manager

professional: salary timestamp=1417521903862, value=50000

4 row(s) in 0.0270 seconds

(1)读取指定列

格式:
hbase>get 'table name', ‘rowid’, {COLUMN => ‘column family:column name ’}

示例:
hbase(main):015:0> get 'emp', 'row1', {COLUMN=>'personal:name'}

  COLUMN                CELL
  
personal:name timestamp=1418035791555, value=raju

1 row(s) in 0.0080 seconds

2,Put(写)

Put 可以将新行添加到表中(如果该项是新的)或者可以更新现有行(如果该项已经存在)。Put 操作通过 Table.put(non-writeBuffer)或 Table.batch(non-writeBuffer)执行。

语法:
put ‘table name’,’row ’,'Column family:column name',’new value’

示例:
(1)假设 HBase 中有一个表 EMP 拥有下列数据:
hbase(main):003:0> scan 'emp'
 ROW              COLUMN+CELL
row1 column=personal:name, timestamp=1418051555, value=raju
row1 column=personal:city, timestamp=1418275907, value=Hyderabad
row1 column=professional:designation, timestamp=14180555,value=manager
row1 column=professional:salary, timestamp=1418035791555,value=50000
1 row(s) in 0.0100 seconds

(2)以下命令将员工名为“raju”的城市值更新为“Delhi”:
hbase(main):002:0> put 'emp','row1','personal:city','Delhi'
0 row(s) in 0.0400 seconds

(3)更新后的表如下所示:
hbase(main):003:0> scan 'emp'
  ROW          COLUMN+CELL
row1 column=personal:name, timestamp=1418035791555, value=raju
row1 column=personal:city, timestamp=1418274645907, value=Delhi
row1 column=professional:designation, timestamp=141857555,value=manager
row1 column=professional:salary, timestamp=1418039555, value=50000
1 row(s) in 0.0100 seconds

3,Scan(扫描)

Scan 允许在多个行上对指定属性进行迭代。

格式:
scan ‘<table name>’ 

示例:
public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...

Table table = ...      // instantiate a Table instance

Scan scan = new Scan();
scan.addColumn(CF, ATTR);
scan.setRowPrefixFilter(Bytes.toBytes("row"));
ResultScanner rs = table.getScanner(scan);
try {
  for (Result r = rs.next(); r != null; r = rs.next()) {
    // process result...
  }
} finally {
  rs.close();  // always close the ResultScanner!
}

4,Delete(删除)

Delete 操作用于从表中删除一行。Delete 通过 Table.delete 执行。HBase 不会修改数据,因此通过创建名为 tombstones 的新标记来处理 Delete 操作。这些 tombstones,以及没用的价值,都在重大的压实中清理干净。

语法:
delete ‘<table name>’, ‘<row>’, ‘<column name >’, ‘<time stamp>’

示例:
hbase(main):006:0> delete 'emp', '1', 'personal data:city',
1417521848375
0 row(s) in 0.0060 seconds

删除表的所有单元格:
使用 “deleteall” 命令,可以删除一行中所有单元格。

语法:
deleteall ‘<table name>’, ‘<row>’,

示例:
hbase(main):007:0> deleteall 'emp','1'
0 row(s) in 0.0240 seconds

使用 Scan 命令验证表。表被删除后的快照如下:

hbase(main):022:0> scan 'emp'

ROW                  COLUMN+CELL

2 column=personal data:city, timestamp=1417524574905, value=chennai 

2 column=personal data:name, timestamp=1417524556125, value=ravi

2 column=professional data:designation, timestamp=1417524204, value=sr:engg

2 column=professional data:salary, timestamp=1417524604221, value=30000

3 column=personal data:city, timestamp=1417524681780, value=delhi

3 column=personal data:name, timestamp=1417524672067, value=rajesh

3 column=professional data:designation, timestamp=1417523187, value=jr:engg

3 column=professional data:salary, timestamp=1417524702514, value=25000
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓之以理的喵~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值