zoukankan      html  css  js  c++  java
  • 【从零单排HBase 01】从一无所知到5分钟快速了解HBase

    最近公司正好准备投入HBase,因此做了一些基础学习准备,所以先暂时停止MySQL的更新,把HBase的学习心得跟大家分享一下,接下来一段时间都会发布HBase相关内容。

    在学的过程中,发现跟MySQL相互对比,能更深入地了解存储组件的设计。有任何问题或者想看的知识点,欢迎留言跟我沟通。

    1.前言

    随着公司业务不断发展,开始遇见越来越多的复杂存储场景。我们在关系型数据库上已经有了比较好的技术积累,但是并不能解决所有问题。

    因此,需要对更多存储类型做技术储备。

    HBase作为nosql的典型代表,是一个分布式的、面向列的开源数据库,在大数据存储上广受欢迎,因此,第一站就来到这里。

    网络上对于HBase的文档有很多,但是看了一圈,没有特别能让一个小白快速入门的介绍。

    本文作为一个入门文档,希望能通过自己的理解,来快速认识HBase到底是什么,它的结构、特点、适用场景有哪些,但不会有深入的技术点的说明。

    嗯,就是快速,非常快速并且丝滑地去理解HBase到底是啥。

    2. 适用场景

    一开始,我们肯定需要了解的是,为什么要用HBase。

    存储组件比较多,我们就简单谈谈MySQL和HBase的主要对比。

    从一无所知到5分钟快速了解HBase

     

    可以看到,在面对海量数据场景时,如果没有较强的事务要求,查询比较简单,那么HBase是非常适合的。

    2. 基本概念

    2.1 表、行、列和单元格

    为什么正文要从这里开始呢?

    因为这个是一切的基础,也是我们初次接触HBase最先想到的问题,HBase的数据格式是怎样的?

    但是在入门HBase的过程中,发现一个小白想搞明白HBase到底是个什么存储格式还是挺费劲的。

    比如给你这样一个HBaes的数据结构,是不是比较难理解是一个怎样的层级概念?

    从一无所知到5分钟快速了解HBase

     

    一个好的办法就是做 知识的迁移。所以,从我们熟悉的Mysql来说,是个非常好的方式。

    Mysql的表结构我们非常熟悉,所以第一个问题就是,Mysql的表记录在HBase中是如何存储呢?

    我们来举个例子,有两张mysql的表,表名叫user和location,表记录如下。

    user表

    从一无所知到5分钟快速了解HBase

     

    location表

    从一无所知到5分钟快速了解HBase

     

    这样的结构,在HBase中的逻辑存储应该是这样的。

    从一无所知到5分钟快速了解HBase

     

    抽象出来的概念如下

    从一无所知到5分钟快速了解HBase

     

    相信有了这样直接的对比,不用我说,大家也能明白HBase的基本存储概念了。

    • RowKey:是Byte array,是表中每条记录的“主键”,方便快速查找,Rowkey的设计非常重要。
    • Column Family:列族,拥有一个名称(string),包含一个或者多个相关列
    • Column:属于某一个column family,familyName:columnName,每条记录可动态添加
    • Value(Cell):Byte array
    • Version Number:类型为Long,默认值是系统时间戳,可由用户自定义(这个概念在上文的逻辑存储中不太好迁移类比,所以上文的模型中没有给出,可以理解为mysql中的mvcc的版本号)

    那么,在HBase中确定一个值的方式就比较清楚了。

    从一无所知到5分钟快速了解HBase

     

    通过RowKey-CF-Column-Version我们就能找到Value,这样就明白了KV的查询的结构关系。

    如果用代码来简单表示,可以这样显示:

    SortedMap<RowKey, List<SortedMap<Column,List<Value,TimeStamp>>>>

    做个小结:

    最基本的单位是列(column)。一列或者多列形成行(row),并且由唯一的行键(row key)来确定存储。反过来,一个表(table)中由若干行,其中每列可能由多个版本(version),在每一个单元格(cell)中存储了不同的值。

    2.2 分区概念

    第二章对存储结构做了比较直白的说明,下面介绍HBase另一个比较核心的概念:regin。

    HBase中扩展和负载均衡的基本单位称为regin,regin本质上是以行键排序的连续存储的区间。

    如果regin太大,系统会自动进行拆分(在中间的行键进行一拆二),反之,会把多个regin合并(非自动),以减少存储文件数量。

    如果类比mysql,可以看作是分区表partition的概念。

    每一个regin只能由一台regin服务器(region server)加载,每一台region server可以加载多个region。

    3. 架构

    这张图是HBase非常经典的整体架构图。图中展示了HBase的各种组件。

    从一无所知到5分钟快速了解HBase

     

    1)Client

    Client包含了访问Hbase的接口,另外Client还维护了对应的cache来加速Hbase的访问,比如cache的.META.元数据的信息。

    2) Zookeeper

    Hbase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。具体工作如下:

    • 通过Zoopkeeper来保证集群中只有1个master在运行,如果master异常,会通过竞争机制产生新的master提供服务
    • 通过Zoopkeeper来监控RegionServer的状态,当RegionSevrer有异常的时候,通过回调的形式通知Master RegionServer上下线的信息
    • 通过Zoopkeeper存储元数据的统一入口地址

    3) HMaster

    • master节点为RegionServer分配Region
    • 维护整个集群的负载均衡
    • 维护集群的元数据信息
    • 发现失效的Region,并将失效的Region分配到正常的RegionServer上
    • 当RegionSever失效的时候,协调对应Hlog的拆分

    4)HReginServer

    HregionServer直接对接用户的读写请求,是真正的“干活”的节点。它的功能概括如下:

    • 管理master为其分配的Region 处理来自客户端的读写请求
    • 负责和底层HDFS的交互,存储数据到HDFS
    • 负责Region变大以后的拆分
    • 负责Storefile的合并工作

    5) HDFS

    HDFS为Hbase提供最终的底层数据存储服务,同时为Hbase提供高可用(Hlog存储在HDFS)的支持,具体功能概括如下:

    • 提供元数据和表数据的底层分布式存储服务
    • 数据多副本,保证的高可靠和高可用性

    看到这里了,原创不易,点个关注、点个赞吧,你最好看了~

    知识碎片重新梳理,构建Java知识图谱:https://github.com/saigu/JavaKnowledgeGraph(历史文章查阅非常方便)

    扫码关注我的公众号“阿丸笔记”,第一时间获取最新更新。同时可以免费获取海量Java技术栈电子书、各个大厂面试题。

    阿丸笔记

  • 相关阅读:
    ABAP接口用法
    监听textarea数值变化
    The first step in solving any problem is recognizing there is one.
    Wrinkles should merely indicate where smiles have been.
    God made relatives.Thank God we can choose our friends.
    Home is where your heart is
    ABAP跳转屏幕
    Python 工具包 werkzeug 初探
    atom通过remote ftp同步本地文件到远程主机的方法
    Mongodb学习笔记一
  • 原文地址:https://www.cnblogs.com/awan-note/p/12458783.html
Copyright © 2011-2022 走看看