实战Hadoop
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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使用示例结果