Hbase入门 数据结构 基础API

一、简介

定义

Hbase是一种分布式,可扩展,支持海量数据存储的nosql数据库

HBase是谷歌BigTable的开源实现,使用zookeeper作为HA的管理,使用hdfs作为底层的数据存储

hive和hbase

hive本身不存储和计算数据,hive中的表纯逻辑。hive的意义可以理解为是把简单易写的hive sql转换成复杂难写的MapReduce程序。所以hive其实是MapReduce(大数据的一种计算框架)的一个包装。

hbase是物理表,不是逻辑表,且hbase比hive高效的多。是一种分布式,可扩展,大容量的数据库。

数据模型

逻辑上,Hbase的数据模型同关系型数据库很类似,数据存储在一张表上,有行有列。但是从底层物理存储结构(K-V)看,Hbase更像是一个multi-dimensional map.(多维度的表)

有列族,row_key

在这里插入图片描述

纵向有region区域,横向有列族,都是因为数据量太大,划分区域处理的原因。

NameSpace

命名空间,类似于数据库的database,有两个hbase自带的命名空间,一个default 一个hbase,hbase是系统内部的,不要用。

Region

类似于数据库的表,不同的是,Hbase定义表只需要定义列族就可以,不需要声明具体的列,这也意味着hbase的数据量大,能够轻松应对字段变更的场景。

Row

hbase中每行数据都由一个rowkey和多个column(列)组成,数据是按照rowkey的字典顺序存储的,并且查询数据时只能按照rowkey来查,所以rowkey的设计十分重要。

Column

hbase中每个列都由Column Family(列族)和Column Qulifier(列限定符)进行限定,建表时只需指定Column Family即可。

Time Stamp

时间戳,用于标识数据的不同版本。

Cell

由{rowkey,column:column qulifier,time stamp}组成的唯一确定的单元,cell中的数据是没有类型的,都是字节码形式存储。

二、Hbase架构

Master的作用,管理table的增删改查,分配regions到每个RegionServer,监控每个RegionServer的状态。

RegionServer,管理region,region去存储管理数据。

数据库的DDL和DML语言

ddl代表数据定义语言,是一种有助于创建数据库模式的SQL命令。比如create,drop,alter,truncate和rename等

dml代表数据操作语言,是一种有助于检索和管理关系数据库中数据的SQL命令。比如:insert,update,delete和select等等。

高级架构

与mysql的binlog相似,hbase也有hlog

hbase读比写慢(与常见的数据库不同)

写操作

通过事务保证一致性。

把回滚的判断写到finally里面,以此来保证一定会执行判断是否成功写入。

hive也支持更新操作,但是更新起来特别的慢,所以几乎从来不会用到。hbase和hive是相似的。

Shell操作

主要就是DDL(操作表) 和 DML(操作数据)

三、Hbase API

添加依赖:

org.apache.hbase

hbase-client

hbase-server

admin

判断表是否存在

    // 1.判断表是否存在
    public static boolean isTableExist(String tableName) throws IOException {
    
    
        // 1.获取配置文件
        HBaseConfiguration hBaseConfiguration = new HBaseConfiguration();
        hBaseConfiguration.set("hbase.zookeeper.quorum", "hadoop102,hadoop103,hadoop104");
        // 2.获取管理员对象
        HBaseAdmin admin = new HBaseAdmin(hBaseConfiguration);
        boolean tableExists = admin.tableExists(tableName);
        return tableExists;
    }

上面这种已过时,但是功能也还可以

通过admin对象能够进行表的增删改查:表是否存在,删除表,增加列,等等

    // 1.判断表是否存在(新)
    public static boolean isTableExist(String tableName) throws IOException {
    
    
        // 1.获取配置文件
        Configuration hBaseConfiguration = HBaseConfiguration.create();
        hBaseConfiguration.set("hbase.zookeeper.quorum", "hadoop102,hadoop103,hadoop104");
        // 2.获取管理员对象
        HBaseAdmin admin = new HBaseAdmin(hBaseConfiguration);
        boolean tableExists = admin.tableExists(tableName);
        return tableExists;
    }

这种是未过时的。但是功能都是一样的。

删除表

    // 删除表
    public static void dropTable(String tableName) throws IOException {
    
    
        // 1.判断表是否存在
        if (isTableExist(tableName)){
    
    
            System.out.println("该表已存在");
            return;
        }
        // 2.使表下线
        admin.disableTable(tableName);
        // 3.删除表
        admin.deleteTable(tableName);
    }

创建表

   // 创建表
    public static void creatTable(String tableName, String ... cfs) throws IOException {
    
    
        // 1.判断是否存在列族信息
        if (cfs == null || cfs.length <= 0){
    
    
            System.out.println("请设置列族信息");
            return;
        }
        // 2.判断表是否存在
        if (isTableExist(tableName)){
    
    
            System.out.println("该表已存在");
            return;
        }
        // 3.创建表描述器
        HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
        // 4.循环添加列族信息
        for(String cf : cfs){
    
    
            // 5.创建列族描述器
            HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
            // 6.添加具体的列族信息
            hTableDescriptor.addFamily(hColumnDescriptor);
        }
        // 7.创建表
        admin.createTable(hTableDescriptor);
    }

猜你喜欢

转载自blog.csdn.net/GBS20200720/article/details/121189094