HBase开发指南

HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,它支持通过key/value存储来支持实时分析,也支持通过map-reduce支持批处理分析。

1. HBase shell

Hbase shell是简单的,通过shell与HBase交互的方式,以下介绍使用方法:

1.1 启动shell

[root@uhadoop-******-master1 ~]# hbase shell
2016-12-06 11:00:08,624 INFO  [main] Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help' for list of supported commands.
Type "exit" to leave the HBase Shell
Version 1.2.0-cdh5.8.0, rUnknown, Tue Jul 12 16:11:18 PDT 2016

1.2 创建表格,并插入3条数据

hbase(main):004:0> create 'test_ucloud', 'cf'
0 row(s) in 1.2280 seconds

=> Hbase::Table - test_ucloud
hbase(main):005:0> list 'test_ucloud'
TABLE
test_ucloud
1 row(s) in 0.0180 seconds

=> ["test_ucloud"]
hbase(main):006:0> put 'test_ucloud', 'row1', 'cf:a', 'value1'
0 row(s) in 0.1780 seconds

hbase(main):007:0> put 'test_ucloud', 'row2', 'cf:b', 'value2'
0 row(s) in 0.0060 seconds

hbase(main):008:0> put 'test_ucloud', 'row3', 'cf:c', 'value3'
0 row(s) in 0.0060 seconds

1.3 读取全部数据

hbase(main):009:0> scan 'test_ucloud'
ROW                                            COLUMN+CELL
 row1                                          column=cf:a, timestamp=1480993562401, value=value1
 row2                                          column=cf:b, timestamp=1480993575088, value=value2
 row3                                          column=cf:c, timestamp=1480993587152, value=value3
3 row(s) in 0.0610 seconds

1.4 get一行数据

hbase(main):010:0> get 'test_ucloud', 'row1'
COLUMN                                         CELL
 cf:a                                          timestamp=1480993562401, value=value1
1 row(s) in 0.0090 seconds

1.5 删除表

hbase(main):011:0> disable 'test_ucloud'
0 row(s) in 2.3550 seconds

hbase(main):012:0> drop 'test_ucloud'
0 row(s) in 1.4980 seconds

1.6 退出HBase shell

hbase(main):013:0> exit

2. 为Hbase开启LZO压缩

UHadoop集群中HBase已经默认配置支持LZO压缩,只需修改表COMPRESSION属性即可。

2.1 创建LZO表

hbase(main):001:0> create 'test-lzo', {NAME=>'cf', COMPRESSION=>'lzo'}
0 row(s) in 4.5140 seconds
=> Hbase::Table - test-lzo

hbase(main):002:0> desc 'test-lzo'
Table test-lzo is ENABLED
test-lzo
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'LZO', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELE
TED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
1 row(s) in 0.1470 seconds

2.2 为已存在的表增加COMPRESSION=LZO属性

  • 假设您已创建test-nolzo表,如没有,可通过下面的语句创建
create 'test-nolzo', {NAME=>'cf'} 
  • 增加COMPRESSION属性需要先distable表,再修改COMPRESSION属性为LZO,最后enable表。
hbase(main):002:0> disable 'test-nolzo'
0 row(s) in 2.4030 seconds

hbase(main):003:0> alter 'test-nolzo',NAME => 'cf', COMPRESSION => 'LZO'
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9730 seconds

hbase(main):004:0> enable 'test-nolzo'
0 row(s) in 1.2140 seconds
  • 修改COMPRESSION后并不会压缩原有数据,可通过执行以下命令强制执行
hbase(main):005:0> major_compact 'test-nolzo'
0 row(s) in 0.5060 seconds
注解:
数据量大的表此操作需等待较久时间。

## 3. 使用Hive读取HBase数据

请参考Hive应用开发

4. HBase应用开发

4.1 使用JAVA读取HBase(实现创建表格、插入数据,展示数据操作)

此示例需要您先登陆UHadoop集群master1节点,以下操作默认在master1节点执行

