使用 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 ColumnFamilyadmin.enableTable(table);
当对表或 ColumnFamilies (如区域大小、块大小) 进行更改时,这些更改将在下一次出现重大压缩并重新写入 StoreFiles 时生效。
(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 中有四个主要的数据模型操作,分别是:Get、Put、Scan 和 Delete。
Get 指定行的返回属性。
(1)读取通过 Table.get 执行。
语法:
get ’’,’row1’示例:
hbase(main):012:0> get 'emp', '1'COLUMN CELLpersonal : city timestamp=1417521848375, value=hyderabadpersonal : name timestamp=1417521785385, value=ramuprofessional: designation timestamp=1417521885277, value=managerprofessional: salary timestamp=1417521903862, value=500004 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 CELLpersonal:name timestamp=1418035791555, value=raju1 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 ‘’ 示例:
public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...Table table = ... // instantiate a Table instanceScan 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 ‘’, ‘’, ‘’, ‘