HBase常用Shell命令和基础开发

HBase常用Shell命令

HBase中用create命令创建表:

create 'Student','Num','Name','Sex','Age'

运行结果如下:

hbase(main):008:0> create 'Student','Num','Name','Sex','Age'
0 row(s) in 2.4910 seconds
=> Hbase::Table - Student
hbase(main):009:0> 

此时,即创建了一个’Student’表,属性有:Num,Name,Sex,Age。因为HBase的表中会有一个系统默认的属性作为行键,无需自行创建,默认为put命令操作中表名后第一个数据。创建完“student”表后,可通过describe命令查看“student”表的基本信息。

HBase数据库基本操作:

添加数据-put:

HBase中用put命令添加数据,注意:一次只能为一个表的一行数据的一个列,也就是一个单元格添加一个数据,所以直接用shell命令插入数据效率很低,在实际应用中,一般都是利用编程操作数据。

在添加数据时,HBase会自动为添加的数据添加一个时间戳,故在需要修改数据时,只需直接添加数据,HBase即会生成一个新的版本,从而完成“改”操作,旧的版本依旧保留,系统会定时回收垃圾数据,只留下最新的几个版本,保存的版本数可以在创建表的时候指定。

当运行命令:put ‘Student’,‘1001’,‘ZhangSan’,male’,'23’时,即为Student表添加了学号为1001,姓名为ZhangSan,性别男,年龄23的一条数据。行键为1001.

put 'Student','1001','ZhangSan',male','23'

删除数据:

在HBase中用delete以及deleteall命令进行删除数据操作,它们的区别是:1. delete用于删除一个数据,是put的反向操作;2. deleteall操作用于删除一行数据。

delete 'Student','1001','Age'
#删除学号为1001的年龄。

delete 'Student','1001'
#删除学号为1001的所示数据。

查看数据:

HBase中有两个用于查看数据的命令:1. get命令,用于查看表的某一行数据;2. scan命令用于查看某个表的全部数据

get 'Student','1001'
#查看学生学号为1001的信息

scan 'student'
#查看整个Student表的信息。

删除表:

删除表有两步,第一步先让该表不可用,第二步删除表。

disable 'Student'
#先禁用表

drop 'Student'
#删除表

查询表历史数据:

查询表的历史版本,需要两步。
1、在创建表的时候,指定保存的版本数(假设指定为5)

create 'Student',{NAME=>'username',VERSIONS=>5}

2、插入数据然后更新数据,使其产生历史版本数据,注意:这里插入数据和更新数据都是用put命令

put 'Student','1001','username','Mary'
put 'Student','1001','username','Mary1'
put 'Student','1001','username','Mary2'
put 'Student','1001','username','Mary3'

3、查询时,指定查询的历史版本数。默认会查询出最新的数据。(有效取值为1到5)

 get 'Student','1001',{COLUMN=>'username',VERSIONS=>5}

退出HBase数据库表操作:

**最后退出数据库操作,输入exit命令即可退出,**注意:这里退出HBase数据库是退出对数据库表的操作,而不是停止启动HBase数据库后台运行。

HBase API详解

写HBase程序,需导入hbase安装目录中的lib文件中的所有jar包就行。

HBase常用API介绍:

Admin:

HBase的管理API。从connecgetadmin()获取一个实例,然后调用close()。

Admin可用于创建、删除、列出、启用和禁用表、添加和删除表列家庭和其他行政操作。

Admin的常用方法:

//判断表是否存在
boolean tableExists(TableName tableName)
             throws IOException

//这个对象使用的连接。
Connection getConnection()

//列出与给定模式匹配的所有用户空间表。
HTableDescriptor[] listTables(Pattern pattern)

  //列出所有用户表的空间
 TableName[] listTableNames(String regex)
 
//获得表描述符的方法
HTableDescriptor getTableDescriptor(TableName tableName)
  
//创建一个新表。同步操作
void createTable(HTableDescriptor desc)

//删除一个表。同步操作。
void deleteTable(TableName tableName)

Connection:

