Hadoop框架之存储系统Hbase(一)

Hadoop框架之存储系统Hbase(一)

  1. Hbase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统,

  2. Hbase特点

    1)海量存储:Hbase 适合存储 PB 级别的海量数据,在 PB 级别的数据以及采用廉价 PC 存储的情况下,能在几十到百毫秒内返回数据。这与 Hbase 的极易扩展性息息相关。正式因为 Hbase 良好的扩展性,才为海量数据的存储提供了便利。

    2)列式存储:这里的列式存储其实说的是列族(ColumnFamily) 存储, Hbase 是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定。

    3)极易扩展:Hbase 的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。通过横向添加 RegionSever 的机器,进行水平扩展,提升 Hbase 上层的处理能力,提升 Hbsae服务更多 Region 的能力。
    备注: RegionServer 的作用是管理 region、承接业务的访问, 这个后面会详细的介绍通过横向添加 Datanode 的机器,进行存储层扩容,提升 Hbase 的数据存储能力和提升后端存储的读写能力 。

    4)高并发(多核):在并发的情况下,Hbase的单个IO延迟下降不多,能够获得高并发、低延迟的服务。

    5)稀疏:稀疏主要是针对 Hbase 列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。

  3. HBase架构

在这里插入图片描述

	从图中可以看出 Hbase 是由 Client、Zookeeper、Master、HRegionServer、HDFS 等

