HBase相关

Hbase 是一个分布式的,可扩展的,大数据存储数据库。一种构建在HDFS上的分布式、面向列的存储系统。

原理

特点:列存储

  • 特点:
    • :一个表可以有上亿行,上百列 (Hbase的每个Region的列都很少)
    • 面向列:面向列表(簇:Columnfamily)的存储和权限控制,列(簇)独立检索
    • 稀疏:对于空(NULL)的列,并不占用存储空间。因此,表可以设计的非常稀疏。
    • 无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。
    • 数据多版本:每个单元的数据可以有多个数据版本,默认情况下,版本号自动分配,版本号就是单元格插入的时间戳。
    • 数据类型单一:Hbase中的数据都是字符串,没有类型。

总体架构

输入图片说明

组成

  • client:包含了访问HBase的接口,并维护cache来加快对HBase的访问。
  • ZK:master和RegionServer启动时会向Zookeeper注册(服务发现)
    • 保证任何时候,集群只有一个mater。
    • 存储所有Region的寻址入口
    • 实时监控Region Server的上线和下线信息,并通知给master。服务发现
    • 存储HBase的Schema和table元数据。

输入图片说明

  • Hmaster:
    • 管理用户对Table的增删改查,为Region Server 分配region
    • 负责Region Server的负载均衡
    • 发现失效的Region Server 并重新分配其上的region
    • HDFS上的垃圾文件回收
    • 处理schema更新请求
    • 在Region Split后,负责新Region的分配
  • Region Server:
    • 维护master分配给他的region,除了这些region的I/O请求
    • 负责切分在运行过程中变得过大的region。
    • client 先从master和zk中获取Region Server的地址。然后读写直接通过Region Server获取
  • HRegion
    • table在行方向上分割为多个Region。Region 是HBase中分布存储和负载均衡的最小单元,不同的Region可以分片在不同的Region Server上,但同一个Region是不会拆分到多个Server上。
      • Client 要获取完整的一个Row数据,必须通过 row、column、timestamp 的负载均衡从不同的 Region Server 中的Region中获取具体数据,然后组装
    • 每个region由一下信息标识:
      • key:<表名,startRowKey,创建时间>
      • 由目录表 (-ROOT和.META) 记录该region的endRowkey。
  • Store
    • 每个Region有一个或多个store组成。
    • Hbase会把数据放在一个store里面,即为每个ColumnFamily见一个store。有几个columnFamily就有几个Store
  • MemStore
    • 保存数据的key-Values,存放在内存中
    • 当memStore大小达到一个阈值(默认64MB),Hbase会由一个线程将memStore会被flush到文件StoreFile,生成一个快照。
  • StoreFile:memStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。
  • HLog(WAL log:write ahead log):用来做灾难恢复使用,Hlog记录数据的所有变更,一旦Region Server 宕机,就可以从log中进行恢复。类似与:redis的 AOF
    • HLog文件就是一个普通的Hadoop Sequence File。
      • Sequence File 的value是key时HLogKey对象(?),其中记录了写入数据的归属信息。除了table和region名字外,还同时包括sequence number和timestamp,timestamp是写入时间,sequence number的起始值为0,或者是最近一次写入文件系统的sequence number。Sequence File的value是HBase的Key-Value对象,对应HFile中的KeyValue
  • LogFlusher:sync()将数据刷新到SequenceFileLogWriter实现
  • LogRoller

HRegion 定位与spilit

输入图片说明

  • -ROOT-表.META.表(这两个表也是存放在Region上)

    • Region元数据呗存储在.META.表中,随着Region增多,.META.表中的数据也会增大,并分裂成多个新的Region。为了定位 .META.表中每个Region的位置(存放在哪个.META.表中),把Region在哪个.META.表的元数据存放在-ROOT-表中,最后由Zookeeper记录-ROOT-表的位置信息。
    • -ROOT-表永远不会被分割,它只有一个Region,这样可以保证最多只需要三次跳转就可以定位任意一个Region。
    • client会将查询的位置信息保存缓存起来,缓存不会主动失效,因此如果client上的缓存全部失效,则需要进行6次网络来回,才能定位到正确的region,其中三次用来发现 缓存失效,另外三次用来获取位置信息。
  • 逻辑:

    • 通过zk里面的文件/hbase/rs得到 -ROOT-表的位置。-ROOT-表只有一个region
    • 通过 -ROOT表 查找Region在哪个**.META.表**中。
    • 通过 .META.表查找到索要的用户表region的位置。
  • Compact &&Split