一个集群连接,将较低层次的个人连接封装到实际的服务器上,并连接到zookeeper。连接通过ConnectionFactory类实例化。连接的生命周期由调用者管理,后者必须close()连接以释放资源。

连接对象包含找到master的逻辑,定位集群上的区域,保留一个位置的缓存,然后知道如何在移动后重新校准。与服务器、元缓存、zookeeper连接等的个人连接都是由Table和Admin从该连接获得的管理实例共享的.

连接创建是一个重量级的操作。连接实现是线程安全的,因此客户端可以创建一次连接,并与不同的线程共享它。另一方面,Admin和Table实例是轻量级的,并且不是线程安全的。通常,每个客户端应用程序的单个连接被实例化,并且每个线程都将获得它自己的表实例。不建议对Table和Admin进行缓存或合用。

Connection的常用方法:

  void close()//关闭连接
  Admin getAdmin()  //检索管理实现来管理HBase集群。
  
  //这个连接实例正在使用的配置实例
  org.apache.hadoop.conf.Configuration getConfiguration()  

  //检索表实现来访问表。返回的表不是线程安全的,应该为每个使用线程创建一个新的实例。这是一个轻量级的操作,既不需要也不需要对返回的表进行池或缓存。
  Table getTable(TableName tableName)
  
  //检索管理实现来管理HBase集群。返回的管理员不能保证是线程安全的。每一个使用线程都应该创建一个新的实例。这是一个轻量级操作。不建议对返回的管理员进行池或缓存。
  Admin getAdmin()

Table:

用于与单个HBase表进行通信。从连接中获取一个实例,然后调用close().

表格可用于从表中获取、放置、删除或扫描数据。

HTableDescriptor:

HTableDescriptor包含关于HBase表的详细信息,例如所有列家族的描述符,是表a目录表,-根-或HBase:meta,如果表只读取,memstore的最大大小,当区域拆分时,与之关联的协处理器等等。

##HBase编程示例:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import java.io.IOException;
 
public class ExampleForHbase{
    public static Configuration configuration;
    public static Connection connection;
    public static Admin admin;
 
    //主函数中的语句请逐句执行,只需删除其前的//即可,如:执行insertRow时请将其他语句注释
    public static void main(String[] args)throws IOException{
        //创建一个表,表名为Score,列族为sname,course
        createTable("Score",new String[]{"sname","course"});
 
        //在Score表中插入一条数据,其行键为95001,sname为Mary(因为sname列族下没有子列所以第四个参数为空)
        //等价命令:put 'Score','95001','sname','Mary'
        //insertRow("Score", "95001", "sname", "", "Mary");
        //在Score表中插入一条数据,其行键为95001,course:Math为88(course为列族,Math为course下的子列)
        //等价命令:put 'Score','95001','score:Math','88'
        //insertRow("Score", "95001", "course", "Math", "88");
        //在Score表中插入一条数据,其行键为95001,course:English为85(course为列族,English为course下的子列)
        //等价命令:put 'Score','95001','score:English','85'
        //insertRow("Score", "95001", "course", "English", "85");
 
        //1、删除Score表中指定列数据,其行键为95001,列族为course,列为Math
        //执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码取消注释注释,将删除制定列族的代码注释
        //等价命令:delete 'Score','95001','score:Math'
        //deleteRow("Score", "95001", "course", "Math");
 
        //2、删除Score表中指定列族数据,其行键为95001,列族为course(95001的Math和English的值都会被删除)
        //执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,将删除制定列族的代码取消注释
        //等价命令:delete 'Score','95001','score'
        //deleteRow("Score", "95001", "course", "");
 
        //3、删除Score表中指定行数据,其行键为95001
        //执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,以及将删除制定列族的代码注释
        //等价命令:deleteall 'Score','95001'
        //deleteRow("Score", "95001", "", "");
 
        //查询Score表中,行键为95001,列族为course,列为Math的值
        //getData("Score", "95001", "course", "Math");
        //查询Score表中,行键为95001,列族为sname的值(因为sname列族下没有子列所以第四个参数为空)
        //getData("Score", "95001", "sname", "");
 
        //删除Score表
        //deleteTable("Score");
    }
 
