4.3 HBase操作演练
4.3.1 基本shell操作
(1)启动HBase后,通过shell命令连接到HBase,并使用status命令查看HBase的运行状态,确保HBase正常运行,如下所示:
hao@UbuntuMaster:/usr/hbase-0.90.3$ bin/hbase shell HBase Shell; enter 'help<RETURN>' for list of supported commands Type "exit<RETURN>" to leave the HBase Shell Version 0.90.3, r1100350, Sat May 7 13:31:12 PDT 2011
hbase(main):001:0> status 3 servers, 0 dead, 1.0000 average load
(2)输入help命令可以查看有哪些shell命令以及参数选项,从图4-12看出表名、行和列名等都要用单引号扩起来,并以逗号隔开。
图4-12 help命令结果的部分截图
(3)创建一个只包含一个列族fam1的表tab1,并通过list指令查看表是否创建成功,如下所示:
hbase(main):017:0> create 'tab1', 'fam1' 0 row(s) in 1.2840 seconds
hbase(main):018:0> list TABLE tab1 1 row(s) in 0.0400 seconds
(4)使用put命令向表中插入数据,参数分别为表名、行名、列名和值,其中列名前需要列族作为前缀,时间戳由系统自动生成。插入成功后通过scan命令查看表中的信息,如下所示:
hbase(main):019:0> put 'tab1', 'row1', 'fam1:col1', 'val1' 0 row(s) in 0.6430 seconds
hbase(main):020:0> put 'tab1', 'row2', 'fam1:col2', 'val2' 0 row(s) in 0.0810 seconds
hbase(main):021:0> put 'tab1', 'row2', 'fam1:col3', 'val3' 0 row(s) in 0.0370 seconds
hbase(main):022:0> scan 'tab1' ROW COLUMN+CELL row1 column=fam1:col1, timestamp=1313424304560, value=val1 row2 column=fam1:col2, timestamp=1313424316841, value=val2 row2 column=fam1:col3, timestamp=1313424334790, value=val3 2 row(s) in 0.3630 seconds
(5)可以通过get指令获取表中的一行数据,通过delete删除一行的数据,如下所示:
hbase(main):023:0> get 'tab1', 'row2' COLUMN CELL fam1:col2 timestamp=1313424316841, value=val2 fam1:col3 timestamp=1313424334790, value=val3 2 row(s) in 0.0660 seconds
hbase(main):024:0> delete 'tab1', 'row2', 'fam1:col2' 0 row(s) in 0.0670 seconds hbase(main):025:0> scan 'tab1' ROW COLUMN+CELL row1 column=fam1:col1, timestamp=1313424304560, value=val1 row2 column=fam1:col3, timestamp=1313424334790, value=val3 2 row(s) in 0.0850 seconds
(6)通过diable和drop命令删除tab1表,如下所示:
hbase(main):026:0> disable 'tab1' 0 row(s) in 5.4310 seconds
hbase(main):027:0> drop 'tab1' 0 row(s) in 2.5510 seconds
4.3.2 基本API使用
通过Eclipse创建一个新工程,并新建一个类HBasicOperation,写代码前还要引入Hadoop开发所需要的jar包以及HBase的两个jar包(hbase-0.90.3.jar和zookeeper-3.3.2.jar),完成上述操作后即可开发HBase应用。
(1)使用HBaseConfiguration.create()初始化HBase的配置文件,并指定HBase使用的ZooKeeper的地址。然后实例化HBaseAmin,该类用于对表的元数据进行操作并提供了基本的管理操作,如下所示:
Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum","UbuntuSlave1,UbuntuSlave2,UbuntuSlave3"); HBaseAdmin admin = new HBaseAdmin(conf);
(2)HBaseAdmin.Create()可以用于创建一张新表,该方法的参数为HTableDescription类,用于描述表名和相关的列族。该方法的返回值为HTable类,用于对表进行相关操作,如下所示:
HTableDescriptor tableDescripter = new HTableDescriptor("tab1".getBytes()); tableDescripter.addFamily(new HColumnDescriptor("fam1")); admin.createTable(tableDescripter); HTable table = new HTable(conf, "tab1");
(3)使用HTable.put()可以向表中插入数据,该方法的参数为Put类,该类初始化时可以传递一个行键,表示向哪一行插入数据,并通过Put.add()添加需要插入表中的数据,如下所示:
Put putRow1 = new Put("row1".getBytes()); putRow1.add("fam1".getBytes(), "col1".getBytes(), "val1".getBytes()); table.put(putRow1);
System.out.println("add row2"); Put putRow2 = new Put("row2".getBytes()); putRow2.add("fam1".getBytes(), "col2".getBytes(), "val2".getBytes()); putRow2.add("fam1".getBytes(), "col3".getBytes(), "val3".getBytes()); table.put(putRow2);
(4)使用HTable.getScanner()可以获得某一个列族的所有数据(其他重载详见HBase的API文档),该方法返回Result类,Result.getFamilyMap()可以获得以列名为key,值为value的映射表,然后就可以依次读取相关的内容了。
for (Result row :table.getScanner("fam1".getBytes())) { System.out.format("ROW\t%s\n", new String(row.getRow())); for (Map.Entry<byte[], byte[]> entry :row.getFamilyMap("fam1".getBytes()).entrySet()) { String column = new String(entry.getKey()); String value = new String(entry.getValue()); System.out.format("COLUMN\tfam1:%s\t%s\n", column, value); } }
(5)使用HBaseAdmin.disableTable()和HBaseAmind.deleteTable()可以删除一张表。
admin.disableTable("tab1"); admin.deleteTable("tab1");
上述操作完成了与4.3.1节一样的功能,如图4-13为程序的部分输出结果。
图4-13 基本API使用示例结果