HBase Java API编程实训

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. 准备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和HBase

1)安装部署伪分布式Hadoop,具体安装配置方式参见第3章3.3.2小节。

2)安装部署伪分布式HBase,具体安装配置方式参见第3章3.4.2小节。

3)在Linux终端执行start-dfs.sh 脚本启动HDFS,执行start-hbase.sh 脚本启动HBase

  1. 创建HBase Java API编程项目

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. 初始化操作:生成配置和建立连接

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中是否存在指定名称的数据表

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. 列出默认和自定义名字空间中的表名

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. 列出指定名字空间中的表名

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. 描述指定表的属性信息

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. 按指定的表名和列族创建一张新表

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. 按指定的表名删除一张表

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中的所有名字空间

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. 创建指定名称的名字空间

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. 删除指定名称的名字空间

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. 更改表:给指定表增加一个新的列族

1)编写HBase Java API工具类源码

/*** 更改

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值