前期
windows配置好jdk(1.8以上)、hadoop的环境变量
已搭建好高可用的集群
API操作
参照源码:
准备
/* 日志的笔 */
protected Logger logger = LogManager.getLogger() ;
/* 这个对象是玩hbase特别重要的 */
protected HBaseAdmin hBaseAdmin ;
//客户端的连接
protected Connection connection ;
/* 数据库 */
private String nameSpace = "java" ;
/* 表名 */
private String tableName = "java:myTest";
/* 列族 */
private String cf = "cf" ;
/**
* 初始化的方法
*/
@Before
public void init()
{
/* 告诉Hbase,你的Hadoop搁哪了 */
//本地windows的hadoop的路径
System.setProperty("hadoop.home.dir", "E:\\帮助文档\\大数据\\hadoop-3.2.1");
/* 创建一个配置文件对象 */
Configuration conf = HBaseConfiguration.create();
/* 在hbase里面有一个配置文件hbase-site.xml(忽略)
* 这个对应 是hbase-site.xml里面的内容
* 键就是property-->name
* 值就是property-->value
* 您可以一个一个的设置进去
*
* */
//conf.set(name, value);
conf.set("hbase.zookeeper.quorum", "node7-1:2181,node7-2:2181,node7-3:2181");
try
{
/* 获取一个Connection对象 */
connection = ConnectionFactory.createConnection(conf);
/* 通过connection获取到一个HbaseAdmin */
hBaseAdmin = (HBaseAdmin) connection.getAdmin() ;
this.logger.info("==init==hBaseAdmin:{}",hBaseAdmin);
} catch (IOException e)
{
this.logger.error("创建对象时失败了,",e);
}
}
关流
/**
* 销毁的方法
*/
@After
public void close()
{
this.logger.info("==close=={}");
try
{
if(this.hBaseAdmin != null)
{
this.hBaseAdmin.close();
this.hBaseAdmin = null ;
}
} catch (IOException e)
{
this.logger.error("关闭时失败了,",e);
}
try
{
if(this.connection != null)
{
this.connection.close();
this.connection = null ;
}
} catch (IOException e)
{
this.logger.error("关闭时失败了,",e);
}
// this.logger.info("==close=={}" , this.connection.isClosed());
}
测试
/**
* 执行的目标方法
*/
@Test
public void test()
{
try
{
/* list:列出所有的表的表名 */
TableName[] tables = this.hBaseAdmin.listTableNames() ;
for (int i = 0; i < tables.length; i++)
{
TableName tableNameTemp = tables[i];
this.logger.info("==test==计数:{},名字:{}",i,tableNameTemp);
}
} catch (IOException e)
{
this.logger.error("测试出错了",e);
}
}
}
常用的方法
列举hbase的namespace
@Test
public void nameSpace_list()
{
/* list_namespace */
try
{
//通过hBaseAdmin获取listNamespaceDescriptors
NamespaceDescriptor[] namespaceDescriptors = this.hBaseAdmin.listNamespaceDescriptors();
//遍历
for (int i = 0; i < namespaceDescriptors.length; i++)
{
NamespaceDescriptor namespaceDescriptor = namespaceDescriptors[i];
String name = namespaceDescriptor.getName();
this.logger.info("==nameSpace_list==计数:{},名字:{}",i,name);
}
} catch (IOException e)
{
this.logger.error("报错了",e);
}
}
心得:最开始的操作都始于hBaseAdmin,无论是创表,创namespace,在进行这最开始的操作之后,后面的操作基本就是建命,见名知意,在this.hBaseAdmin.listNamespaceDescriptors(),其中括号并无参数,就可接着往下走。
创建hbase的namespace
/**
* create_namespace ''
*/
@Test
public void nameSpace_create()
{
try
{
NamespaceDescriptor descriptor = NamespaceDescriptor.create(nameSpace).build();
/* create_namespace '' */
this.hBaseAdmin.createNamespace(descriptor);
this.logger.info("==createNamespace==");
} catch (IOException e)
{
this.logger.error("报错了",e);
}
}
心得:this.hBaseAdmin.createNamespace(descriptor);,发现缺少一个(NamespaceDescriptor descriptor),这时需要创建一个NamespaceDescriptor,后面的操作,见名知意
创建表
/**
* table创建 ''
* create 'namespace:表名',列族'
*/
@Test
public void table_create()
{
try
{
/* 表的名字 */
TableName tableNameObj = TableName.valueOf(tableName);
/* 表的描述信息 */
TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableNameObj);
/* 列族的描述信息 */
ColumnFamilyDescriptor familyDescriptor = ColumnFamilyDescriptorBuilder.of(cf);
/* 添加列族;单个列族 */
builder.setColumnFamily(familyDescriptor);
/* 获取表的描述信息 */
TableDescriptor desc = builder.build() ;
if(this.hBaseAdmin.tableExists(tableNameObj))
{
/* 表存在 */
/* 禁用表 */
this.hBaseAdmin.disableTable(tableNameObj);
/* 删除表 */
this.hBaseAdmin.deleteTable(tableNameObj);
}
/* create_namespace '' */
this.hBaseAdmin.createTable(desc);
this.logger.info("==table_create==");
} catch (IOException e)
{
this.logger.error("报错了",e);
}
}
心得:1.hBaseAdmin.createTable(desc);,缺少TableDescriptor desc。
2. TableDescriptor desc =TableDescriptorBuilder.newBuilder(tableNameObj).build() ,发现缺少TableName name。
3.TableName tableNameObj = TableName.valueOf(tableName);,发现参数是:TableName name
4.TableName tableNameObj = TableName.valueOf(tableName);
5.builder.setColumnFamily(familyDescriptor);,缺少ColumnFamilyDescriptor family。
6.ColumnFamilyDescriptor familyDescriptor = ColumnFamilyDescriptorBuilder.of(cf);
列举表
/**
* 查看表
* list
*/
@Test
public void table_list()
{
try
{
/* list:列出所有的表 */
TableName[] tables = this.hBaseAdmin.listTableNames() ;
for (int i = 0; i < tables.length; i++)
{
TableName tableNameTemp = tables[i];
this.logger.info("==test==计数:{},名字:{}",i,tableNameTemp);
}
} catch (IOException e)
{
this.logger.error("测试出错了",e);
}
}
在表中添加数据
/**
* put '表名','rowKey','列族的属性','值'
*/
@Test
public void table_put()
{
try
{
/* 表的描述信息 */
TableName tableNameObj = TableName.valueOf(tableName);
/* 获取到表对象 */
Table table = this.connection.getTable(tableNameObj);
/* 获取表名字 */
this.logger.info("name:{}",table.getName().getNameAsString());
/* 行键(键) */
String rowKey = "02" ;
/* 插入数据的对象 */
Put put = new Put(rowKey.getBytes("UTF-8"));
/* 列族的属性
* 参数1:列族
* 参数2:属性
* 参数3:值
* */
put.addColumn(this.cf.getBytes("UTF-8"), "name".getBytes("UTF-8"), "lisi".getBytes("UTF-8"));
put.addColumn(this.cf.getBytes("UTF-8"), "age".getBytes("UTF-8"), "20".getBytes("UTF-8"));
put.addColumn(this.cf.getBytes("UTF-8"), "createTime".getBytes("UTF-8"), "2019-11-11 11:11:11".getBytes("UTF-8"));
/* 添加数据
* 参数如果是Put,那就是单条操作,
* 参数如果是List,那就是海量操作(批处理);
* */
table.put(put);
this.logger.info("执行完毕");
} catch (IOException e)
{
this.logger.error("测试出错了",e);
}
}
获取表中的数据(get)
/**
* get '表名','rowKey'
*/
@Test
public void table_get()
{
try
{
/* 表的描述信息 */
TableName tableNameObj = TableName.valueOf(tableName);
/* 获取到表对象 */
Table table = this.connection.getTable(tableNameObj);
/* 获取表名字 */
this.logger.info("name:{}",table.getName().getNameAsString());
/* 行键(键) */
String rowKey = "02" ;
/* 条件,rowKey */
Get get = new Get(rowKey.getBytes("UTF-8"));
/* 根据rowKey查询数据
* */
Result result = table.get(get);
/* 取单个 */
byte[] valueByte = result.getValue(cf.getBytes("UTF-8"), "name".getBytes("UTF-8"));
this.logger.info("根据键,取单个列:{}",new String(valueByte,"UTF-8"));
/* 获取最新的值 */
Cell lastCell = result.getColumnLatestCell(cf.getBytes("UTF-8"), "name".getBytes("UTF-8"));
byte[] lastCells = lastCell.getValueArray() ;
this.logger.info("根据键,取单个列:{}",new String(lastCells,"UTF-8"));
} catch (IOException e)
{
this.logger.error("测试出错了",e);
}
}
获取表中的数据(scan)
/**
* scan '表名'
*/
@Test
public void table_scan()
{
try
{
/* 表的描述信息 */
TableName tableNameObj = TableName.valueOf(tableName);
/* 获取到表对象 */
Table table = this.connection.getTable(tableNameObj);
/* 获取表名字 */
this.logger.info("name:{}",table.getName().getNameAsString());
/* 获取所有数据 */
Scan scan = new Scan();
/* 扫描整张表 */
ResultScanner resultScan = table.getScanner(scan);
for (Iterator iterator = resultScan.iterator(); iterator.hasNext();)
{
Result result = (Result) iterator.next();
/* 取单个 */
byte[] nameByte = result.getValue(cf.getBytes("UTF-8"), "name".getBytes("UTF-8"));
this.logger.info("根据键,取单个列:{}",new String(nameByte,"UTF-8"));
byte[] ageByte = result.getValue(cf.getBytes("UTF-8"), "age".getBytes("UTF-8"));
this.logger.info("根据键,取单个列:{}",new String(ageByte,"UTF-8"));
byte[] createTimeByte = result.getValue(cf.getBytes("UTF-8"), "createTime".getBytes("UTF-8"));
this.logger.info("根据键,取单个列:{}",new String(createTimeByte,"UTF-8"));
}
} catch (IOException e)
{
this.logger.error("测试出错了",e);
}
}
}