美文网首页
HBase概述

HBase概述

作者: reco171 | 来源:发表于2022-02-24 15:42 被阅读0次

      Apache HBase是列式存储的NoSQL数据库,一个实时读写数据库系统,提供分布式、可伸缩的大数据存储。为什么HBase能存储海量的数据?因为HBase是在HDFS的基础之上构建的,HDFS是分布式文件系统。

    1. HBase数据模型
      HBase有表、行和列的概念。一行数据由一个行键和一个或多个相关的列以及它的值所组成,定位一行数据会有一个唯一的值,这个叫做行键(RowKey)。
      数据写到HBase的时候都会被记录一个时间戳,这个时间戳被我们当做一个版本。比如说,我们修改或者删除某一条的时候,本质上是往里边新增一条数据,记录的版本加一了而已。
    2. HBase 的Key-Value
      Key由RowKey(行键)+ColumnFamily(列族)+Column Qualifier(列修饰符)+TimeStamp(时间戳--版本)+KeyType(类型)组成,而Value就是实际上的值。
      修改一条数据其实上是在原来的基础上增加一个版本的,那要准确定位一条数据,就得根据(RowKey+Column+时间戳)定位。
    3. HBase列族存储架构
      (1)HBase读写数据的内部流程如下
      1)、Client客户端,它提供了访问HBase的接口,并且维护了对应的cache来加速HBase的访问。
      2)、Zookeeper存储HBase的元数据(meta表),无论是读还是写数据,都是去Zookeeper里边拿到meta元数据告诉给客户端去哪台机器读写数据
      3)、HRegionServer它是处理客户端的读写请求,负责与HDFS底层交互,是真正干活的节点。
      大致流程就是:client请求到Zookeeper,然后Zookeeper返回HRegionServer地址给client,client得到Zookeeper返回的地址去请求HRegionServer,HRegionServer读写数据后返回给client。
      (2) HBase列式存储
      一个HBase表首先要定义列族,然后列是在列族之下的,列可以随意添加。
      一个列族的数据是存储在一起的,所以一个列族的数据是存储在一个Store里边的。
      HBase在写数据的时候,会先写到Mem Store,当MemStore超过一定阈值,就会将内存中的数据刷写到硬盘上,形成StoreFile,而StoreFile底层是以HFile的格式保存,HFile是HBase中KeyValue数据的存储格式。
      1)、HRegionServer一般和DataNode在同一台机器上运行,实现数据的本地性。
      2)、HRegionServer包含多个HRegion,由WAL(HLog)、BlockCache、MemStore、HFile组成。
    4. RowKey的设计及优化手册
        RowKey是会按字典序排序的,HBase表会用RowKey来横向切分表。
      无论是读和写都是用RowKey去定位到HRegion,然后找到HRegionServer。这里有一个很关键的问题:那我怎么知道这个RowKey是在这个HRegion上的?
      HRegion上有两个很重要的属性:start-key和end-key。
      RowKey是以字典序排序的,如果对RowKey没有做任何处理,那就有可能存在热点数据的问题。
        HBase优化手册:
      建表申请时的预分区设置,对于经常使用HBase的小伙伴来说,HBase管理平台里申请HBase表流程必然不陌生了。
      给定split的RowKey组例如:aaaaa,bbbbb,ccccc;或给定例如:startKey=00000000,endKey=xxxxxxxx,regionsNum=x'
      第一种方式:
      是自己指定RowKey的分割点来划分region个数.比如有一组数据RowKey为[1,2,3,4,5,6,7],此时给定split RowKey是3,6,那么就会划分为[1,3),[3,6),[6,7)的三个初始region了.如果对于RowKey的组成及数据分布非常清楚的话,可以使用这种方式精确预分区。
      第二种方式 :
      如果只是知道RowKey的组成大致的范围,可以选用这种方式让集群来均衡预分区,设定始末的RowKey,以及根据数据量给定大致的region数,一般建议region数最多不要超过集群的rs节点数,过多region数不但不能增加表访问性能,反而会增加master节点压力.如果给定始末RowKey范围与实际偏差较大的话,还是比较容易产生数据热点问题.
      最后:生成RowKey时,尽量进行加盐或者哈希的处理,这样很大程度上可以缓解数据热点问题.
    5. 根据RowKey范围查询
      (1)HBase将RowKey设计为字典序排序,如果不做限制,那很可能类似的RowKey存储在同一个HRegion中。那我正好有这个场景上的业务,那我查询的时候不是快多了吗?在同一个HRegion就可以拿到我想要的数据了。
       举个例子:定时采集直播间热度数据,将采集数据存储到HBase中,然后应用方经常要把主播的一段时间内的热度给查询出来。
      (2)设计好的RowKey,将该主播(车辆)的一段时间内的热度位置信息都写到同一个HRegion上,拉取的时候只要访问一个HRegionServer就可以得到全部我想要的数据了,那查询的速度就快很多。
    6. HBase是一个NoSQL数据库,一般我们用它来存储海量的数据(因为它基于HDFS分布式文件系统上构建的)
      (1)HBase的一行记录由一个RowKey和一个或多个的列以及它的值所组成。先有列族后有列,列可以随意添加。
      (2)HBase的增删改记录都有「版本」,默认以时间戳的方式实现。
      (3)RowKey的设计如果没有特殊的业务性,最好设计为散列的,这样避免热点数据分布在同一个HRegionServer中。
      (4)HBase的读写都经过Zookeeper去拉取meta数据,定位到对应的HRegion,然后找到HRegionServer。
      参考:
      [1]我终于看懂了HBase,太不容易了...
      [2]Rowkey设计指南

    相关文章

      网友评论

          本文标题:HBase概述

          本文链接:https://www.haomeiwen.com/subject/ocsozltx.html