文章目录
- HBase常用的Java API
- org.apache.hadoop.hbase.HBaseConfiguration
- org.apache.hadoop.hbase.client.Admin
- org.apache.hadoop.hbase.client.Table
- org.apache.hadoop.hbase.HTableDescriptor
- org.apache.hadoop.hbase.HColumnDescriptor
- org.apache.hadoop.hbase.client.Put
- org.apache.hadoop.hbase.client.Get
- org.apache.hadoop.hbase.client.Result
- org.apache.hadoop.hbase.ResultScanner
- org.apache.hadoop.hbase.client.Scan
- Java操作HBase的编程实例
HBase常用的Java API
在开始编程之前,我们先来了解一下HBase的一些Java API,与HBase数据存储管理相关的java API主要包括:HBaseConfiguration、Admin、HTableDescriptor、HColumnDescriptor、Put、Get、ResultScanner、Result、Scan。
org.apache.hadoop.hbase.HBaseConfiguration
该类用于管理HBase的配置信息,下面是一些其中的常用方法:
- Configuration create():使用默认的HBase配置文件创建Configuration
- Configuration addHbaseResources(Configuration conf):向当前Configuration添加conf中的配置信息
- Void merge(Configuration destConf, Configuration srcConf):合并个Configuration
org.apache.hadoop.hbase.client.Admin
Admin为Java 接口类型,不可直接用该接口实例化一个对象,而是必须调用Connect.getAdmin()方法返回一个Admin子对象,然后操作里面的对象方法。该接口用于管理HBase数据库的表信息,包括创建表、删除表、列出表项、使表有效或无效、添加或删除表的列族成员、检查HBase的运行状态等。下面是一些其中的常用方法:
- void addColumn(TableName tableName, ColumnFamilyDescriptor columnFamily):向一个已存在的表中添加列
- void closeRegion(String regionname, String serverName):关闭Resign
- void createTable(TableDescriptor desc):创建表
- void disableTable(TableName tableName):使表无效
- void deleteTable(TableName tableName):删除表
- void enableTable(TableName tableName):使表有效
- Boolean tableExists(TableName tableName):检查表是否存在
- HTableDescriptor[] listTables():列出所有表
- void abort(String why, Throwable e):终止服务器或客户端
- Boolean balancer():负载均衡,返回True或False
org.apache.hadoop.hbase.client.Table
Table为Java 接口类型,不可直接用该接口实例化一个对象,而是必须调用Connect.getTable()方法返回一个Admin子对象,然后操作里面的对象方法。下面是一些其中的常用方法:
- void close():释放所有资源
- void delete(Delete delete):删除指定的单元格或行
- Boolean exists(Get get):检查Get对象指定的列是否存在
- Result get(Get get):从指定行的单元格中取得相应的值
- Void put(Put put):向表中添加值
- ResultScanner getScanner(byte[] family) || ResultScanner getScanner(byte[] family, byte[] qualifier) || ResultScanner getScanner(Scan scan):获得ResultScanner 实例
- HTableDescriptor getTableDescriptor():获得当前表格的HTableDescriptor对象
- TableName getName():获取当前表名
org.apache.hadoop.hbase.HTableDescriptor
HTableDescriptor包含了HBase中表格的详细信息,如表的列族、表类型、该表是否可读、MemStore的最大空间、Region什么时候应该分裂等信息。下面是一些其中的常用方法:
- HTableDescriptor addFamily(HColumnDescriptor family):添加列族
- Collection getFamilies():返回所有列族的名称
- TableName getTableName():返回表名实例
- Byte[] getValue(Bytes key):获得属性值
- HTableDescriptor removeFamily(byte[] column):删除列族
- HTableDescriptor setValue(byte[] key, byte[] value):设置属性的值
org.apache.hadoop.hbase.HColumnDescriptor
包含了列族的详细信息,通常在添加列族或创建表时使用。列族一旦建立就不能修改,只能通过删除列族,然后创建新的列族来间接修改。一旦列族被删除,该列族包含的数据也随之删除。下面是一些其中的常用方法:
- Byte[] getName():获得列族名称
- Byte[] getValue(byte[] key):获得某列单元格的值
- HColumnDescriptor setValue(byte[] key, byte[] value):设置某列单元格的值
org.apache.hadoop.hbase.client.Put
用于对单元格执行添加数据。下面是一些其中的常用方法:
- Put addColumn(byte[] family, byte[] qualifier, byte[] value):将指定的列族、列、值添加到Put对象中
- List get(byte[] family, byte[] qualifier):获取列族和列中的所有单元格
- Boolean has(byte[] family, byte[] qualifier):列族和列是否存在
- Boolean has(byte[] family, byte[] qualifier, byte[] value):检查列族和列中是否存在value
org.apache.hadoop.hbase.client.Get
用来获取单行的信息。下面是一些其中的常用方法:
- Get addColumn(byte[] family, byte[] qualifier):根据列族和列获取对应的列
- Get setFilter(Filter filter):通过设置过滤器获取具体的列
org.apache.hadoop.hbase.client.Result
用于存放Get或Put操作后的结果,并以<key,value>的格式存放在map结构中。下面是一些其中的常用方法:
- Boolean containsColumn(byte[] family, byte[] qualifier):检查是否包含列族和列限定符指定的列
- List getColumnCells(byte[] family, byte[] qualifier):获得列族和列限定符指定的列中的所有单元格
- NavigableMap<byte[],byte[]> getFamilyMap(byte[] family):根据列族获得包含列和值的所有行的键值对
- Byte[] getValue(byte[] family, byte[] qualifier):获得列族和列指定的单元格的最新值
org.apache.hadoop.hbase.ResultScanner
客户端获取值的接口。下面是一些其中的常用方法:
- Void close():关闭scanner并释放资源
- Result next():获得下一个Result实例
org.apache.hadoop.hbase.client.Scan
可以利用Scan限定需要查找的数据,如限定版本号、起始行号、终止行号、列族、列名、返回值数量上限等。下面是一些其中的常用方法:
- Scan addFamily(byte[] family):限定列族
- public Scan addColumn(byte[] family, byte[] qualifier):限定列族和列
- public Scan setMaxVersions() || public Scan setMaxVersions(int maxVersions):限定版本的最大个数,如果不带参数调用setMaxVersions(),表示取所有的版本,如果不调用 setMaxVersions(),只会取到最新的版本
- public Scan setTimeRange(long minStamp, long maxStamp):限定最大最小时间戳范围
- public Scan setFilter(Filter filter):指定Fileter过滤
- public Scan setStartRow(byte[] startRow):限定开始的行
- public Scan setStopRow(byte[] stopRow):限定结束的行(不包含)
- public Scan setBatch(int batch):限定最多返回的单元格数目
Java操作HBase的编程实例
在编程之前极其重要的一步,就是在使用Java API远程连接HBase时,需要在远程Java API的客户端主机上配置hosts,原因看下图
下面来结合上面介绍的HBase的Java API,走一个HBase的编程实例,该编程实例创建一个学生信息表student,用来存储学生姓名及考试成绩(学生姓名作为行键,假设学生姓名不会出现重复,考试成绩是一个列族,分别存储了各个科目的考试成绩)。
创立一个Java项目,引入依赖的Jar包(HBase安装目录下的lib目录下的所有jar包和HBase安装目录下的lib目录下的client-facing-thirdparty目录下的所有jar包)。这里采用的是导包的方式创建java工程,如果不想导包的话,可以在maven工程的pom.xml里加入如下依赖(所依赖的jar包要和自己安装的HBase版本对应):
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.1.0</version>
</dependency>
Java代码如下
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;
public class ExampleForHBase {
//管理HBase的配置信息
public static Configuration configuration;
//管理与HBase的连接
public static Connection connection;
//管理HBase数据库的表信息
public static Admin admin;
//主函数
public static void main(String[] args)throws IOException{
init();
createTable("student",new String[]{"score"});
insertData("student","zhangsan","score","English","69");
insertData("student","zhangsan","score","Math","86");
insertData("student","zhangsan","score","Computer","77");
getData("student", "zhangsan", "score","English");
close();
}
//与HBase连接
public static void init(){
configuration = HBaseConfiguration.create();
configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");
try{
connection = ConnectionFactory.createConnection(configuration);
admin = connection.getAdmin();
}catch (IOException e){
e.printStackTrace();
}
}
//断开连接,先断掉admin,再断开connect
public static void close(){
try{
if(admin != null){
admin.close();
}
if(null != connection){
connection.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
//创建表,传入表名myTableName和列族名colFamily
public static void createTable(String myTableName,String[] colFamily) throws IOException {
//设置表名
TableName tableName = TableName.valueOf(myTableName);
//判断表是否存在,如果不存在则创建
if(admin.tableExists(tableName)){
System.out.println("talbe is exists!");
}else {
//HTableDescriptor As of release 2.0.0, this will be removed in HBase 3.0.0
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
for(String str:colFamily){
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str);
hTableDescriptor.addFamily(hColumnDescriptor);
}
admin.createTable(hTableDescriptor);
}
}
//添加数据
public static void insertData(String tableName,String rowKey,String colFamily,String col,String val) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Put put = new Put(rowKey.getBytes());
put.addColumn(colFamily.getBytes(),col.getBytes(), val.getBytes());
table.put(put);
table.close();
}
//浏览数据
public static void getData(String tableName,String rowKey,String colFamily, String col)throws IOException{
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(rowKey.getBytes());
get.addColumn(colFamily.getBytes(),col.getBytes());
Result result = table.get(get);
System.out.println(new String(result.getValue(colFamily.getBytes(),col==null?null:col.getBytes())));
table.close();
}
}
代码运行后,控制台显示“69”(就是我们查的zhangsan的英语分数)
这时,可以到HBase Shell交互式环境中,使用如下命令查看student表是否创建成功
列举hbase中的表
list
成功创建
查看students表的数据
scan 'student'
可以看到数据已经插入到student表中了
更详细的编程实例可见:HBase Java API Demo | Github