专栏首页米虫的家BigData-Apache HBase数据库

BigData-Apache HBase数据库

HBase

HBase

Apache](https://www.apache.org/) HBase™ is the Hadoop database, a distributed, scalable, big data store.

一、HBase原理

1、数据模型

1 ) Name Space

命名空间,类似于关系型数据库的 DatabBase 概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是 hbasedefault,hbase 中存放的是 HBase 内置的表,default 表是用户默认使用的命名空间。

2 ) Region

类似于关系型数据库的表概念。不同的是,HBase 定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往 HBase 写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase 能够轻松应对字段变更的场景。

3 ) Row

HBase 表中的每行数据都由一个 RowKey 和多个 Column(列)组成,数据是按照 RowKey的字典顺序存储的,并且查询数据时只能根据 RowKey 进行检索,所以 RowKey 的设计十分重要。

4 ) Column

HBase 中的每个列都由 Column Family(列族)和 Column Qualifier(列限定符)进行限定,例如 info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义。

2、HBase基础架构

1 ) Region Server

Region Server 为 Region 的管理者,其实现类为 HRegionServer,主要作用如下: 对于数据的操作:get, put, delete; 对于 Region 的操作:splitRegion、compactRegion

2 ) Master

Master 是所有 Region Server 的管理者,其实现类为 HMaster,主要作用如下: 对于表的操作:create, delete, alter 对于RegionServer的操作:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移。

3 ) Zookeeper

HBase 通过 Zookeeper 来做 Master 的高可用、RegionServer 的监控、元数据的入口以及集群配置的维护等工作。

4 ) HDFS

HDFSHBase 提供最终的底层数据存储服务,同时为 HBase 提供高可用的支持。

3、HBase架构详解

1)StoreFile

保存实际数据的物理文件,StoreFileHFile 的形式存储在 HDFS 上。每个 Store 会有一个或多个 StoreFile(HFile),数据在每个 StoreFile 中都是有序的。

2)MemStore

写缓存,由于 HFile 中的数据要求是有序的,所以数据是先存储在 MemStore 中,排好序后,等到达刷写时机才会刷写到 HFile,每次刷写都会形成一个新的 HFile

3)WAL(Write-Ahead logfile)

由于数据要经 MemStore 排序后才能刷写到 HFile,但把数据保存在内存中会有很高的概率导致数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件中,然后再写入 MemStore 中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。(HLog)

4、HBase写流程

  • 1)Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server
  • 2)访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey,查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 tableregion 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
  • 3)与目标 Region Server 进行通讯;
  • 4)将数据顺序写入(追加)到 WAL;
  • 5)将数据写入对应的 MemStore,数据会在 MemStore 进行排序;
  • 6)向客户端发送 ack
  • 7)等达到 MemStore 的刷写时机后,将数据刷写到 HFile

5、读流程

  • 1)Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server
  • 2)访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey,查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 tableregion 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
  • 3)与目标 Region Server 进行通讯;
  • 4)分别在 Block Cache(读缓存),MemStoreStore File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)
  • 5) 将从文件中查询到的数据块(Block,HFile 数据存储单元,默认大小为 64KB)缓存到Block Cache
  • 6)将合并后的最终结果返回给客户端。

内存和磁盘同时读取,但是将两个数据进行对比,返回时间戳大的数据,所以说HBase读取比写入要慢得多

6、StoreFile Compaction

Compaction 分为两种,分别是 Minor CompactionMajor CompactionMinor Compaction会将临近的若干个较小的 HFile 合并成一个较大的 HFile,但不会清理过期和删除的数据Major Compaction 会将一个 Store 下的所有的 HFile 合并成一个大 HFile,并且会清理掉过期和删除的数据

二、HBase API使用(Java)

1、添加依赖

xml

<dependencies>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-server</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>1.3.1</version>
    </dependency>
</dependencies>

2、Java调用

java

package cn.buildworld.hbase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;

/**
 * @author MiChong
 * @date 2020-07-09 19:03
 */
public class Test {

    private static Connection connection = null;
    private static Admin admin = null;