    //建立连接
    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();
        }
    }
    //关闭连接
    public static void close(){
        try{
            if(admin != null){
                admin.close();
            }
            if(null != connection){
                connection.close();
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
 
    /**
     * 建表。HBase的表中会有一个系统默认的属性作为主键,主键无需自行创建,默认为put命令操作中表名后第一个数据,因此此处无需创建id列
     * @param myTableName 表名
     * @param colFamily 列族名
     * @throws IOException
     */
    public static void createTable(String myTableName,String[] colFamily) throws IOException {
 
        init();
        TableName tableName = TableName.valueOf(myTableName);
 
        if(admin.tableExists(tableName)){
            System.out.println("talbe is exists!");
        }else {
            HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
            for(String str:colFamily){
                HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str);
                hTableDescriptor.addFamily(hColumnDescriptor);
            }
            admin.createTable(hTableDescriptor);
            System.out.println("create table success");
        }
        close();
    }
    /**
     * 删除指定表
     * @param tableName 表名
     * @throws IOException
     */
    public static void deleteTable(String tableName) throws IOException {
        init();
        TableName tn = TableName.valueOf(tableName);
        if (admin.tableExists(tn)) {
            admin.disableTable(tn);
            admin.deleteTable(tn);
        }
        close();
    }
 
    /**
     * 查看已有表
     * @throws IOException
     */
    public static void listTables() throws IOException {
        init();
        HTableDescriptor hTableDescriptors[] = admin.listTables();
        for(HTableDescriptor hTableDescriptor :hTableDescriptors){
            System.out.println(hTableDescriptor.getNameAsString());
        }
        close();
    }
    /**
     * 向某一行的某一列插入数据
     * @param tableName 表名
     * @param rowKey 行键
     * @param colFamily 列族名
     * @param col 列名(如果其列族下没有子列,此参数可为空)
     * @param val 值
     * @throws IOException
     */
    public static void insertRow(String tableName,String rowKey,String colFamily,String col,String val) throws IOException {
        init();
        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();
        close();
    }
 
    /**
     * 删除数据
     * @param tableName 表名
     * @param rowKey 行键
     * @param colFamily 列族名
     * @param col 列名
     * @throws IOException
     */
    public static void deleteRow(String tableName,String rowKey,String colFamily,String col) throws IOException {
        init();
        Table table = connection.getTable(TableName.valueOf(tableName));
        Delete delete = new Delete(rowKey.getBytes());
        //删除指定列族的所有数据
        //delete.addFamily(colFamily.getBytes());
        //删除指定列的数据
        //delete.addColumn(colFamily.getBytes(), col.getBytes());
 
        table.delete(delete);
        table.close();
        close();
    }
    /**
     * 根据行键rowkey查找数据
     * @param tableName 表名
     * @param rowKey 行键
     * @param colFamily 列族名
     * @param col 列名
     * @throws IOException
     */
    public static void getData(String tableName,String rowKey,String colFamily,String col)throws  IOException{
        init();
        Table table = connection.getTable(TableName.valueOf(tableName));
        Get get = new Get(rowKey.getBytes());
        get.addColumn(colFamily.getBytes(),col.getBytes());
        Result result = table.get(get);
        showCell(result);
        table.close();
        close();
    }
    /**
     * 格式化输出
     * @param result
     */
    public static void showCell(Result result){
        Cell[] cells = result.rawCells();
        for(Cell cell:cells){
            System.out.println("RowName:"+new String(CellUtil.cloneRow(cell))+" ");
            System.out.println("Timetamp:"+cell.getTimestamp()+" ");
            System.out.println("column Family:"+new String(CellUtil.cloneFamily(cell))+" ");
            System.out.println("row Name:"+new String(CellUtil.cloneQualifier(cell))+" ");
            System.out.println("value:"+new String(CellUtil.cloneValue(cell))+" ");
        }
    }
}

以上内容为听华为大数据培训课程和大学MOOC上厦门大学 林子雨的《大数据技术原理与应用》课程而整理的笔记。

大数据技术原理与应用https://www.icourse163.org/course/XMU-1002335004


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值