Skip to content

Latest commit

 

History

History
229 lines (155 loc) · 10.1 KB

3.HBase应用程序开发.md

File metadata and controls

229 lines (155 loc) · 10.1 KB

HBase 应用程序开发


实验简介

本次实验学习和了解如何在Eclipse下使用HBase API进行一些Java应用程序开发。


##一、实验环境说明

1. 环境登录

无需密码自动登录,系统用户名shiyanlou

2. 环境介绍

本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序:

  • XfceTerminal: Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令;
  • Firefox:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写的HTML/JS页面即可;
  • GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器
  • eclipse:eclipse是著名的跨平台的自由集成开发环境(IDE)。主要用来Java语言开发,但是目前亦有人通过插件使其作为C++和Python等语言的开发工具。

3. 环境使用

使用GVim编辑器输入实验所需的代码,然后使用XfceTerminal命令行环境进行编译运行,查看运行结果,运行后可以截图并分享自己的实验成果,实验楼提供的截图是后台截图,无法作弊,可以真实有效证明您已经完成了实验。

实验报告可以在个人主页中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。


二、配置 Eclipse

上次实验,我们学习了HBase的安装和配置。有了对HBase一定的了解后,我们趁热打铁,开始学习HBase应用程序开发。因为我们在开发过程中需要用到Eclipse, 所以需要先对Eclipse进行配置。

(1) 新建工程

我们在Eclipse中新建一个Java Project, 选择 File->New->Java Project

图片描述信息

(2)指定HBase配置文件的位置

当第三方程序访问HBase的时候,首选需要访问Zookeeper. Zookeeper是一个为分布式应用所设计的开源协调服务,默认情况下HBase自身有一组默认的Zookeeper实例,当然用户也可以配置其他独立的Zookeeper. 因为HBase的重要信息保存在Zookeeper之中。而Zookeeper的集群的信息由 ${HBASE_DIR}/conf/hbase-site.xml 文件指定,因此需要通过CLASSPATH来指定HBase配置文件(即 ${HBASE_DIR}/conf/)的位置。

在你的工程目录下新建一个名为conf的文件夹,将Hbase的配置文件 hbase-site.xml 复制到该目录。

图片描述信息

然后右击项目工程,选择 Properties->Java Build Path->Libraries->Add Class Folder, 将刚刚增加的conf目录选上。

图片描述信息

(3)添加 jar 包

右击项目工程,选择 Properties->Java Build Path->Libraries->Add External JARs, 选择添加所需的 jar 包( jar 包的位置在 ${HBASE_DIR}/lib/ 中)。为了避免不同版本等可能引发的问题,我们建议你在实验过程中,直接添加lib目录下的全部 jar 包即可。

图片描述信息

注意:如果你不能或没有权限添加 conf 文件夹和 jar 包,请先将其复制到一个用户目录,再进行添加。

三、在Eclipse中编写测试代码

按照你的命名习惯,新建一个Test类,

图片描述信息

添加如下代码:

import java.io.IOException;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;

public class HBaseTestCase {	   
    //声明静态配置 HBaseConfiguration
    static Configuration cfg=HBaseConfiguration.create();

    //创建一张表,通过HBaseAdmin HTableDescriptor来创建
    public static void creat(String tablename,String columnFamily) throws Exception {
        HBaseAdmin admin = new HBaseAdmin(cfg);
        if (admin.tableExists(tablename)) {
            System.out.println("table Exists!");
            System.exit(0);
        }
        else{
            HTableDescriptor tableDesc = new HTableDescriptor(tablename);
            tableDesc.addFamily(new HColumnDescriptor(columnFamily));
            admin.createTable(tableDesc);
            System.out.println("create table success!");
        }
    }
  
