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

1安装Hbase

下载网址:Apache HBase – Apache HBase Downloads

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

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网 【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

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

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

(2)配置环境变量

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

在后面添加:

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

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

注意最后还要source ~/.bashrc

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

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

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

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

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

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

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

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

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

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

 【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

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

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

(1)表:

        ①创建表

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

        ②查看表名列表

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

        ③描述表结构

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

        ④修改表结构

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

        ⑤删除表

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

 (2)数据更新:

        ①数据插入

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

        ②数据更新

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

        ③数据删除

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

(3)数据查询:

        ①按行键获取

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

        ②数据扫描

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

        ③行计数

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

(4)过滤查询:

        ①行键过滤器

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

        ②列族和列过滤器

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

        ③值过滤器

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

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数据库的部署和操作-编程知识网

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

启动hadoop,启动hbase

新建Eclipse项目

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

在工程中导入外部jar包:

①Hadoop包(实验3)

②hbase包(全部):

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

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

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

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

【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

 【大数据存储技术】实验1 Hbase数据库的部署和操作-编程知识网

数据的删除:

【大数据存储技术】实验1 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))+" ");

        }

    }

}

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