title: Hadoop-HbaseAPI
categories:
- hadoop
- hbaseAPI
tags: ‘-hbase - hbaseAPI’
abbrlink: 42b49db3
想看图片请去原网址搜索,之前写hexo博客没有添加图片库,都是本地,见谅!
一、环境搭建
1.2、添加Maven依赖
新建Maven项目后在pom.xml中添加依赖
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.3.5</version>
</dependency>
二、编写HBaseAPI
注意,这部分的学习内容,我们先学习使用老版本的API,接着再写出新版本的API调用方式。 因为在企业中,有些时候我们需要一些过时的API来提供更好的兼容性。
基本概念
java类 | 对应数据模型 |
---|---|
HBaseConfiguration | HBase配置类 |
HBaseAdmin | HBase管理Admin类 |
Table | HBase Table操作类 |
Put | HBase添加操作数据模型 |
Get | HBase单个查询操作数据模型 |
Scan | HBase Scan检索操作数据模型 |
Result | HBase单个查询的结果模型 |
ResultScanner | HBase检索结果模型 |
2.1、判断表是否存在
将重复的代码写到静态代码块方便调用
package com.lizhi.test;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import java.io.IOException;
/**
* DDL:
* 1、判断表是否存在
* 2、创建表
* 3、创建命名空间
* 4、删除表
*
* DDM:
* 5、插入数据
* 6、查数据(get)
* 7、查数据(scan)
* 8、删除数据
*
*/
public class testAPI {
private static Connection connection = null;
private static Admin admin = null;
static {
try {
//① 获取配置文件信息
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum","master");
configuration.set("hbase.zookeeper.property.clientPort", "2181");
//② 创建连接对象
connection = ConnectionFactory.createConnection(configuration);
//③ 创建admin对象
admin = connection.getAdmin();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void close(){
if (admin!=null){
try {
admin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 1、判断表是否存在
* @param
*/
public static boolean isTableExist(String tableNme) throws IOException {
//③ 判断表是否存在
boolean exists = admin.tableExists(TableName.valueOf(tableNme));
//④ 关闭连接
//admin.close();
//⑤ 返回结果
return exists;
}
public static void main(String[] args) throws IOException {
//1、测试表是否存在
System.out.println(isTableExist("student"));
//关闭资源
close();
}
}
2.2、创建表
/**
* 2、创建表
* @param
* @throws IOException
* 注: String... :是可变形参,由于列族可以有多个所以用可变形参
*/
public static void creatTable(String tableName,String... cfs) throws IOException {
//① 判断是否存在列族
if (cfs.length<=0){
System.out.println("请设置列族信息!");
return;
}
//② 判断表是否存在
if (isTableExist(tableName)){
System.out.println("表"+tableName+"已存在!");
return;
}
//③ 创建表描述器 TableName.valueOf(tableName)是获取表名
/**
* 代码逻辑:创建表需要admin对象,然后又发现admin对象需要创建列族描述器,添加列族信息,勿死记硬背
*/
HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
//④ 循环添加列族信息
for (String cf:cfs){
//⑤ 创建列族描述器
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
//⑥ 添加列族信息
hTableDescriptor.addFamily(hColumnDescriptor);
}
//⑦ 创建表
admin.createTable(hTableDescriptor);
}
测试
public static void main(String[] args) throws IOException {
//1、测试表是否存在
System.out.println(isTableExist("student"));
//2、创建表 "0408:stu"在0408命名空间创建表
creatTable("stu","info1","info2");
System.out.println(isTableExist("stu"));
//关闭资源
close();
}
2.3、删除表
/**
* 3、删除表
* @param
* @throws IOException
*/
public static void dropTable(String tableName) throws IOException {
//① 判断表是否存在
if (!isTableExist(tableName)){
System.out.println("表"+tableName+"不存在!");
return;
}
//② 使表下线
admin.disableTable(TableName.valueOf(tableName));
//③ 删除表
admin.deleteTable(TableName.valueOf(tableName));
}
测试
public static void main(String[] args) throws IOException {
//1、测试表是否存在
System.out.println(isTableExist("stu"));
//2、创建表 "0408:stu"在0408命名空间创建表
creatTable("stu","info1","info2");
System.out.println(isTableExist("stu"));
//3、删除表
dropTable("stu");
System.out.println(isTableExist("stu"));
//关闭资源
close();
}
2.4、创建命名空间
/**
* 4、创建命名空间
* @param
* @throws IOException
* NamespaceExistException这个异常是已存在是抛出的,复制就行了
*/
public static void creatNameSpace(String ns){
//① 创建命名空间描述器
NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(ns).build();
//② 创建命名空间
try {
admin.createNamespace(namespaceDescriptor);
}catch (NamespaceExistException e){
System.out.println(ns+"命名空间已存在!");
} catch (IOException e) {
e.printStackTrace();
}
}
测试
public static void main(String[] args) throws IOException {
//1、测试表是否存在
System.out.println(isTableExist("stu"));
//2、创建表 "0408:stu"在0408命名空间创建表
creatTable("0408:stu","info1","info2");
System.out.println(isTableExist("stu"));
//3、删除表
dropTable("stu");
System.out.println(isTableExist("stu"));
//4、创建命名空间
creatNameSpace("0408");
//关闭资源
close();
}
2.5、向表插入数据
/**
* 5、向表插入数据
* @param
* @throws IOException
*/
public static void putData(String tableName,String rowKey,String columnFamily,String column,String value) throws IOException {
//① 获取表对象
Table table = connection.getTable(TableName.valueOf(tableName));
//② 创建put对象 Bytes是Hbase下的一个util
Put put = new Put(Bytes.toBytes(rowKey));
//③ 向put数组中装入对象
put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column),Bytes.toBytes(value));
//④ 插入数据
table.put(put);
//⑤ 关闭资源
table.close();
}
测试
public static void main(String[] args) throws IOException {
//5、向表中插入数据
putData("student","1005","info","name","zhangsan");
//关闭资源
close();
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ipHzJ3D9-1577328660495)(Hadoop-HbaseAPI/251.png)]
2.6、获取数据(get)
/**
* 6、获取数据(get)
* @param
* @throws IOException
*/
public static void getData(String tableName,String rowKey,String columnFamily,String column) throws IOException {
//① 获取表对象
Table table = connection.getTable(TableName.valueOf(tableName));
//② 创建Get对象
Get get = new Get(Bytes.toBytes(rowKey));
//2.1 指定获取的列族
// get.addFamily(Bytes.toBytes(columnFamily));
//2.2 指定列族和列
get.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column));
//2.3 指定获取的版本
get.setMaxVersions();
//③ 获取数据 Result集合
Result result = table.get(get);
//④ 解析result并打印
for (Cell cell : result.rawCells()) {
//⑤ 打印数据
System.out.println("columnFamily:"+Bytes.toString(CellUtil.cloneFamily(cell))+
", column:"+Bytes.toString(CellUtil.cloneQualifier(cell))+
", value:"+Bytes.toString(CellUtil.cloneValue(cell)));
}
//⑥ 关闭表连接
table.close();
}
测试
public static void main(String[] args) throws IOException {
//6、获取单行数据
getData("student","1001","info","name");
}
2.7、扫描全表
/**
* 7、获取数据(扫描全表)
* @param
* @throws IOException
*/
public static void scanTable(String tableName) throws IOException {
//① 获取表对象
Table table = connection.getTable(TableName.valueOf(tableName));
//② 构建scan对象 (这里可以指定获取的rowKey,左闭右开)
Scan scan = new Scan(Bytes.toBytes("1001"),Bytes.toBytes("1003" ));
//③ 扫描表
ResultScanner results = table.getScanner(scan);
//④ 解析results
for (Result result : results) {
//⑤ 解析result并打印
for (Cell cell : result.rawCells()) {
//⑥ 打印数据
System.out.println("rowKey:"+Bytes.toString(CellUtil.cloneRow(cell))+
", columnFamily:"+Bytes.toString(CellUtil.cloneFamily(cell))+
", column:"+Bytes.toString(CellUtil.cloneQualifier(cell))+
", value:"+Bytes.toString(CellUtil.cloneValue(cell)));
}
}
//⑦ 关闭表连接
table.close();
}
测试
public static void main(String[] args) throws IOException {
//7、获取数据(扫描全表)
scanTable("student1");
//关闭资源
close();
}
运行结果
log4j:WARN No appenders could be found for logger (org.apache.hadoop.security.Groups).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
rowKey:1001, columnFamily:info, column:age, value:16
rowKey:1001, columnFamily:info, column:name, value:sunliu
rowKey:1001, columnFamily:info, column:sex, value:man
rowKey:1002, columnFamily:info, column:age, value:18
rowKey:1002, columnFamily:info, column:name, value:lucy
rowKey:1002, columnFamily:info, column:sex, value:female
进程已结束,退出代码 0
2.8、数据删除
数据的删除在Hbase中是一个比较麻烦的问题,因为涉及到版本和内存刷新的问题,因此要多注意
/**
* 8、删除数据
* @param
* @throws IOException
*/
public static void deleteTable(String tableName,String rowKey,String columnFamily,String column) throws IOException {
//① 获取表对象
Table table = connection.getTable(TableName.valueOf(tableName));
//② 构建删除对象
Delete delete = new Delete(Bytes.toBytes(rowKey));
//2.1设置删除的列
/* 这是删除一个版本的数据
delete.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column));*/
//不指定时间戳就会删除所有版本的数据,不建议用addColumn
// 也可以删除指定的时间戳timestamp=1575080075098,报错,对于int类型来说数值太大,改成timestamp=1575080075098L
//delete.addColumns(Bytes.toBytes(columnFamily),Bytes.toBytes(column));
//2.2删除指定的列族
delete.addFamily(Bytes.toBytes(columnFamily));
//③ 执行删除操作
table.delete(delete);
//④ 关闭连接
table.close();
}
测试
public static void main(String[] args) throws IOException {
//8、测试删除
deleteTable("student1","1005","info","name");
//关闭资源
close();
}
三、报错信息
java.io.IOException: Failed to get result within timeout, timeout=60000ms
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CbKx5a3k-1577328660497)(Hadoop-HbaseAPI/3-1.png)]
解决办法;将虚拟机的IP地址写到C:\Windows\System32\drivers\etc\hosts文件里就可以了
四、HbaseAPI测试实例源码
package com.lizhi.test;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* DDL:
* 1、判断表是否存在
* 2、创建表
* 3、创建命名空间
* 4、删除表
*
* DDM:
* 5、插入数据
* 6、查数据(get)
* 7、查数据(scan)
* 8、删除数据
*
*/
public class testAPI {
private static Connection connection = null;
private static Admin admin = null;
public static Configuration configuration =null;
static {
try {
//① 获取配置文件信息
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum","master");
configuration.set("hbase.zookeeper.property.clientPort", "2181");
//② 创建连接对象
connection = ConnectionFactory.createConnection(configuration);
//③ 创建admin对象
admin = connection.getAdmin();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void close(){
if (admin!=null){
try {
admin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 1、判断表是否存在
* @param
*/
public static boolean isTableExist(String tableNme) throws IOException {
/* //① 获取配置文件信息
//HBaseConfiguration configuration = new HBaseConfiguration();//(过时的方法)
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum","master");
configuration.set("hbase.zookeeper.property.clientPort", "2181");
//② 获取管理员对象
//HBaseAdmin admin = new HBaseAdmin(configuration);//(过时的方法)
Connection connection = ConnectionFactory.createConnection(configuration);
Admin admin = connection.getAdmin();*/
//③ 判断表是否存在 TableName.valueOf(tableName)是获取表名
boolean exists = admin.tableExists(TableName.valueOf(tableNme));
//④ 关闭连接
//admin.close();
//⑤ 返回结果
return exists;
}
/**
* 2、创建表
* @param
* @throws IOException
* 注: String... :是可变形参,由于列族可以有多个所以用可变形参
*/
public static void creatTable(String tableName,String... cfs) throws IOException {
//① 判断是否存在列族
if (cfs.length<=0){
System.out.println("请设置列族信息!");
return;
}
//② 判断表是否存在
if (isTableExist(tableName)){
System.out.println("表"+tableName+"已存在!");
return;
}
//③ 创建表描述器 TableName.valueOf(tableName)是获取表名
/**
* 代码逻辑:创建表需要admin对象,然后又发现admin对象需要创建列族描述器,添加列族信息,勿死记硬背
*/
HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
//④ 循环添加列族信息
for (String cf:cfs){
//⑤ 创建列族描述器
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
//⑥ 添加列族信息
hTableDescriptor.addFamily(hColumnDescriptor);
}
//⑦ 创建表
admin.createTable(hTableDescriptor);
}
/**
* 3、删除表
* @param
* @throws IOException
*/
public static void dropTable(String tableName) throws IOException {
//① 判断表是否存在
if (!isTableExist(tableName)){
System.out.println("表"+tableName+"不存在!");
return;
}
//② 使表下线
admin.disableTable(TableName.valueOf(tableName));
//③ 删除表
admin.deleteTable(TableName.valueOf(tableName));
System.out.println("表"+tableName+"已成功删除!");
}
/**
* 4、创建命名空间
* @param
* @throws IOException
* NamespaceExistException这个异常是已存在是抛出的,复制就行了
*/
public static void creatNameSpace(String ns){
//① 创建命名空间描述器
NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(ns).build();
//② 创建命名空间
try {
admin.createNamespace(namespaceDescriptor);
}catch (NamespaceExistException e){
System.out.println(ns+"命名空间已存在!");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 5、向表插入数据
* @param
* @throws IOException
*/
public static void putData(String tableName,String rowKey,String columnFamily,String column,String value) throws IOException {
//① 获取表对象
Table table = connection.getTable(TableName.valueOf(tableName));
//② 创建put对象 Bytes是Hbase下的一个util
Put put = new Put(Bytes.toBytes(rowKey));
//③ 向put数组中装入对象
put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column),Bytes.toBytes(value));
//④ 插入数据
table.put(put);
//⑤ 关闭资源
table.close();
System.out.println("插入数据成功!");
}
/**
* 6、获取数据(get)
* @param
* @throws IOException
*/
public static void getData(String tableName,String rowKey,String columnFamily,String column) throws IOException {
//① 获取表对象
Table table = connection.getTable(TableName.valueOf(tableName));
//② 创建Get对象
Get get = new Get(Bytes.toBytes(rowKey));
//2.1 指定获取的列族
// get.addFamily(Bytes.toBytes(columnFamily));
//2.2 指定列族和列
get.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column));
//2.3 指定获取的版本
get.setMaxVersions();
//③ 获取数据 Result集合
Result result = table.get(get);
//④ 解析result并打印
for (Cell cell : result.rawCells()) {
//⑤ 打印数据
System.out.println("columnFamily:"+Bytes.toString(CellUtil.cloneFamily(cell))+
", column:"+Bytes.toString(CellUtil.cloneQualifier(cell))+
", value:"+Bytes.toString(CellUtil.cloneValue(cell)));
}
//⑥ 关闭表连接
table.close();
}
/**
* 7、获取数据(扫描全表)
* @param
* @throws IOException
*/
public static void scanTable(String tableName) throws IOException {
//① 获取表对象
Table table = connection.getTable(TableName.valueOf(tableName));
//② 构建scan对象 (这里可以指定获取的rowKey,左闭右开)
Scan scan = new Scan(Bytes.toBytes("1001"),Bytes.toBytes("1003" ));
//③ 扫描表
ResultScanner results = table.getScanner(scan);
//④ 解析results
for (Result result : results) {
//⑤ 解析result并打印
for (Cell cell : result.rawCells()) {
//⑥ 打印数据
System.out.println("rowKey:"+Bytes.toString(CellUtil.cloneRow(cell))+
", columnFamily:"+Bytes.toString(CellUtil.cloneFamily(cell))+
", column:"+Bytes.toString(CellUtil.cloneQualifier(cell))+
", value:"+Bytes.toString(CellUtil.cloneValue(cell)));
}
}
//⑦ 关闭表连接
table.close();
}
/**
* 8、删除数据
* @param
* @throws IOException
*/
public static void deleteTable(String tableName,String rowKey,String columnFamily,String column) throws IOException {
//① 获取表对象
Table table = connection.getTable(TableName.valueOf(tableName));
//② 构建删除对象
Delete delete = new Delete(Bytes.toBytes(rowKey));
//2.1设置删除的列
/* 这是删除一个版本的数据
delete.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column));*/
//不指定时间戳就会删除所有版本的数据,不建议用addColumn
// 也可以删除指定的时间戳timestamp=1575080075098,报错,对于int类型来说数值太大,改成timestamp=1575080075098L
//delete.addColumns(Bytes.toBytes(columnFamily),Bytes.toBytes(column));
//2.2删除指定的列族
delete.addFamily(Bytes.toBytes(columnFamily));
//③ 执行删除操作
table.delete(delete);
//④ 关闭连接
table.close();
}
public static void main(String[] args) throws IOException {
/* //1、测试表是否存在
System.out.println(isTableExist("stu"));
//2、创建表 "0408:stu"在0408命名空间创建表
creatTable("0408:stu","info1","info2");
System.out.println(isTableExist("stu"));
//3、删除表
dropTable("stu");
System.out.println(isTableExist("stu"));
//4、创建命名空间
creatNameSpace("0408");
//5、向表中插入数据
putData("student","1005","info","name","zhangsan");
//6、获取单行数据
getData("student","1001","info","name");
//7、获取数据(扫描全表)
scanTable("student1");
*/
//8、测试删除
deleteTable("student1","1005","info","name");
//关闭资源
close();
}
}
pom.xml
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>