    static {
        //1、获取配置文件信息
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum", "hadoop102,hadoop103,hadoop104");


        try {
            //2、创建连接对象
            connection = ConnectionFactory.createConnection(configuration);

            //3、创建Admin对象
            admin = connection.getAdmin();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void close() throws IOException {
        if (admin != null) {
            admin.close();
        }
        if (connection != null) {
            connection.close();
        }
    }

    //1、判断表是否存在
    public static boolean isTabExist(String tableName) throws IOException {
        //3、判断表是否存在
        boolean exists = admin.tableExists(TableName.valueOf(tableName));

        return exists;
    }

    // 2、创建表
    public static void createTable(String tableName, String... cfs) throws IOException {

        //判断参数是否为空
        if (cfs.length <= 0) {
            System.out.println("请设置");
            return;
        }

        //判断表是否存在
        if (isTabExist(tableName)) {
            System.out.println(tableName + "表已经存在");
            return;
        }

        //创建表描述器
        HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));

        for (String cf : cfs) {
            //创建列族描述器
            HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);

            //添加具体的列族信息
            hTableDescriptor.addFamily(hColumnDescriptor);
        }

        //创建表
        admin.createTable(hTableDescriptor);
        System.out.println(tableName + "表创建成功!");

    }

    //3、删除表
    public static void dropTable(String tableName) throws IOException {
        //1、判断表是否存在
        if (!isTabExist(tableName)) {
            System.out.println("要删除的表不存在!!!");
            return;
        }
        //2、使表下线
        admin.disableTable(TableName.valueOf(tableName));

        //3、删除表
        admin.deleteTable(TableName.valueOf(tableName));

        System.out.println(tableName + "表删除成功!!!");
    }

    //4、创建命名空间
    public static void createNameSpace(String ns) {
        //创建命名空间描述器
        NamespaceDescriptor build = NamespaceDescriptor.create(ns).build();

        try {
            //创建命名空间
            admin.createNamespace(build);
            System.out.println(ns + "命名空间已经创建完成!");
        } catch (NamespaceExistException ne) {
            System.out.println(ns + "命名空间已经存在!!!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //5、往表里面插入数据
    public static void putData(String tableName, String rowKey, String cf, String cn, String value) throws IOException {

        //获取表对象
        Table table = connection.getTable(TableName.valueOf(tableName));

        //创建put对象
        Put put = new Put(Bytes.toBytes(rowKey));

        //给put对象赋值
        put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn), Bytes.toBytes(value));

        //插入数据
        table.put(put);

        //关闭连接
        table.close();
    }

    //6、获取数据
    public static void getData(String tableName, String rowKey, String cf, String cn) throws IOException {

        //1、获取表对象
        Table table = connection.getTable(TableName.valueOf(tableName));

        //2、创建Get对象
        Get get = new Get(Bytes.toBytes(rowKey));

        //设置获取指定族的值
        //get.addFamily(Bytes.toBytes(cf));
        //获取指定族和指定列的值
        get.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn));

        //3、获取数据
        Result result = table.get(get);

        //4、解析result
        Cell[] cells = result.rawCells();
        for (Cell cell : cells) {
            System.out.println("CF:" + Bytes.toString(CellUtil.cloneFamily(cell))
                    + " --CN:" + Bytes.toString(CellUtil.cloneQualifier(cell))
                    + " --Value:" + Bytes.toString(CellUtil.cloneValue(cell)));
        }

        table.close();
    }

    //7、获取数据
    public static void scanTable(String tableName) throws IOException {

        //1、获取表对象
        Table table = connection.getTable(TableName.valueOf(tableName));

        //2、获取扫描器
        Scan scan = new Scan(Bytes.toBytes("1001"));

        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            for (Cell cell : result.rawCells()) {
                System.out.println("CF:" + Bytes.toString(CellUtil.cloneFamily(cell))
                        + " --CN:" + Bytes.toString(CellUtil.cloneQualifier(cell))
                        + " --Value:" + Bytes.toString(CellUtil.cloneValue(cell)));
            }
        }
        table.close();
    }

    //8、删除数据
    public static void deleteData(String tableName, String rowKey, String cf, String cn) throws IOException {

        Table table = connection.getTable(TableName.valueOf(tableName));

        //构建删除对象
        Delete delete = new Delete(Bytes.toBytes(rowKey));

        //删除指定的列族
        //delete.addFamily(Bytes.toBytes(cf));
        delete.addColumns(Bytes.toBytes(cf), Bytes.toBytes(cn));


        //执行删除操作
        table.delete(delete);

        table.close();
    }

    public static void main(String[] args) throws IOException {

        //1、测试表是否存在
        // System.out.println(isTabExist("student"));

        //2、创建表测试
        //createTable("idea:java", "class", "desc");

        //3、删除表测试
        //dropTable("teacher");

        //4、测试命名空间创建
        //createNameSpace("idea");

        //5、测试插入如数据
        //putData("student","1003","info","name","michong");

        //6、获取表数据
        //getData("student", "1001", "info", "sex");

        //7、扫描表
        //scanTable("student");

        //8、测试删除
        deleteData("student", "1002", "info", "name");

        close();
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 大数据与Hadoop最有影响力150人(英)

    There are more than 284 million activeusers on twitter. This makes following t...

    CSDN技术头条
  • [大数据架构 ]Apache大数据项目目录

    在使用BigData大约8年以上之后,我遇到了大量的项目。Esp Apache的运动对于BigData域非常强大。每个人都会提出一个针对特定解决方案的项目。但是...

    首席架构师智库
  • 0471-Oracle Goldengate实时复制Oracle数据到CDH Kafka

    Oracle Goldengate(以下简称OGG)是业界广泛使用的准实时数据复制软件,主要基于数据库日志进行变更数据的抽取,也就是我们常说的CDC(chang...

    Fayson
  • 新数仓系列:Hbase国内开发者生存现状(2)

    大数据前几年各种概念争论很多,NoSQL/NewSQL,CAP/BASE概念一堆堆的,现在这股热潮被AI接过去了。大数据真正落地到车联网,分控,各种数据分析等等...

    大数据和云计算技术
  • DBeaver连接hive、impala、phoenix、HAWQ、redis

    伴随着技术的不断发展与进步,我们会接触和使用越来越多的数据源。从经久不衰的MySQL、Oracle、SQLserver、DB2等关系数据库,到方...

    用户1148526
  • 云​大数据和计算技术周报(第43期)

    “大数据” 三个字其实是个marketing语言,从技术角度看,包含范围很广,计算、存储、网络都涉及,知识点广、学习难度高。

    大数据和云计算技术
  • Sqoop学习之路

    Sqoop (SQL to Hadoop) 是Apache顶级项⽬,官⽹地址:http://sqoop.apache.org.

    白贺
  • Hadoop基础教程-第10章 HBase:Hadoop数据库(10.5 HBase Shell)(草稿)

    第10章 HBase:Hadoop数据库 10.5 HBase Shell 10.5.1 官方快速入门教程 http://hbase.apache.org/bo...

    程裕强
  • 用户画像大数据环境搭建——从零开始搭建实时用户画像(四)

    本章我们开始正式搭建大数据环境,目标是构建一个稳定的可以运维监控的大数据环境。我们将采用Ambari搭建底层的Hadoop环境,使用原生的方式搭建Flink,D...

    实时计算
  • HBase 基本入门篇

    无论是 NoSQL,还是大数据领域,HBase 都是非常"炙热"的一门数据库。本文将对 HBase 做一些基础性的介绍,旨在入门。

    美码师
  • HBase 基本入门篇

    无论是 NoSQL,还是大数据领域,HBase 都是非常"炙热"的一门数据库。本文将对 HBase 做一些基础性的介绍,旨在入门。

    Bug开发工程师
  • CentOS 6.9 中 搭建 Hive

    8. 配置 /opt/apache-hive-2.1.1-bin/conf/hive-site.xml

    北漂的我
  • 大数据常用技术栈

    提起大数据,不得不提由IBM提出的关于大数据的5V特点:Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Ver...

    大数据学习与分享
  • 一站式大数据解决方案分析与设计实践 | BI无缝整合Apache Kylin

    本文已收录于Github仓库:《大数据成神之路》 地址:https://github.com/wangzhiwubigdata/God-Of-BigData

    王知无-import_bigdata
  • 大数据常用技术栈

    提起大数据,不得不提由IBM提出的关于大数据的5V特点:Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Ver...

    大数据学习与分享
  • 企业级数据迁移(sqoop建议收藏)

    在做数据导出之前,我们看一下已经完成的操作:数据分析阶段将指标统计完成,也将统计完成的指标放到Hive数据表中,并且指标数据存储到HDFS分布式文件存储系统。

    大数据老哥
  • BigData-数据仓库学习

    二者对比 对比属性 OLTP OLAP 读特性 每次查询只返回少量记录 对大量记录进行汇总 写特性 随机、低延时写入用户的输入 批量导入...

    MiChong
  • 大数据技术之_1

      从图中可以看出 Hbase 是由 Client、Zookeeper、Master、HRegionServer、HDFS 等几个组件组成,下面来介绍一下几个组...

    黑泽君
  • 大数据学习带你了解Hadoop如何高效处理大数据

    Hadoop与Google一样,都是小孩命名的,是一个虚构的名字,没有特别的含义。从计算机专业的角度看,Hadoop是一个分布式系统基础架构,由Apache基金...

    用户2292346

扫码关注云+社区

领取腾讯云代金券