【大数据存储技术】实验1 Hbase数据库的部署和操作

1.HBase数据库的部署与配置(伪分布)

1安装Hbase

下载网址:Apache HBase – Apache HBase Downloads

(Hadoop版本3.3.4,下载最新hbase2.5.0)

 【大数据存储技术】实验1 Hbase数据库的部署和操作_第1张图片

注:可以给hbase加一下权限(可选)

【大数据存储技术】实验1 Hbase数据库的部署和操作_第2张图片

(2)配置环境变量

在后面添加:

Export PATH=$PATH:【自己的hbase解压地址/bin】

【大数据存储技术】实验1 Hbase数据库的部署和操作_第3张图片

注意最后还要source ~/.bashrc

使用hbase version查看版本(验证是否安装成功)

【大数据存储技术】实验1 Hbase数据库的部署和操作_第4张图片

(3)配置Hbase(伪分布式)

配置:【hbase安装位置/conf】

【大数据存储技术】实验1 Hbase数据库的部署和操作_第5张图片

注意:hbase.rootdir的数据要和接下来创建的hbase目录相对应!

(4)启动Hadoop,创建/user/liuhao/hbase目录

【大数据存储技术】实验1 Hbase数据库的部署和操作_第6张图片

(5)启动hbase,进入Hbase Shell界面

【大数据存储技术】实验1 Hbase数据库的部署和操作_第7张图片

 【大数据存储技术】实验1 Hbase数据库的部署和操作_第8张图片

2.使用Shell指令访问Hbase数据库

根据下面的表,练习书上给定的例子和命令。包括

(1)表:

        ①创建表

        ②查看表名列表

【大数据存储技术】实验1 Hbase数据库的部署和操作_第9张图片

        ③描述表结构

【大数据存储技术】实验1 Hbase数据库的部署和操作_第10张图片

        ④修改表结构

【大数据存储技术】实验1 Hbase数据库的部署和操作_第11张图片

        ⑤删除表

【大数据存储技术】实验1 Hbase数据库的部署和操作_第12张图片

 (2)数据更新:

        ①数据插入

【大数据存储技术】实验1 Hbase数据库的部署和操作_第13张图片

        ②数据更新

【大数据存储技术】实验1 Hbase数据库的部署和操作_第14张图片

        ③数据删除

【大数据存储技术】实验1 Hbase数据库的部署和操作_第15张图片

(3)数据查询:

        ①按行键获取

【大数据存储技术】实验1 Hbase数据库的部署和操作_第16张图片

        ②数据扫描

【大数据存储技术】实验1 Hbase数据库的部署和操作_第17张图片

        ③行计数

(4)过滤查询:

        ①行键过滤器

【大数据存储技术】实验1 Hbase数据库的部署和操作_第18张图片

        ②列族和列过滤器

        ③值过滤器

【大数据存储技术】实验1 Hbase数据库的部署和操作_第19张图片

Column Familybasic

Column Familyadvanced

Key

Columns

Columns

001

Column qualifier

Value

Timestamp

Column qualifier

Value

Timestamp

playername

Micheal Jordan

1270073054

Nickname

Air Jordan

1270073054

Uniform Number

23

1270073054

Born

February 17, 1963

1270073054

Position

Shooting guard

1270073054

Career points

32292

1270073054

002

Name

Value

Timestamp

Name

Value

Timestamp

Firstname

Kobe

1270084021

Lastname

bryant

1270084021

Uniform Number

8

1270084021

Position

SG

1270084021

Uniform Number

24

1270164055

3.编程实现HBase的访问

(1)设计一个HBase数据库,存储实体及其关系的信息。描述数据库设计,以及如何进行增删改查。例如:学生+课程成绩,顾客+商品,用户+图书,客户+美食,医生+病人,游客+景点,住户+旅馆。

数据库:【学生+课程成绩】(具体演示看Eclipse连接hbase)

【大数据存储技术】实验1 Hbase数据库的部署和操作_第20张图片

(2)使用Java访问HBase:实现设计的HBase数据库,实现数据库连接、表查询和创建、数据的增删改查。

启动hadoop,启动hbase

新建Eclipse项目

【大数据存储技术】实验1 Hbase数据库的部署和操作_第21张图片

在工程中导入外部jar包:

①Hadoop包(实验3)

②hbase包(全部):

【大数据存储技术】实验1 Hbase数据库的部署和操作_第22张图片

编程实例,测试连接(实现数据库连接、表查询和创建):

【大数据存储技术】实验1 Hbase数据库的部署和操作_第23张图片

数据的增加、修改和查询:

【大数据存储技术】实验1 Hbase数据库的部署和操作_第24张图片

 【大数据存储技术】实验1 Hbase数据库的部署和操作_第25张图片

数据的删除:

【大数据存储技术】实验1 Hbase数据库的部署和操作_第26张图片

源代码:

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))+" ");

        }

    }

}

【参考】:Ubuntu下HBase安装与使用(shell+Java API)_三十而立90后的博客-CSDN博客

你可能感兴趣的:(【作业分享交流】,hbase)