输入图片说明

逻辑存储

  • 传统关系型数据库记录日志数据:

输入图片说明

  • Hbase面向列的存放方式:旧数据不会被覆盖,只会添加

输入图片说明

  • 逻辑结构:
    • Row key:是byte array(最大长度为64KB),作为每条记录的主键
      • 通过单个Row key访问
      • 通过Row key的range全表扫描
      • Row key可以任意字符串(最大长度是64K,实际应用中长度一般位10~100bytes),在Hbase内部Row key保存位字节数组。
    • Column Family:列簇,拥有一个名字,包含一个或者多个相关列
      • 每个Column family是存放在HDFS上的单独文件,空值不会被保存。
    • Column:列,属于某个columnfamily,familyName:columnName,每条记录可动态添加
      • Hbase通过Row 和 Column确定一个单元存储Cell。每个Cell都保存着同一份数据的多个版本。版本通过时间戳索引来索引,时间戳的类型是64位整型
    • Version Number:类型位Long,默认值是系统的时间戳,可有用户自定义
    • Value(Cell):Byte Array。
      • {row key,column(=<family>+<label>),version} 唯一去顶的单元。Cell里面没有类型,全部是字节码形式存储。

物理存储

  • HFileHBase的基础文件格式,所有的HBase都存放在HFile上面。如果说StoreFile是HBase数据存储的最小逻辑单位。那么HFile就相当于一个Linux的文件系统,映射物理磁盘和逻辑数据的最小单位。

    • 输入图片说明

      • Trailer:指针指向其它数据块的起始点。
      • File Info:记录了文件的一些meta信息。
      • Data Block:是hbase io的基础单元,为了提高效率,HRegionServer中有基于LRU的block cache机制。
      • 每个Data块的大小可以创建一个Table的时候通过参数指定(默认块大小64K),大号的Block有利于顺序scan,小号的Block有利于随机查询
      • 每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成,Magic内容就是一些随机数字,目的是防数据损坏。
    • 输入图片说明

      • 开始2个固定长度:表示key和value的长度
      • key:[RowKey的长度]-[Rowkey]-[ColumnFamily的长度]-[ColumnFamily]-[Qualifier]-[TimeStamp]-[key Type].key Type:在Put/Delete
  • HLog File:HBase的WAL(write ahead log)的存储个数,物理上是Hadoop的Sequence File。在处理插入和删除过程,用来记录操作内容的日志,只有日志写入成功,才会通知客户端操作成功

    • 输入图片说明
      • Sequence File的key是HLogKey的对象,HLogKey记录了写入数据的归属信息,除了table和Region名字外,同时还包括sequence number和timestamp,
        • sequence number起始值为0,或者最近一次存入文件系统中的sequence number
        • timestamp 是写入时间。

读写

  • 写入:
    • Client通过zookeeper的调度,
      • RowKey存在:查询到RowKey对应的-ROOT-和.META.的表,查询到对应RegionServer信息。向RegionServer发送PUT写请求,将put写入WriteBuffer,如果是批量提交,写满缓存后自动提交。
      • RowKey不存在:直接通过Hmaster负载到对应的Region中
    • RegionServer中数据写入Region的MemStore,知道MemStore达到预设的阈值。
    • MemStore中的数据被Flush成一个StoreFile
    • 随着StoreFile文件的不断增多,当数量增长到一定的阈值后,触发Compact操作,将多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除。
    • StroeFiles通过不端的Compact合并操作,会形成越来越大的StoreFile。
    • 当个StroeFile大小超过过一定阈值后,触发Split操作,把当前Region Split成2个新的Region。父Region会下线,新的Split出2个Region会被Hmaster分配到对应的RegionServer上,使得原先1个Region的压力得以分流到2个Region上。

输入图片说明

  • 读取:
    • Client访问Zookeeper,查找**-ROOT-表和.META.表**信息
    • 从**.META.表**中查询存放目标数据的Region信息,从而找到对应的RegionServer
    • 从RegionServer获取需要查找的数据。
    • RegionServer的内存分为MemStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求想到MemStore中查数据,查不到就到BlockCache中查,在查不到就会到StoreFile读,并把读的结果放入BlockCache。

安装

使用

猜你喜欢

转载自my.oschina.net/u/2246410/blog/1801962