HBase Java API编程实验


Eclipse增大Java源代码文件字体大小:
打开菜单【window】-》【Perference】,在弹出的Perference对话框的左边栏中,选择General->Appearance->Colors and Fonts,
再点击右边栏的Java->Java Editor Text Fonts,再点击右边【Edit】按钮,弹出字体对话框,选择字体为小四后点【确定】

HBase Java API编程涉及到的Java语法点:
0) 一切都是对象,把事物、东西、操作、动作、名词、动词都可以抽象成一个类;面向对象的四大特性:抽象、封装、继承、多态
1)Java包package,import导入包
2)java类class,访问控制级别puclic,protect,private
3)static定义类的静态成员变量, 类名.成员变量名
public static Configuration configuration;
isTableExist.configuration

4)静态代码块:static {} 定义一个静态代码块,语句只会在类初始化的时候执行一次,可用于初始化类的静态成员变量

非静态代码块


5)类的静态成员方法,属于整个类,类名.方法名()

6)父类、子类,extends类的继承:HBaseConfiguration extends Configuration  
父类指向其子类的对象
代码示例:
package testHBase;

class A
{
       void m()
       {
           System.out.println("m() of class A is called");
       }
}

class B extends A 
{
   void m()
   {
       System.out.println("m() of class B is called");
   }
}


class C extends A 
{
       void m()
       {
           System.out.println("m() of class C is called");
       }
       
}

public class testSubClass 
{

    public static void main(String[] args)
    {
//        A a = new A();
//        B b = new B();
//        C c = new C();
//        a.m();
//        b.m();
//        c.m();    
        A a = new B();
            a.m();
            a = new C();
            a.m();
    }
}

//多态性的体现


Java多态性的体现


7)Java设计模式:工厂模式 ConnetionFactory

8)Java接口Interface,类implement继承一个接口,接口是不允许实例化,接口方法都只有声明没有实现,在其实现类中实现接口方法
接口vs抽象类 对比

interface Connection


9)Java接口类型的变量可以引用其实现类的对象    HConnectionImplementation连接实现类,间接的实现了Coonecion接口

HConnectionImplementation  implements  ClusterConnection

ClusterConnection extends HConnection

HConnection extends Connection

Connection connection = ConnectionFactory.createConnection(configuration);


HBaseAdmin implements Admin  

Admin admin = new HBaseAdmin(this);

admin.tableExists();

面向接口编程的好处,能消除对象引用和方法调用的耦合性,降低耦合性,Java多态性的体现

9)Java接口也存在继承关系,接口的继承HConnection extends Connection

10)Java内部类:类A里包含另一个类B,HConnectionImplementation类是ConnectionManager类的内部类

11) setClassLoader 类加载器  Java反射机制

12)Java类中的方法名不能和类名相同(方法名和类名相同的方法是构造方法)

13) 方法的重载,类中定义多个同名方法,但是方法的参数不同,方法的功能也不相同


HBase Java API 编程实验:

运行第1个HBase Java API程序:

1)启动VirtualBox虚拟机HBaes伪分布式,依次执行执行start-dfs.sh 脚本启动HDFS,再执行start-hbase.sh 脚本启动HBase

2)打开桌面图标"eclipse.exe",启动Java IDE(集成开发环境)Eclipse,查看Eclipse界面的左边栏,已经存在一个项目testHBase

3)Linux终端执行hbase shell命令,进入HBase Shell命令行终端,执行list命令,查看当前的数据表,应该有一张students表
如果students表不存在,在HBase Shell命令行终端执行create 'students', 'info', 'score'创建studets表
 
4)Linux终端执行hostname命令,查看主机名称,应该是master

5) 打开testHBase.java源代码文件,检查以下两行代码:
configuration.set("hbase.zookeeper.quorum", "hadoop"); //第2个参数是当前的主机名称,应该是maser

TableName tableName = TableName.valueOf("students");  //students应该是HBase已经存在的表

6)点击Eclipse上面的绿色按钮,运行testHBase项目,等待运行结果

7)查看下面Console栏中的输出,应该输出Table exists

8)修改代码为 TableName tableName = TableName.valueOf("students1");  //students1是HBase不存在的表

9)重复执行6)和7)步骤,查看下面Console栏中的输出,应该输出Table dose not exists


运行第2个HBase Java API程序:
1)鼠标右键点击Eclise左边的项目testHBase,右键菜单选择【new】-》【class】,会弹出一个"New Java Class'对话框
2)在对话框的Name文本框中,输入Java Class类名isTableExist,点击【Finish按钮】
3)将以下代码小心复制粘贴到isTableExist.java源码文件中,完全覆盖掉原来的代码
4)记得修改代码行 configuration.set("hbase.zookeeper.quorum", "master"); 的主机名为master
5)点击Eclipse上面的绿色按钮,运行testHBase项目,等待运行结果
6)查看下面Console栏中的输出,应该输出Table exists
7)修改代码行 boolean isExists = isTableExist("students1"); 应该输出Table dose not exists

package testHBase;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.TableName;
 

public class isTableExist 
{
    //定义一个类的静态成员类对象Configuration
        public static Configuration configuration;//static是静态变量,类的变量,可以通过“类名.静态变量:名来使用
        //不带static是对象的成员变量,,可以通过“类的对象名.成员变量名:名来使用
        
