赞
踩
HBase Java API应用编程示例
本节主要介绍HBase Java API应用编程示例,演示如何准备HBase Java API的编程环境,给出了基于HBase Java API的多个应用编程示例。这些编程示例对应了HBase Shell命令行终端常见的操作命令,例如list命令、desc命令、create命令、alter命令、put命令、get命令、scan命令和delete命令等。
1 HBase Java API编程环境准备
1)开发工具:Eclipse
2)Java版本:JDK 1.8.0
3)Linux系统:CentOS 7
4)虚拟机:Virtual Box6.0
5)远程终端工具:Xshell
6)HBase安装包: hbase-1.2.0-cdh5.7.0.tar.gz
7)Hadoop安装包:hadoop-2.6.0-cdh5.7.0
1)安装部署伪分布式Hadoop,具体安装配置方式参见第3章3.3.2小节。
2)安装部署伪分布式HBase,具体安装配置方式参见第3章3.4.2小节。
3)在Linux终端执行start-dfs.sh 脚本启动HDFS,执行start-hbase.sh 脚本启动HBase
1)启动开发工具Eclipse,创建一个Java Project项目,项目名称为HBaseJavaAPI
2)在Java Build Path中导入hbase-1.2.0-cdh5.7.0.tar.gz安装包中lib子目录的所有jar包
2)创建一个Java Class,类名为HBaseJavaAPIDemo(HBaseJava API演示类)
3)创建一个Java Class,类名为HBaseJavaAPIUtils(HBaseJava API工具类)
4)打开源码文件HBaseJavaAPIDemo.java,编写HBase Java API示例类源码
5)打开源码文件HBaseJavaAPIUtils.java,编写HBase Java API工具类源码
6)点击Eclipse工具栏的绿色运行按钮,运行HBaseJavaAPI项目
7)查看Eclipse下方Console栏中的程序运行结果
2 HBase Java API编程示例程序
本节演示的编程示例程序与HBase Shell终端命令格式的对应关系如表8-2所示:
表8-2 HBase Java API编程示例程序与HBase Shell终端命令格式的对应关系
HBase Java API编程示例程序 |
对应的HBase Shell终端命令格式 |
判断HBase中是否存在指定名称的数据表 |
exists 't1' exists 'ns1:t1' |
列出默认和自定义名字空间中的表名 |
list |
列出指定名字空间中的表名 |
list_namespace_tables 'ns1' |
描述指定表的属性信息 |
desc 't1' desc 'ns1:t1' |
按指定的表名和列族创建一张新表 |
create 't1', 'f1', 'f2', 'f3' |
按指定的表名删除一张表 |
drop 't1' drop 'ns1:t1' |
列出HBase中的所有名字空间 |
list_namespace |
创建指定名称的名字空间 |
create_namespace 'ns1' |
删除指定名称的名字空间 |
drop_namespace 'ns1' |
更改表:给指定表增加一个新的列族 |
alter 't1', 'f2' |
更改表:删除指定表中的一个列族 |
alter 'ns1:t1', 'delete' => 'f1' |
更改表:修改指定表列族的最大版本数和最小版本数 |
alter 't1', NAME => 'f1', VERSIONS => 5 alter 't1', NAME => 'f1', MINVERSIONS => 2 |
更改表:修改指定表列族的压缩模式 |
alter 't1', NAME => 'f1', COMPRESSION => 'GZ' |
写数据:指定表名、行键、列族和列名,写入一个单元格值 |
put 't1', 'r1', 'f1:q1', 'value' put 'ns1:t1', 'r1', 'f1:q1', 'value' |
写数据:指定表名、行键、列族、列名和时间戳,写入一个单元格值 |
put 't1', 'r1', 'f1:q1', 'value', ts1 put 'ns1:t1', 'r1', 'f1:q1', 'value', ts1 |
读数据:指定表名和行键,读取单元格值 |
get 't1', 'r1' get 'ns1:t1', 'r1' |
读数据:指定表名、行键和列族,读取单元格值 |
get 't1', 'r1', 'f1' get 'ns1:t1', 'r1', 'f1' |
读数据:指定表名、行键、列族和列名,读取单元格值 |
get 't1', 'r1', 'f1:q1' get 'ns1:t1', 'r1', 'f1:q1' |
扫描表:指定表名进行整表扫描 |
scan 't1' scan 'ns1:t1' |
扫描表:指定表名和列族名进行表扫描 |
scan 't1', {COLUMNS => ['f1']} scan 'ns1:t1', {COLUMNS => ['f1']} |
扫描表:指定表名、列族名和列名进行表扫描 |
scan 't1', {COLUMNS=> 'f1:q1'} scan 'ns1:t1', {COLUMNS=> 'f1:q1'} |
扫描表:指定表名和行键范围进行扫描 |
scan 't1', {STARTROW=>'r1', STOPROW =>'r2'} |
扫描表:指定表名和时间戳范围进行扫描 |
scan 't1', { TIMERANGE => [ts1, ts2}} |
删除数据:指定表名和行键,删除某行中所有列的单元格值 |
deleteall 't1', 'r1' deleteall 'ns1:t1', 'r1' |
删除数据:指定表名、行键、列族和列名,删除指定的单元格值 |
delete 't1', 'r1', 'f1:q1' delete 'ns1:t1', 'r1', 'f1:q1' |
指定表名、行键、列族、列名和时间戳,删除指定的单元格值 |
delete 't1', 'r1', 'f1:q1', ts1 delete 'ns1:t1', 'r1', 'f1:q1', ts1 |
HBase Java API编程示例程序的详细源码如下:
1)编写HBase Java API工具类源码
public static Configuration configuration; //配置类的静态引用变量
public static Connection connection; //连接接口的静态引用变量
public static Admin admin; //管理接口的静态引用变量
/*** 执行HBase操作之前,把生成配置和建立连接的初始化操作封装到init()方法中 */
public static void init() throws IOException {
configuration = HBaseConfiguration.create(); //生成配置
configuration.set("hbase.zookeeper.quorum", "hbase");//ZooKeepr节点主机名,如在远程window系统运行示例程序,需要在hosts文件增加主机名hbase和ZooKeepe节点IP地址的映射
connection = ConnectionFactory.createConnection(configuration);//建立连接
admin = connection.getAdmin();//获取管理对象
}
/*** 执行HBase操作之后,把关闭连接配置和释放管理对象放到close()方法*/
public static void close() throws IOException {
connection.close();
admin.close();
}
2)编写HBase Java API示例类源码
public static void main(String args[]) throws IOException {
//执行数据库操作之前,先执行初始化操作,包括生成配置和建立连接
HBaseJavaAPIUtils.init();
//执行数据库操作之后,关闭连接,释放管理对象
HBaseJavaAPIUtils.close();
}
1)编写HBase Java API工具类源码
/*** 判断表是否存在,输入参数为TableName(缺省default名字空间)或NameSpace:TableName两种方式,表存在则返回true,,表不存在则返回false
* @parameter String strTableName 表名
* @return boolean */
public static boolean isTableExist(String strTableName) throws IOException {
TableName tableName = TableName.valueOf(strTableName); //获取表名类的对象
return admin.tableExists(tableName);//调用判断表是否存在的方法
}
2)编写HBase Java API示例类源码:
public static void main(String args[]) throws IOException {
HBaseJavaAPIUtils.init();
System.out.println("Is Table exists? " + HBaseJavaAPIUtils.isTableExist("students"));
System.out.println("Is Table exists? " + HBaseJavaAPIUtils.isTableExist("default:students"));
System.out.println("Is Table exists? " + HBaseJavaAPIUtils.isTableExist("hbase:meta"));
HBaseJavaAPIUtils.close();
}
1)编写HBase Java API工具类源码
/***列出默认名字空间default和自定义名字空间中所有表的表名(方法实现2)
* @parameter void
* @return void */
public static void listTables() throws IOException {
HTableDescriptor[] tableDescriptors = admin.listTables(); //获取表描述器类的对象数组
for(HTableDescriptor tableDescriptor : tableDescriptors){
System.out.println(tableDescriptor.getTableName()); //输出表名字符串
}
}
/*** 列出默认名字空间default和自定义名字空间中所有表的表名(方法实现2)
* @parameter void
* @return void */
public static void listTables() throws IOException
{
TableName[] tableNames = admin.listTableNames();//获取表名类对象的数组
for(TableName tableName : tableNames) { //遍历每个表名
System.out.println(tableName.getNameAsString());//把表名对象转换成字符串输出
}
}
2)编写HBase Java API示例类源码
public static void main(String args[]) throws IOException {
HBaseJavaAPIUtils.init();
HBaseJavaAPIUtils.listTables(); //调用HBase Java API工具类listTables()方法列出表名
HBaseJavaAPIUtils.close();
}
1)编写HBase Java API工具类源码
/*** 列出指定名字空间的所有表的表名
* @parameter String strNameSpace 名字空间的名称
* @return void */
public static void listNamespaceTables(String strNameSpace) throws IOException {
//根据名字空间名称获取表名类的对象数组
TableName[] tableNames = admin.listTableNamesByNamespace(strNameSpace);
for(TableName tableName : tableNames) { //遍历对象数组中的每个表名
System.out.println(tableName.getNameAsString());//把表名对象转换成字符串输出
}
}
2)编写HBase Java API示例类源码
public static void main(String args[]) throws IOException {
HBaseJavaAPIUtils.init();
HBaseJavaAPIUtils.listTables(); //调用HBase Java API工具类listTables()方法列出表名
HBaseJavaAPIUtils.close();
}
1)编写HBase Java API工具类源码
/*** 描述指定表的属性信息
* @parameter String strTableName 表名
* @return void*/
public static void descTable(String strTableName) throws IOException{
TableName tableName = TableName.valueOf(strTableName);//获取表名类的对象
if (admin.isTableEnabled(tableName)) { //判断表是否可用
System.out.println("Table " + strTableName + " is ENABLED");
}
else {
System.out.println("Table " + strTableName + " is DISABLED");
}
HTableDescriptor tableDescriptor = admin.getTableDescriptor(tableName);//获取表描述器类的对象
HColumnDescriptor[] hcds = tableDescriptor.getColumnFamilies();//获取列族描述器类的对象数组
System.out.println(strTableName);//输出表名
System.out.println("COLUMN FAMILIES DESCRIPTION");//输出提示信息
for (HColumnDescriptor hcd : hcds) { //遍历每一个列族描述器对象
//调用列族描述器对象提供的各种方法,获取各种列族属性的值
System.out.println("{NAME => " + hcd.getNameAsString() + ", " +
"BLOOMFILTER => " + hcd.getBloomFilterType() + ", " +
"VERSIONS => " + hcd.getMaxVersions() + ", " +
"IN_MEMORY => " + hcd.isInMemory() + ", " +
"KEEP_DELETED_CELLS => " + hcd.getKeepDeletedCellsAsEnum().name() + ", " +
"DATA_BLOCK_ENCODING => " + hcd.getDataBlockEncoding().name() + ", " +
"TTL => " + hcd.getTimeToLive() + ", " +
"COMPRESSION => " + hcd.getCompression().getName() + ", " +
"MIN_VERSIONS => " + hcd.getMinVersions() + ", " +
"BLOCKCACHE => " + hcd.isBlockCacheEnabled() + ", " +
"BLOCKSIZE => " + hcd.getBlocksize() + ", " +
"REPLICATION_SCOPE => " + hcd.getDFSReplication() + "}");
}
}
2)编写HBase Java API示例类源码
public static void main(String args[]) throws IOException {
HBaseJavaAPIUtils.init();
HBaseJavaAPIUtils.descTable(); //调用HBase Java API工具类descTable()方法描述表的属性信息
HBaseJavaAPIUtils.close();
}
1)编写HBase Java API工具类源码
/*** 创建指定表名且包含一至多个列族的新表
* @parameter String strTableName 表名, String[] strColumnFamilyNames 存放多个列族名的数组
* @return void */
public static void createTable(String strTableName, String[] strColumnFamilyNames) throws IOException{
TableName tableName = TableName.valueOf(strTableName); //获取表名类的对象
HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);//实例化表描述器类的对象
for(String strColumnFamilyName:strColumnFamilyNames) { //遍历每个列族名字符串
//实例化列族描述器类的对象
HColumnDescriptor columnDescriptor = new HColumnDescriptor(strColumnFamilyName);
tableDescriptor.addFamily(columnDescriptor) ;//把列族描述器对象增加到表描述器对象中
}
admin.createTable(tableDescriptor); //调用创建表的方法提交操作
}
2)编写HBase Java API示例类源码
public static void main(String args[]) throws IOException {
HBaseJavaAPIUtils.init();
String[] strFamilies = new String[]{"family1", "family2", "family3"};//包含三个名字空间名称的数组
//调用HBase Java API工具类createTable()方法创建表
HBaseJavaAPIUtils.createTable("newtable", strFamilies);//在默认名字空间创建表
HBaseJavaAPIUtils.createTable("my_namespace:newtable", strFamilies);//在自定义名字空间创建表
HBaseJavaAPIUtils.close();
}
1)编写HBase Java API工具类源码
/*** 实现删除表的方法,表名的格式为TableName(缺省default名字空间)或NameSpace:TableName
* @parameter String strTableName 表名字符串
* @return void */
public static void dropTable(String strTableName) throws IOException {
TableName tableName = TableName.valueOf(strTableName);
admin.deleteTable(tableName); //调用删除表的方法
System.out.println("Table deleted successfully");
}
2)编写HBase Java API示例类源码
public static void main(String args[]) throws IOException {
HBaseJavaAPIUtils.init();
//调用HBase Java API工具类dropTable()方法删除表
HBaseJavaAPIUtils.dropTable("newtable");//删除默认名字空间的表
HBaseJavaAPIUtils.dropTable("my_namespace:newtable");//删除自定义名字空间的表
HBaseJavaAPIUtils.close();
}
1)编写HBase Java API工具类源码
/*** 列出HBase中所有的名字空间的名称
* @parameter void
* @return void */
public static void listNameSpaces() throws IOException
{
//获取名字空间描述器对象的数组
NamespaceDescriptor[] namespaceDescriptors = admin.listNamespaceDescriptors();
for(NamespaceDescriptor namespaceDescriptor: namespaceDescriptors) { //遍历每个名字空间
System.out.println(namespaceDescriptor.getName());//输出名字空间的名称
}
}
2)编写HBase Java API示例类源码
public static void main(String args[]) throws IOException {
HBaseJavaAPIUtils.init();
//调用HBase Java API工具类listNameSpaces()方法
HBaseJavaAPIUtils.listNameSpaces();//列出HBase所有的名字空间
HBaseJavaAPIUtils.close();
}
1)编写HBase Java API工具类源码
/*** 创建一个新的名字空间,输入参数是名字空间的名称
* @parameter String strNameSpace
* @return void */
public static void createNameSpace(String strNameSpace) throws IOException { //实现列出所有的表名
//构造方法是私有的,不能直接调用
//NamespaceDescriptor namespaceDescriptor = new NamespaceDescriptor();
//调用NamespaceDescriptor类的静态方法create()创建一个Builder类的对象
Builder builder = NamespaceDescriptor.create(strNameSpace);
//调用Builder类的示例方法create()创建一个NamespaceDescriptor 类的对象
NamespaceDescriptor namespaceDescriptor = builder.build();
admin.createNamespace(namespaceDescriptor);//调用创建名字空间的方法提交操作
}
2)编写HBase Java API示例类源码
public static void main(String args[]) throws IOException {
HBaseJavaAPIUtils.init();
//调用HBase Java API工具类createNameSpace()方法创建一个名字空间
HBaseJavaAPIUtils.createNameSpace("new_namespace"); //创建指定名称的名字空间
HBaseJavaAPIUtils.close();
}
1)编写HBase Java API工具类源码
/*** 删除指定名称的名字空间,输入参数是名字空间的名称
* @parameter String strNameSpace
* @return void*/
public static void dropNameSpace(String strNameSpace) throws IOException {
admin.deleteNamespace(strNameSpace);//调用删除名字空间的方法提交操作
}
2)编写HBase Java API示例类源码
public static void main(String args[]) throws IOException {
HBaseJavaAPIUtils.init();
//调用HBase Java API工具类dropNameSpace()方法删除一个名字空间
HBaseJavaAPIUtils.dropNameSpace("new_namespace"); //删除指定名称名字空间
HBaseJavaAPIUtils.close();
}
1)编写HBase Java API工具类源码
/*** 更改
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。