hbase的java开发实例
文章目录
1:hbase的代码编写思路:
1、准备连接hbase集群的配置信息
zookeeper的位置
HBaseConfiguration
2、根据连接信息获取连接对象
Connection
3、根据连接对象获取操作对象
coon.get
有两大类:
DDL : Admin 负责表对象的创建删除
DML : Table 负责内容的增删改查
Admin 和Table 线程不安全,每个线程应该有自己的变量
4、根据你要做的操作,拿到操作对象,调用这个对象中的对应方法进行实际操作
admin.createTable()
table.
get(Get get)
put(Put put)
delete(Delete delete)
getScanner(Scan scan)
5、处理结果
重点关注:查询
get: Result(hbase表中的一条记录,是由这个记录rowkey中所管理的所有的key-value的集合)
scan: ResultScanner(这个对象,其实就是Result对象的一个集合)
一个key-value对象的抽象:
KeyValue、Cell
6、关闭连接,回收资源
**代码编写过程中,肯定会涉及到要去指定表的定义和列簇的定义**
create "student", "cf1", "cf2"
create "student", {NAME => "cf1", VERSION => 4}
admin.createTable(表定义,列簇定义)
表定义:HTableDescriptor
列簇定义: HColumnDescriptor(列簇和列)
2 开发准备
同样将集群的hdfs-site.xml和core-site.xml放到resource下
// 声明静态配置
public class hbaseUseJavaAPI {
//Jhbase的java开发实例介绍
// 声明静态配置
private static Configuration conf = null;
private static final String ZK_CONNECT_STR =
"hdp01:2181,hdp02:2181,hdp03:2181";
static {
conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", ZK_CONNECT_STR);
}
引入maven依赖
此处采用1.2版本的依赖,2.x系列依赖开发有一些不同
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.0</version>
</dependency>
2.1:初始化连接
一般采用单例模式或静态代码块创建唯一的Connection
private static Connection connection;
static {
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.property.clientPort", "2181");
// 如果是集群 则主机名用逗号分隔
configuration.set("hbase.zookeeper.quorum", "hadoop001");
try {
connection = ConnectionFactory.createConnection(configuration);
} catch (IOException e) {
e.printStackTrace();
}
}
2.2:创建表
shell命令:
创建一张 hbase 表,表名叫做 user,该表有 info 和 data 两个列簇
create 'user', 'info', 'data'
api开发和shell基本类似
public static void creatTable(String name, String[] family, Admin admin) {
//传递表名
TableName tableName = TableName.valueOf(name);
//创建表的描述对象,对列簇,操作
HTableDescriptor desc = new HTableDescriptor(tableName);
HColumnDescriptor columnDescriptor = null;
for (int i = 0; i < family.length; i++) {
//列簇的描述对象HColumnDescriptor:传递列簇
columnDescriptor = new HColumnDescriptor(family[i]);
//添加列簇
desc.addFamily(columnDescriptor);
//移除列簇
// desc.remove("result");
}
try {
if (admin.tableExists(tableName)) {
System.out.println("table Exists!");
// admin.close();
} else {
admin.createTable(desc);
System.out.println("create table Success!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
创建结果
结果:
create table Success!
hbase shell进入hbase数据库
list可查看到创建成功
2.3:put数据到hbase
shell命令:
put要指定rowkey
向 user 表中插入信息,row key 为 rk0001,列簇 info 中添加 name 列标示符,值为 zhangsan
put 'user', 'rk0001', 'info:name', 'zhangsan'
private static void put(String name, Connection connection) {
Table table = null;
TableName tableName = TableName.valueOf(name);
try {
table = connection.getTable(tableName);
} catch (Exception e) {
e.printStackTrace();
}
HashMap<String, Integer> map = new HashMap<>();
map.put("age", 15);
map.put("age", 18);
Iterator<String> iterator = map.keySet().iterator();
Put put = null;
while (iterator.hasNext()) {
String age = iterator.next();
Integer value = map.get(age);
//指定rowkey
put = new Put("001".getBytes());
//指定列簇,列,值
put.addColumn("info".getBytes(), age.getBytes(), value.toString().getBytes());
}
put.addColumn("info".getBytes(), "name".getBytes(), "dj".getBytes());
put.addColumn("info".getBytes(), "name".getBytes(), "xm".getBytes());
try {
table.put(put);
System.out.println("put message to hbase success");
} catch (IOException e) {
System.out.println("put message to hbase exception");
}
}
2.4:从hbase去get数据
shell命令
get必须指定rowkey
获取 user 表中 row key 为 rk0001,info 列簇的所有信息
get 'user', 'rk0001', 'info'
private static void get(String name, Connection connection) {
Table table = null;
Result result = null;
TableName tableName = TableName.valueOf(name);
try {
table = connection.getTable(tableName);
} catch (IOException e) {
e.printStackTrace();
}
//通过Get对象,指定rowkey,默认查询这个rowkey的所有数据
Get get = new Get(Bytes.toBytes("001"));
//限制只查询f1列族下面所有列的值
get.addFamily("info".getBytes());
//执行get查询,返回一个result对象,所有rowkey为001的单元格的所有信息都会都封装在这个对象中
try {
result = table.get(get);
} catch (IOException e) {
e.printStackTrace();
}
//将每个单元格的所有信息封装在cell对象内,再放入集合中
List<Cell> cells = result.listCells();
//遍历cells, 看cell中封装了哪些信息
System.out.println("get message from hbase");
for (Cell cell : cells) {
byte[] value = CellUtil.cloneValue(cell);//获取单元格的值
byte[] rowkey = CellUtil.cloneRow(cell);//获取单元格对应的rowkey
byte[] columnName = CellUtil.cloneQualifier(cell);//获取单元格所属的列名
byte[] familyName = CellUtil.cloneFamily(cell);//获取单元格所属的列族名
System.out.println("列簇: " + Bytes.toString(familyName));
System.out.println("列: " + Bytes.toString(columnName));
System.out.println("rowkey: " + Bytes.toString(rowkey));
System.out.println("值: " + Bytes.toString(value));
}
}
2.5:scan 扫描数据
shell:
查询表名为user_info表中列簇为base_info,rowkey的起始偏移范围是[baiyc_20150716_0003,
baiyc_20150716_0006)的数据
scan 'user_info', {COLUMNS => 'base_info', STARTROW => 'baiyc_20150716_0003', ENDROW =>
'baiyc_20150716_0006'}
private static void scan(String name, Connection connection) {
Table table = null;
TableName tableName = TableName.valueOf(name);
try {
table = connection.getTable(tableName);
} catch (IOException e) {
e.printStackTrace();
}
Scan scan = new Scan();//默认会全表扫描,所有下面要添加约束
ResultScanner scanner = null;
try {
//进行全表扫描
scanner = table.getScanner(scan);
} catch (IOException e) {
e.printStackTrace();
}
//遍历ResultScanner 得到每一条数据,每一条数据都是封装在result对象里面了
for (Result results : scanner) {
//每一条数据
List<Cell> cells = results.listCells();
System.out.println("scan 全表扫描");
for (Cell cell : cells) {
byte[] familyName = CellUtil.cloneFamily(cell);
byte[] qualifierName = CellUtil.cloneQualifier(cell);
byte[] rowkey = CellUtil.cloneRow(cell);
byte[] valueArr = CellUtil.cloneValue(cell);
/* if ("name".equals(Bytes.toString(qualifierName)) || "age".equals(Bytes.toString(qualifierName))) {
int value = Bytes.toInt(valueArr);
System.out.println(Bytes.toString(familyName) + "\t"
+ Bytes.toString(qualifierName) + "\t"
+ Bytes.toString(rowkey) + "\t"
+ value);
} else {*/
String value = Bytes.toString(valueArr);
System.out.println(Bytes.toString(familyName) + "\t"
+ Bytes.toString(qualifierName) + "\t"
+ Bytes.toString(rowkey) + "\t"
+ value);
}
}
}
2.6释放资源
private static void close(Connection connection, Admin admin) {
try {
connection.close();
admin.close();
} catch (IOException e) {
e.printStackTrace();
}
}