Native Java API 最常规和高效的访问方式;Java API是访问Hbase最快的方式。
HBase Shell HBase的命令行工具,最简单的接口,适合HBase管理使用;
Thrift Gateway 利用Thrift序列化技术,支持C++, PHP, Python等多种语言。
REST Gateway 支持REST 风格的Http API访问HBase, 解除了语言限制;
MapReduce 直接使用MapReduce作业处理Hbase数据,使用Pig/hive处理Hbase数据。
一、java开发
步骤1:创建一个Configuration对象包含各种配置信息
Configuration conf = HbaseConfiguration.create();
步骤2:构建一个HTable句柄,提供Configuration对象,提供待访问Table的名称(不支持多行事务或者表级别的事务,支持单行事务)
org.apache.hadoop.hbase.client.HTable
HTable table = new HTable(conf, tableName);
步骤3:执行相应的操作,执行put、 get、 delete、 scan等操作
table.getTableName();
table.put("str");
步骤4:关闭HTable句柄,将内存数据刷新到磁盘上,释放各种资源
table.close();
Configuration对象包装了客户端程序连接Hbase服务所需的全部信息;
Zookeeper位置
Zookeeper连接超时时间
HbaseConfiguration.create()内部逻辑
1、从CLASSPATH中加载hbase-default.xml和hbase-site.xml两个文件
在<hadoop_install>/conf/hadoop-env.sh中设置
export HADOOP_CLASSPATH=$HBASE_HOME/*:$HBASE_HOME/conf:$HADOOP_CLASSPATH
hadoop classpath | grep hbase
2、hbase-default.xml已经被打包到Hbase jar包中(hbase自带)
3、hbase-site.xml需添加到CLASSPATH中(自己配置)
4、hbase-site.xml将覆盖hbase-default.xml中的同名属性
HTable句柄的创建
创建HTable句柄代价很大
扫描.META.表等;
创建一次,以后尽可能复用;
如果需要创建多个Htable句柄,使用HTablePool;
HTable并非线程安全的:一个线程创建一个即可
Htable支持CRUD批处理:非线程安全,仅是为了提高性能
向HBase写入数据
步骤1:创建一个Put对象;
Put put = new Put(Bytes.toBytes("rowkey"));//转化为byte
步骤2:设置cell值;
Put.add(family, column, value)
Put.add(family, column, timestamp, value)
Put.add(KeyValue kv)
步骤3:调用HTable中的put方法,写入数据;
步骤4:关闭HTable句柄。
![](http://dl2.iteye.com/upload/attachment/0107/0285/36c4a51a-3d27-305a-8413-1bc726352943.png)
从Hbase中读取数据:
接口:
get.setTimeRange(minStamp, maxStamp)
get.setMaxVersions(maxVersions)
get.addFamily(family)
get.addColumn(family, column)
读取数据时注意事项:
只读取需要的数据
尽可能增加数据约束条件
可增加family, column(s), time range 和 max versions等约束条件
![](http://dl2.iteye.com/upload/attachment/0107/0291/ec2c6e26-f522-33bd-b088-e05dcfcb67c2.png)
![](http://dl2.iteye.com/upload/attachment/0107/0293/127d5d18-3b42-316f-b995-27e19c59495c.png)
从Hbase中删除数据:
![](http://dl2.iteye.com/upload/attachment/0107/0295/04f23412-a33a-3abe-8162-d903226bf72f.png)
从Hbase中scan数据:
![](http://dl2.iteye.com/upload/attachment/0107/0297/c81dc46c-1603-3cc9-a209-c52fe7e752d7.png)
二、mapreduce开发
![](http://dl2.iteye.com/upload/attachment/0107/0300/a8bc4d4e-2bf2-35f4-8524-64ce17d9a9de.png)
创建Job对象,设置基本属性;
设置scan对象,指定扫描区间和数据列;
调用TableMapReduceUtil的initTableMapperJob和initTableReducerJob设置Mapper和Reducer等信息;
提交作业;
![](http://dl2.iteye.com/upload/attachment/0107/0302/e1dcf004-8a6d-3200-8dfd-4cd2fa8d90ad.png)
例:
![](http://dl2.iteye.com/upload/attachment/0107/0307/c736af91-a501-3486-96c8-dd412d423e25.png)
HBase建表
参看:http://www.ylzx8.cn/yidongkaifa/android/192868.html
java:
HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);
HTableDescriptor t = new HTableDescriptor(tableName);
t.addFamily(new HColumnDescriptor(“f1″));
t.addFamily(new HColumnDescriptor(“f2″));
t.addFamily(new HColumnDescriptor(“f3″));
t.addFamily(new HColumnDescriptor(“f4″));
hAdmin.createTable(t);
HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);
if (hAdmin.tableExists(tableName)) {
hAdmin.disableTable(tableName);
hAdmin.deleteTable(tableName);
}