HBase Java API
目前HBase维护了两个版本:1.x和2.x,两个版本的Java API有些区别,同时你使用的客户端的版本必须与服务端版本保持一致,如果用 2.x 版本的客户端代码去连接 1.x 版本的服务端,会抛出 NoSuchColumnFamilyException 等异常。
API常用类
HBaseAdmin
关系: org.apache.hadoop.hbase.client.HBaseAdmin
作用:提供了一个接口来管理 HBase 数据库的表信息。它提供的方法包括:创建表,删 除表,列出表项,使表有效或无效,以及添加或删除表列族成员等。
HBaseConfiguration
关系: org.apache.hadoop.hbase.HBaseConfiguration
作用:对 HBase 进行配置
HTableDescriptor
关系: org.apache.hadoop.hbase.HTableDescriptor
作用:包含了表的名字极其对应表的列族
HColumnDescriptor
关系: org.apache.hadoop.hbase.HColumnDescriptor
作用:维护着关于列族的信息,例如版本号,压缩设置等。它通常在创建表或者为表添 加列族的时候使用。列族被创建后不能直接修改,只能通过删除然后重新创建的方式。
列族被删除的时候,列族里面的数据也会同时被删除。
HTable
关系: org.apache.hadoop.hbase.client.HTable
作用:可以用来和 HBase 表直接通信。此方法对于更新操作来说是非线程安全的。
Put
关系: org.apache.hadoop.hbase.client.Put
作用:用来对单个行执行添加操作
Get
关系: org.apache.hadoop.hbase.client.Get
作用:用来获取单个行的相关信息
Result
关系: org.apache.hadoop.hbase.client.Result
作用:存储 Get 或者 Scan 操作后获取表的单行值。使用此类提供的方法可以直接获取值 或者各种 Map 结构( key-value 对)
Java API 1.X基本使用
Maven依赖
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.4.1</version>
</dependency>
HBase连接类
先封装一个HBase连接类,用于获取连接、关闭连接
package com.shanchuan.hbase.api;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.log4j.Logger;
/**
* @Author: H.w
* @Date: 2021/1/20 上午10:17
* @Description: TODO HBase连接类
**/
public class HBaseUtils {
private static final Logger logger = Logger.getLogger(HBaseUtils.class);
private static Configuration configuration;
private static Connection connection;
// 设置HBase
static {
try {
if (configuration == null) {
configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.property.clientPort", "2181");
// 如果是集群 则主机名使用","隔开
configuration.set("hbase.zookeeper.quorum","localhost");
}
}catch (Exception e) {
logger.error("HBaseConfiguration Create field !");
}
}
/**
* TODO 获取连接
* @return
*/
public static Connection getConnection() {
if (connection==null || connection.isClosed()) {
try {
connection = ConnectionFactory.createConnection(configuration);
}catch (Exception e) {
logger.error(e);
}
}
return connection;
}
/**
* 关闭连接
*/
public static void closeConnection() {
if (connection != null) {
try {
connection.close();
}catch (Exception e) {
logger.error(e);
}
}
}
}
HBase操作类
package com.shanchuan.hbase.api;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.util.List;
/**
* @Author: H.w
* @Date: 2021/1/20 上午11:34
* @Description: TODO HBase操作类
**/
public class HBaseOperators {
private static final Logger logger = Logger.getLogger(HBaseOperators.class);
/**
* TODO 创建namespace(相当于数据库)
* @param connection
* @param name namespace名称
* @throws IOException
*/
public static void createNameSpace(Connection connection,String name) throws IOException {
HBaseAdmin admin = null;
try {
admin = (HBaseAdmin) connection.getAdmin();
NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(name).build();
admin.createNamespace(namespaceDescriptor);
}finally {
if (admin != null) {
admin.close();
}
}
}
/**
* TODO 删除namespace
* @param connection
* @param name namespace名称
* @throws IOException
*/
public static void deleteNameSpace(Connection connection, String name) throws IOException{
HBaseAdmin admin = null;
try {
admin = (HBaseAdmin) connection.getAdmin();
admin.deleteNamespace(name);
}finally {
if (admin != null) {
admin.close();
}
}
}
/**
* TODO 创建表
* @param connection
* @param tableName 表名
* @param columnFamilies 列族
*/
public static void createTable(Connection connection, String nameSpace,TableName tableName, List<String> columnFamilies) throws IOException {
HBaseAdmin admin = null;
try {
admin = (HBaseAdmin) connection.getAdmin();
//获取命名空间看是否存在,不存在会直接抛 NamespaceNotFoundException 异常(可以查看底层代码实现) 使用 try catch 捕捉
try {
NamespaceDescriptor namespaceDescriptor = admin.getNamespaceDescriptor(nameSpace);
}catch (NamespaceNotFoundException