Hbase API
环境准备
新建maven项目后在 pom.xml 中添加依赖:
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>2.4.11</version>
<exclusions>
<exclusion>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b06</version>
</dependency>
</dependencies>
单线程创建连接
运行,成功获取连接
多线程创建连接
在 resources 文件夹中创建配置文件 hbase-site.xml,添加以下内容
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop100,hadoop101,hadoop102</value>
</property>
</configuration>
注意映射和你的集群配置一致
丢给个main线程跑一下,记得调用关闭连接
DDL
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import java.io.IOException;
public class HbaseDDL {
//添加静态属性 connection 指向单例连接
public static Connection connection = HbaseConnect.connection;
/**
* 创建命名空间
*
* @param namespace 命名空间名称
*/
public static void createNamespace(String namespace) throws IOException {
//1.获取admin
// admin 的连接是轻量级的 不是线程安全的 不推荐池化或者缓存这个连接
Admin admin = connection.getAdmin();
//2.1 创建命名空间builder => 设计师
NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);
//2.2 给命名空间添加描述
builder.addConfiguration("user", "lbw");
//2.3 使用 builder 构造出对应的添加完参数的对象 完成创建
// 创建命名空间出现的问题 都属于方法本身的问题 不应该抛出
try {
admin.createNamespace(builder.build());
} catch (IOException e){
System.out.println("命名空间已经存在");
e.printStackTrace();
}
//3.关闭admin
admin.close();
}
public static void main(String[] args) throws IOException {
//测试创建命名空间
createNamespace("myNSpace");
//提示
System.out.println("命名空间创建过程已结束");
//关闭Hbase连接
HbaseConnect.closeConnection();
}
}
测试一下
在shell上查看命名空间是否成功被创建
可以看见之前添加的描述(无实际意义,可不添加)
加上判断表格是否存在的方法
public static boolean isTableExists(String namespace, String tableName) throws IOException {
//1.获取admin
Admin admin = connection.getAdmin();
//2.使用方法判断表格是否存在
boolean b = false;
try {
b = admin.tableExists(TableName.valueOf(namespace, tableName));
} catch (IOException e) {
e.printStackTrace();
}
//3.关闭admin
admin.close();
//3.返回结果
return b;
}
测试一下该方法,可以看见我的bigdata命名空间中是存在一张 student 表格的
判断是否存在结果为true
添加创建表格方法
public static void createTable(String namespace, String tableName, String... columnFamilies) throws IOException {
//判断是否至少有一个列族
if (columnFamilies.length == 0) {
System.out.println("创建表格至少有一个列族");
return;
}
//判断表格是否存在
if (isTableExists(namespace, tableName)) {
System.out.println("表格已经存在");
return;
}
//1.获取admin
Admin admin = connection.getAdmin();
//2.1创建表格描述的builder
TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));
//2.2添加参数
for (String columnFamily : columnFamilies) {
//2.3创建列族描述的builder
ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));
//2.4对应当前的列族添加参数
//添加版本参数
columnFamilyDescriptorBuilder.setMaxVersions(5);
//2.5 创建添加完参数的列族描述
tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());
}
//2.6创建对应的表格描述
try {
admin.createTable(tableDescriptorBuilder.build());
} catch (IOException e) {
e.printStackTrace();
}
//3.关闭admin
admin.close();
}
测试
创建成功
查看被创建的表格的详情(列族信息、版本数等)
添加修改表的方法
/**
* 修改表格中一个列族的版本数
*
* @param namespace 命名空间名称
* @param tableName 表格名称
* @param columnFamily 列族名称
* @param version 版本
*/
public static void modifyTable(String namespace, String tableName, String columnFamily, int version) throws IOException {
//判断表格是否存在
if (!isTableExists(namespace, tableName)) {
System.out.println("表格不存在无法修改");
return;
}
//1.获取admin
Admin admin = connection.getAdmin();
try {
//2.0 获取之前的表格描述
TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace, tableName));
//2.1 创建一个表格描述builder
//如果使用填写 tableName 的方法 相当于创建了一个新的表格描述builder 没有之前的的信息
//如果想要修改之前的信息 必须调用方法填写一格旧的表格描述
TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(descriptor);
//2.2 对应builder进行表格数据修改
ColumnFamilyDescriptor columnFamily1 = descriptor.getColumnFamily(Bytes.toBytes(columnFamily));
//创建列族描述builder
//需要填写旧的列族描述
ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(columnFamily1);
//修改对应的版本
columnFamilyDescriptorBuilder.setMaxVersions(version);
tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());
admin.modifyTable(tableDescriptorBuilder.build());
} catch (IOException e) {
e.printStackTrace();
}
//3.关闭admin
admin.close();
}
测试
VERSIONS 成功修改为2
添加删除表的方法
/**
* 删除表格
*
* @param namespace 命名空间名称
* @param tableName 表格名称
* @return true 表示删除成功
*/
public static boolean deleteTable(String namespace, String tableName) throws IOException {
//1.判断表格是否存在
if (!isTableExists(namespace, tableName)) {
System.out.println("表格不存在 无法删除");
return false;
}
//2.获取admin
Admin admin = connection.getAdmin();
//3.调用相关的方法删除表格
try {
// HBase 删除表格之前 一定要先标记表格为不可用
TableName tableName1 = TableName.valueOf(namespace, tableName);
admin.disableTable(tableName1);
admin.deleteTable(tableName1);
} catch (IOException e) {
e.printStackTrace();
}
//4.关闭admin
admin.close();
return true;
}
测试
order表删除成功
DDL完整版,需要什么功能调什么方法就行
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class HbaseDDL {
//添加静态属性 connection 指向单例连接
public static Connection connection = HbaseConnect.connection;
/**
* 创建命名空间
*
* @param namespace 命名空间名称
*/
public static void createNamespace(String namespace) throws IOException {
//1.获取admin
// admin 的连接是轻量级的 不是线程安全的 不推荐池化或者缓存这个连接
Admin admin = connection.getAdmin();
//2.1 创建命名空间builder => 设计师
NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);
//2.2 给命名空间添加描述
builder.addConfiguration("user", "lbw");
//2.3 使用 builder 构造出对应的添加完参数的对象 完成创建
// 创建命名空间出现的问题 都属于方法本身的问题 不应该抛出
try {
admin.createNamespace(builder.build());
} catch (IOException e) {
System.out.println("命名空间已经存在");
e.printStackTrace();
}
//3.关闭admin
admin.close();
}
/**
* 判断表格是否存在
*
* @param namespace 命名空间名称
* @param tableName 表格名称
* @return ture 表示存在
*/
public static boolean isTableExists(String namespace, String tableName) throws IOException {
//1.获取admin
Admin admin = connection.getAdmin();
//2.使用方法判断表格是否存在
boolean b = false;
try {
b = admin.tableExists(TableName.valueOf(namespace, tableName));
} catch (IOException e) {
e.printStackTrace();
}
//3.关闭admin
admin.close();
//3.返回结果
return b;
}
/**
* 创建表格
*
* @param namespace 命名空间名称
* @param tableName 表格名称
* @param columnFamilies 列族名称 可以有多个
*/
public static void createTable(String namespace, String tableName, String... columnFamilies) throws IOException {
//判断是否至少有一个列族
if (columnFamilies.length == 0) {
System.out.println("创建表格至少有一个列族");
return;
}
//判断表格是否存在
if (isTableExists(namespace, tableName)) {
System.out.println("表格已经存在");
return;
}
//1.获取admin
Admin admin = connection.getAdmin();
//2.1创建表格描述的builder
TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));
//2.2添加参数
for (String columnFamily : columnFamilies) {
//2.3创建列族描述的builder
ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));
//2.4对应当前的列族添加参数
//添加版本参数
columnFamilyDescriptorBuilder.setMaxVersions(5);
//2.5 创建添加完参数的列族描述
tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());
}
//2.6创建对应的表格描述
try {
admin.createTable(tableDescriptorBuilder.build());
} catch (IOException e) {
e.printStackTrace();
}
//3.关闭admin
admin.close();
}
/**
* 修改表格中一个列族的版本
*
* @param namespace 命名空间名称
* @param tableName 表格名称
* @param columnFamily 列族名称
* @param version 版本
*/
public static void modifyTable(String namespace, String tableName, String columnFamily, int version) throws IOException {
//判断表格是否存在
if (!isTableExists(namespace, tableName)) {
System.out.println("表格不存在无法修改");
return;
}
//1.获取admin
Admin admin = connection.getAdmin();
try {
//2.0 获取之前的表格描述
TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace, tableName));
//2.1 创建一个表格描述builder
//如果使用填写 tableName 的方法 相当于创建了一个新的表格描述builder 没有之前的的信息
//如果想要修改之前的信息 必须调用方法填写一格旧的表格描述
TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(descriptor);
//2.2 对应builder进行表格数据修改
ColumnFamilyDescriptor columnFamily1 = descriptor.getColumnFamily(Bytes.toBytes(columnFamily));
//创建列族描述builder
//需要填写旧的列族描述
ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(columnFamily1);
//修改对应的版本
columnFamilyDescriptorBuilder.setMaxVersions(version);
tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());
admin.modifyTable(tableDescriptorBuilder.build());
} catch (IOException e) {
e.printStackTrace();
}
//3.关闭admin
admin.close();
}
/**
* 删除表格
*
* @param namespace 命名空间名称
* @param tableName 表格名称
* @return true 表示删除成功
*/
public static boolean deleteTable(String namespace, String tableName) throws IOException {
//1.判断表格是否存在
if (!isTableExists(namespace, tableName)) {
System.out.println("表格不存在 无法删除");
return false;
}
//2.获取admin
Admin admin = connection.getAdmin();
//3.调用相关的方法删除表格
try {
// HBase 删除表格之前 一定要先标记表格为不可用
TableName tableName1 = TableName.valueOf(namespace, tableName);
admin.disableTable(tableName1);
admin.deleteTable(tableName1);
} catch (IOException e) {
e.printStackTrace();
}
//4.关闭admin
admin.close();
return true;
}
public static void main(String[] args) throws IOException {
//需要什么调用什么方法
//关闭连接
HbaseConnect.closeConnection();
}
}
DML
插入数据
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class HBaseDML {
//添加静态属性connection指向单例连接
public static Connection connection = HbaseConnect.connection;
/**
* 插入数据
*
* @param namespace 命名空间名称
* @param tableName 表格名称
* @param rowKey 主键
* @param columnFamily 列族名称
* @param columnName 列名
* @param value 值
*/
public static void putCell(String namespace, String tableName, String rowKey, String columnFamily, String columnName, String value) throws IOException {
//1.获取table
Table table = connection.getTable(TableName.valueOf(namespace, tableName));
//2. 调用相关方法插入数据
//2.1 创建put对象
Put put = new Put(Bytes.toBytes(rowKey));
//2.2 给put对象添加数据
put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName), Bytes.toBytes(value));
//2.3 给put对象添加数据
try {
table.put(put);
} catch (IOException e) {
e.printStackTrace();
}
//3.关闭table
table.close();
}
}
测试
数据插入成功
添加读取数据方法
``