在开始编程之前,我们先来了解一下HBase的一些Java API,与HBase数据存储管理相关的java API主要包括:HBaseConfiguration、Admin、HTableDescriptor、HColumnDescriptor、Put、Get、ResultScanner、Result、Scan。
该类用于管理HBase的配置信息,下面是一些其中的常用方法:
Configuration create():使用默认的HBase配置文件创建Configuration
Configuration addHbaseResources(Configuration conf):向当前Configuration添加conf中的配置信息
Void merge(Configuration destConf, Configuration srcConf):合并个Configuration
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
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():获取当前表名
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):设置属性的值
包含了列族的详细信息,通常在添加列族或创建表时使用。列族一旦建立就不能修改,只能通过删除列族,然后创建新的列族来间接修改。一旦列族被删除,该列族包含的数据也随之删除。下面是一些其中的常用方法:
Byte[] getName():获得列族名称
Byte[] getValue(byte[] key):获得某列单元格的值
HColumnDescriptor setValue(byte[] key, byte[] value):设置某列单元格的值
用于对单元格执行添加数据。下面是一些其中的常用方法:
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
用来获取单行的信息。下面是一些其中的常用方法:
用于存放Get或Put操作后的结果,并以
Boolean containsColumn(byte[] family, byte[] qualifier):检查是否包含列族和列限定符指定的列
List getColumnCells(byte[] family, byte[] qualifier):获得列族和列限定符指定的列中的所有单元格
NavigableMap
Byte[] getValue(byte[] family, byte[] qualifier):获得列族和列指定的单元格的最新值
客户端获取值的接口。下面是一些其中的常用方法:
Void close():关闭scanner并释放资源
Result next():获得下一个Result实例
可以利用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 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.hbasegroupId>
<artifactId>hbase-clientartifactId>
<version>2.1.0version>
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'
更详细的编程实例可见:HBase Java API Demo | Github