4.1.1 构建JAVA代码

mkdir  -p /data/hbase-example
cd /data/hbase-example
touch HbaseJob.java

HbaseJob.java代码如下

java import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; public class HbaseJob { static Configuration conf=null; static{ conf=HBaseConfiguration.create();//hbase的配置信息 } public static void main(String[] args)throws Exception { HbaseJob t=new HbaseJob(); t.createTable("person", new String[]{"name","age"}); t.insertRow("person", "1", "age", "hehe", "100"); t.insertRow("person", "2", "age", "haha", "101"); t.showAll("person"); } /*** * 创建一张表 * 并指定列簇 * */ public void createTable(String tableName,String cols[])throws Exception{ HBaseAdmin admin=new HBaseAdmin(conf);//客户端管理工具类 if(admin.tableExists(tableName)){ System.out.println("此表已经存在......."); }else{ HTableDescriptor table=new HTableDescriptor(tableName); for(String c:cols){ HColumnDescriptor col=new HColumnDescriptor(c);//列簇名 table.addFamily(col);//添加到此表中 } admin.createTable(table);//创建一个表 admin.close(); System.out.println("创建表成功!"); } } public void insertRow(String tableName, String row, String columnFamily, String column, String value) throws Exception { HTable table = new HTable(conf, tableName); Put put = new Put(Bytes.toBytes(row)); put.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value)); table.put(put); table.close();//关闭 System.out.println("插入一条数据成功!"); } public void showAll(String tableName)throws Exception{ HTable h=new HTable(conf, tableName); Scan scan=new Scan(); ResultScanner scanner=h.getScanner(scan); for(Result r:scanner){ System.out.println("===="); for(KeyValue k:r.raw()){ System.out.println("行号: "+Bytes.toStringBinary(k.getRow())); System.out.println("时间戳: "+k.getTimestamp()); System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily())); System.out.println("列: "+Bytes.toStringBinary(k.getQualifier())); String ss= Bytes.toString(k.getValue()); System.out.println("值: "+ss); } } h.close(); } }

4.1.2 构建编译程序

  • 创建编译目录和文件
cd /data/hbase-example
touch hbase-test.sh
  • hbase-test.sh 代码如下:
#!/bin/bash
HBASE_HOME=/home/hadoop/hbase
CLASSPATH=.:undefined/conf/hbase-site.xml

for i in ${HBASE_HOME}/lib/*.jar ;
do
      CLASSPATH=undefined:undefined
done
#编译程序
javac -cp undefined HbaseJob.java
#执行程序
java -cp undefined HbaseJob

4.1.3 执行HBase程序

编译程序目录下执行

sh hbase-test.sh

执行结果如下:

创建表成功!
插入一条数据成功!
插入一条数据成功!
====
行号:  1
时间戳:  1480991139173
列簇:  age
列:  hehe
值:  100
====
行号:  2
时间戳:  1480991139240
列簇:  age
列:  haha
值:  101

5. HBase日常运维操作

以下操作需要在UHadoop集群master节点下以hadoop用户下执行,否则会出现权限不足提示

  • 查看hbase region状态信息查询
hbase hbck
  • 存在inconsistencies region修复 -
hbase hbck -repair
  • 修复hbase空洞 -
hbase hbck -fixHdfsHoles
  • 修复meta信息(根据meta表,将表上的region分给regionserver)
hbase hbck -fixMeta
  • 重新修复meta表(根据hdfs上的regioninfo文件,生成meta表)
hbase hbck -fixAssignments
  • 开启region自动均衡

需要在hbase shell下开启:

[root@uhadoop-******-master1 ~]# hbase shell
2016-12-06 11:00:08,624 INFO  [main] Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help' for list of supported commands.
Type "exit" to leave the HBase Shell
Version 1.2.0-cdh5.8.0, rUnknown, Tue Jul 12 16:11:18 PDT 2016
hbase(main):001:0> balance_switch true