    //使用HBaseConfiguration的静态方法创建一个Configuration类的对象,并设置关键配置参数ZooKeeper
        static //static代码块的语句,不需要在对类实例化的时候每次都执行
        { 
            configuration = HBaseConfiguration.create(); //HBaseConfiguration类继承了Configuration类,调用子类HBaseConfiguration的create静态方法,创建一个拥有HBase资源的父类对象
            configuration.set("hbase.zookeeper.quorum", "hadoop");
        }
        
//        static void init()
//        {
//            configuration = HBaseConfiguration.create(); 
//            configuration.set("hbase.zookeeper.quorum", "hadoop");
//        }
        
        //实现判断表是否存在的方法,输入参数是表名
        public static boolean TableExist(String tableName) throws IOException 
        {
//            Connection  connection  =  new  Connection();
            Connection connection = ConnectionFactory.createConnection(configuration);
//            System.out.println(connection.getClass().getName());
            
//            Admin admin = new Admin();
            Admin admin = connection.getAdmin();//实质相当于执行Admin admin = new HBaseAdmin();
            TableName tableNameObj = TableName.valueOf(tableName);
            boolean isExists = admin.tableExists(tableNameObj);
            return isExists;
            
        }
        
        
        public static void main(String[] args) throws IOException 
        {
//            isTableExists.init();
            boolean isExists = TableExist("students");
//            boolean isExists = TableExist("students1");
            if(isExists) 
            {
                System.out.println("Table exists");
            }
            else 
            {
                System.out.println("Table dose not exists");
            }    
        }

}

运行第3个HBase Java API程序:
1)鼠标右键点击Eclise左边的项目testHBase,右键菜单选择【new】-》【class】,会弹出一个"New Java Class'对话框

2)在对话框的Name文本框中,输入Java Class类名createTable,点击【Finish按钮】
3)将以下代码小心复制粘贴到createTable.java源码文件中,完全覆盖掉原来的代码
4)记得修改代码行 configuration.set("hbase.zookeeper.quorum", "master"); 的主机名为master
5)点击Eclipse上面的绿色按钮,运行testHBase项目,等待运行结果
6)在HBase Shell命令行终端,执行list命令,查看当前的数据表,应该新增加一张testTable表
代码如下:
package testHBase;
 
import java.io.IOException;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.TableName;
 
public class createTable
{
    //定义类的静态成员类对象
    public static Configuration configuration;
    public static Connection connection;
    public static Admin admin;
    
    //将创建配置类和连接类的代码重构为静态代码块,有利于代码的复用
    //使用 HBaseConfiguration 的静态方法创建一个Configuration类的对象
    static
    { 
        configuration = HBaseConfiguration.create(); 
        configuration.set("hbase.zookeeper.quorum", "hadoop");
    }
    
    //使用 ConnectionFactory的静态方法创建一个Connection类的对象
    static
    { 
         try 
         {
            connection = ConnectionFactory.createConnection(configuration);
            admin = connection.getAdmin();
         } 
         catch (IOException e) 
         {
    
            e.printStackTrace();
        }        
    }
        
    //实现创建一张表的方法,输入参数是表名和列族名,创建只包含一个列族的表
    public static void createATable(String tName, String cfName) throws IOException
    {
        TableName tableName = TableName.valueOf(tName);
        HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
        HColumnDescriptor columnDescriptor = new HColumnDescriptor(cfName);
        tableDescriptor.addFamily(columnDescriptor);
        admin.createTable(tableDescriptor);    
    }

//方法的重载,类中定义多个同名方法,但是方法的参数不同,方法的功能也不相同
    public static void createATable(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);        

    }
    
    public static void main(String[] args) throws IOException 
    {
//         执行创建一张新表的方法,只能指定一个列族
          createATable("testTable", "f1");
 
         //执行创建一张新表的方法,可指定多个列族
//        String[] columnFamilies = new String[] {"columnFamily1", "columnFamily2", "columnFamily3"};
//          createATable("testTable2", columnFamilies);
    }
}


运行第4个HBase Java API程序:
1)鼠标右键点击Eclise左边的项目testHBase,右键菜单选择【new】-》【class】,会弹出一个"New Java Class'对话框

2)在对话框的Name文本框中,输入Java Class类名deleteTable,点击【Finish按钮】
3)将以下代码小心复制粘贴到deleteTable.java源码文件中,完全覆盖掉原来的代码
4)记得修改代码行 configuration.set("hbase.zookeeper.quorum", "master"); 的主机名为master
5)修改代码行:boolean isDeleted = deleteATable("t3");  表名修改成要删除的表名,HBase Shell终端执行list命令查看已存在的表
6)点击Eclipse上面的绿色按钮,运行testHBase项目,等待运行结果
7)在HBase Shell命令行终端,执行list命令,查看当前的数据表,应该会删除指定的数据表
代码如下:
package testHBase;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.TableName;
 
 
public class deleteTable
{
    //定义类的静态成员类对象
    public static Configuration configuration;
    public static Connection connection;
    public static Admin admin;
    
    //将创建配置类和连接类的代码重构为静态代码块,有利于代码的复用
    //使用 HBaseConfiguration 的静态方法创建一个Configuration类的对象
    static
    { 
        configuration = HBaseConfiguration.create(); 
        configuration.set("hbase.zookeeper.quorum", "hadoop");
    }
    
    //使用 ConnectionFactory的静态方法创建一个Connection类的对象
    static
    { 
         try 
         {
            connection = ConnectionFactory.createConnection(configuration);
            admin = connection.getAdmin();
         } 
         catch (IOException e) 
         {
    
            e.printStackTrace();
        }        
    }
            
    //实现删除一张表的方法,输入参数是表名,返回是否删除成功
    public static boolean deleteATable(String tName) throws IOException
    {
        if(!admin.tableExists(TableName.valueOf(tName))) //如果表不存在,不执行删除直接返回
        {
            System.out.println("Table dose not exists");
            return

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值