    //添加一条数据,通过HTable Put为已经存在的表来添加数据
    public static void put(String tablename,String row, String columnFamily,String column,String data) throws Exception {
        HTable table = new HTable(cfg, tablename);
        Put p1=new Put(Bytes.toBytes(row));
        p1.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(data));
        table.put(p1);
        System.out.println("put '"+row+"','"+columnFamily+":"+column+"','"+data+"'");
    }
   
   public static void get(String tablename,String row) throws IOException{
    	HTable table=new HTable(cfg,tablename);
    	Get g=new Get(Bytes.toBytes(row));
		Result result=table.get(g);
		System.out.println("Get: "+result);
    }
    //显示所有数据,通过HTable Scan来获取已有表的信息
    public static void scan(String tablename) throws Exception{
         HTable table = new HTable(cfg, tablename);
         Scan s = new Scan();
         ResultScanner rs = table.getScanner(s);
         for(Result r:rs){
             System.out.println("Scan: "+r);
         }
    }
    
    public static boolean delete(String tablename) throws IOException{
    	
    	HBaseAdmin admin=new HBaseAdmin(cfg);
    	if(admin.tableExists(tablename)){
    		try
    		{
	    		admin.disableTable(tablename);
	    		admin.deleteTable(tablename);
    		}catch(Exception ex){
    			ex.printStackTrace();
    			return false;
    		}
    		
    	}
    	return true;
    }
  
    public static void  main (String [] agrs) {
    	String tablename="hbase_tb";
	String columnFamily="cf";
  	
    	try {    	 	
            HBaseTestCase.creat(tablename, columnFamily);
            HBaseTestCase.put(tablename, "row1", columnFamily, "cl1", "data");
            HBaseTestCase.get(tablename, "row1");
            HBaseTestCase.scan(tablename);
 /*           if(true==HBaseTestCase.delete(tablename))
            	System.out.println("Delete table:"+tablename+"success!");
 */      
        }
        catch (Exception e) {
            e.printStackTrace();
        }    
}
}

我们在该类中,实现了类似HBase Shell的表 create, Put, Get, Scan以及delete等操作。

简单分析一下,在上面的代码中,我们通过第3行加载HBase默认配置cfg; 然后,通过HbaseAdmin接口来管理现有数据库,见第7行。第8行 ~ 第18行通过HTableDescriptor(指定表相关信息) 和HColumnDescriptor(指定表内列族相关信息)来创建一个HBase数据库,并设置其拥有的列族成员;put函数通过HTable和Put类为该表添加值,见第21行 ~ 第27行;get函数通过HTable和Get读取刚刚添加的值,见第 29行 ~ 第34行;Scan函数通过HTable和Scan类读取表中的所有记录,见第36行 ~ 第43行;delete函数,通过HBaseAdmin首先将表置为无效(第51行),然后将其删除(第52行)。

四、启动Hadoop和HBase集群

在开始运行程序之前,我们必须先启动Hadoop或HBase集群,我们在上节实验中已经详细介绍了,你可以点击HBase安装配置回顾一下。

如果你是 伪分布模式 部署的,请在相关目录下依次输入命令 ./start-all.sh./start-hbase.sh 来启动。而如果是 单机模式,只需在 HBase 的正确路径下输入 ./start-hbase.sh 来启动。本次实验以 伪分布模式 示例。

图片描述信息


五、运行Java程序

运行程序非常简单,右击项目工程,Run As -> Java Application 就OK了。然后你可以在 Console(控制台)看到程序运行的情况:

图片描述信息

如果你没有在Eclipse中看到 Console 窗口,请依次选择 Window->Show View->Other->General->Console.

图片描述信息

然后:

图片描述信息

##六、使用 HBase Shell 对比查看 Java 程序成功运行之后,由于此程序是一个模拟数据库相关操作的,因此我们可以通过 HBase Shell 来对比查看该Java程序的运行结果。

输入 ./hbase shell 进入来HBase Shell

图片描述信息

输入 list 查看表的列项,可以看到已经成功创建了名为 'hbase_tb' 的一张表:

图片描述信息

再输入 scan 'hbase_tb' 来查看表的内容:

图片描述信息

对比Eclipse中Console中打印的结果,可以发现二者是一致的。


作业

大家可以思考一下,如何把HBase和MapReduce结合起来开发编程,从而完成我们之前那个 WordCount 的例子。


参考文档