几个组件组成,下面来介绍一下几个组件的相关功能:
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(NameNode)
master 节点的主要职责如下:
为 RegionServer 分配 Region
维护整个集群的负载均衡
维护集群的元数据信息
发现失效的 Region,并将失效的 Region 分配到正常的 RegionServer 上当 RegionSever 失效的时候,协调对应 Hlog 的拆分
4)HregionServer(DataNode)
HregionServer 直接对接用户的读写请求,是真正的“干活”的节点。它的功能概括如下:
管理 master 为其分配的 Region
处理来自客户端的读写请求
负责和底层 HDFS 的交互,存储数据到 HDFS
负责 Region 变大以后的拆分
负责 Storefile 的合并工作
5)HDFS
HDFS 为 Hbase 提供最终的底层数据存储服务,同时为 HBase 提供高可用(Hlog 存储在HDFS)的支持,具体功能概括如下:提供元数据和表数据的底层分布式存储服务数据多副本,保证的高可靠和高可用性

  1. HBase中的角色

    (1)HMaster

    功能
    1.监控 RegionServer
    2.处理 RegionServer 故障转移
    3.处理元数据的变更
    4.处理 region 的分配或转移
    5.在空闲时间进行数据的负载均衡
    6.通过 Zookeeper 发布自己的位置给客户端

    (2)RegionServer

    功能
    1.负责存储 HBase 的实际数据
    2.处理分配给它的 Region
    3.刷新缓存到 HDFS
    4.维护 Hlog
    5.执行压缩
    6.负责处理 Region 分片

    (3)HLOG

    HBase 的修改记录,当对 HBase 读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

    (4)Region

    Hbase 表的分片,HBase 表会根据 RowKey 值被切分成不同的 region 存储在 RegionServer中,在一个 RegionServer 中可以有多个不同的 region。

    (5)Store

    HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族(列簇, Column Family)。

    (6)MemStore

    顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL 中之后,RegsionServer 会在内存中存储键值对。

    (7)HFile

    这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile 是以 Hfile的形式存储在 HDFS 的。

  2. HBase Shell操作

    1. 进入HBase客户端
    [ityouxin@hadoop102 hbase]$ bin/hbase shell
    2. 表的操作
    	创建表
    	create ‘student’,'info'
    	插入数据
    	put 'student','1001','info:sex','male'
    	put  'student'.'1001','info:age','18'
    	put 'student','1002','info:name','janna'
    	put 'student','1002','location:city','bj'
    	扫描查看表数据
    	scan 'student'
    	scan 'student',{startrow=>'1001',stoprow =>'1001'}
    	查看表的结构
    	describe 'student'
    	更新指定字段的数据
    	put 'student','1001','info:name','nck'
    	查看指定行或者制定列族:列的数据
    	get 'student','1001','info:name'
    	删除rowKey的全部数据
    	deleteaall ‘student’
    	清空表数据
    	truncate ‘student’
    	删除表
    	disabletabledrop ‘student’
    	变更表信息
    	alter3,'student' {NAME=>'info',VERSIONS=>3}
        get 'student'.'1001',{COLUMN=>'ifo:name',CERSIONS=>3}
    
  3. Hbase数据结构

    1. RowKey

      与 nosql 数据库们一样,RowKey 是用来检索记录的主键。访问 HBASE table 中的行,只
      有三种方式:
      1.通过单个 RowKey 访问(get)
      2.通过 RowKey 的 range(正则) (like)
      3.全表扫描(scan)
      RowKey 行键 (RowKey)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为10-100bytes),在 HBASE 内部, RowKey 保存为字节数组。 存储时,数据按照 RowKey 的字典序(byte order)排序存储。设计 RowKey 时,要充分排序存储这个特性,将经常一起读取的
      行存储放到一起。 (位置相关性)

    2. Column Family

      列族: HBASE 表中的每个列,都归属于某个列族。列族是表的 schema 的一部 分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如 courses:history, courses:math都属于 courses 这个列族。

    3. Cell

      由{rowkey, column Family:columu, version} 唯一确定的单元。 cell 中的数据是没有类型的,全部是字节码形式存贮。

    4. Time Stamp

      ​ HBASE 中通过 rowkey和columns 确定的为一个存贮单元称为cell。每个 cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64 位整型。时间戳可以由 HBASE(在数据写入时自动 )赋值,此时时间戳是精确到毫秒 的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版 本冲突,就必须自己生成具有唯一性的时间戳。每个 cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
      ​ 为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担, HBASE 提供 了两种数据版本回收方式。一是保存数据的最后 n 个版本,二是保存最近一段 时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。

    5. 命名空间

      1. Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在 default 默认的命名空间中。
      2. RegionServer group: 一个命名空间包含了默认的 RegionServer Group。
      3. Permission: 权限,命名空间能够让我们来定义访问控制列表 ACL(Access Control List)。例如,创建表,读取表,删除,更新等等操作。
      4. Quota: 限额,可以强制一个命名空间可包含的 region 的数量。
  4. HBase原理

    读流程

    1)Client先访问zookeeper,从meta表读取region的位置,然后读取meta表中的数据。meta中又存储了用户表的region信息;

    2)根据namespace、表名和rowkey在meta表中找到对应的region信息;

    3)找到这个region对应的regionserver;

    4)查找对应的region;

    5)先从MemStore找数据,如果没有,再到BlockCache里面读;

    6)BlockCache还没有,再到StoreFile上读(为了读取的效率);
    7)如果是从StoreFile里面读取的数据,不是直接返回给客户端,而是先写入BlockCache,再返回给客户端。

    写流程

    1)Client向HregionServer发送写请求;

    2)HregionServer将数据写到HLog(write ahead log)。为了数据的持久化和恢复;

    3)HregionServer将数据写到内存(MemStore);

    4)反馈Client写成功。

  5. 数据flush过程

    1)当MemStore数据达到阈值(默认是128M,老版本是64M),将数据刷到硬盘,将内存中的数据删除,同时删除HLog中的历史数据;

    2)并将数据存储到HDFS中;

    3)在HLog中做标记点。

  6. 数据合并过程

    1)当数据块达到3块,Hmaster触发合并操作,Region将数据块加载到本地,进行合并;

    2)当合并的数据超过256M,进行拆分,将拆分后的Region分配给不同的HregionServer管理;

    3)当HregionServer宕机后,将HregionServer上的hlog拆分,然后分配给不同的HregionServer加载,修改.META.;

    4)注意:HLog会同步到HDFS。

  7. HBase三个重要机制

    flush机制
    1.(hbase.regionserver.global.memstore.size)默认;堆大小的40%
    	regionServer的全局memstore的大小,超过该大小会触发flush到磁盘的操作,默认是堆大小的40%,而且regionserver级别的flush会阻塞客户端读写
    2.(hbase.hregion.memstore.flush.size)默认:128M
    	单个region里memstore的缓存大小,超过那么整个HRegion就会flush,
    3.(hbase.regionserver.optionalcacheflushinterval)默认:1h内存中的文件在自动刷新之前能够存活的最长时间
    4.(hbase.regionserver.global.memstore.size.lower.limit)默认:堆大小* 0.4 * 0.95
    	有时候集群的“写负载”非常高,写入量一直超过flush的量,这时,我们就希望memstore不要超过一定的安全设置。在这种情况下,写操作就要被阻塞一直到memstore恢复到一个“可管理”的大小,这个大小就是默认值是堆大小* 0.4 * 0.95,也就是当regionserver级别的flush操作发送后,会阻塞客户端写,一直阻塞到整个regionserver级别的memstore的大小为堆大小* 0.4 *0.95为止
    5.(hbase.hregion.preclose.flush.size)默认为:5M
    	当一个region中的memstore的大小大于这个值的时候,我们又触发了close.会先运行“pre-flush”操作,清理这个需要关闭的memstore,然后将这个region下线。当一个region下线了,我们无法再进行任何写操作。如果一个memstore很大的时候,flush操作会消耗很多时间。"pre-flush"操作意味着在region下线之前,会先把memstore清空。这样在最终执行close操作的时候,flush操作会很快。
    6.(hbase.hstore.compactionThreshold)默认:超过3个
    	一个store里面允许存的hfile的个数,超过这个个数会被写到新的一个hfile里面也即是每个region的每个列族对应的memstore在fulsh为hfile的时候,默认情况下当超过3个hfile的时候就会对这些文件进行合并重写为一个新文件,设置个数越大可以减少触发合并的时间,但是每次合并的时间就会越长。
    compact机制
    把小的storeFile文件合并成大的Hfile文件。清理过期的数据,包括删除的数据将数据的版本号保存为1个
    split机制
    	当Region达到阈值,会把过大的Region一分为二。默认HFile达到10Gb的时候就会进行切分
    

时候就会对这些文件进行合并重写为一个新文件,设置个数越大可以减少触发合并的时间,但是每次合并的时间就会越长。
compact机制
把小的storeFile文件合并成大的Hfile文件。清理过期的数据,包括删除的数据将数据的版本号保存为1个
split机制
当Region达到阈值,会把过大的Region一分为二。默认HFile达到10Gb的时候就会进行切分
```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值