HBase基础知识

6 篇文章 0 订阅
1 篇文章 0 订阅

1、HBase的概念

HBase 的原型是 Google 的 BigTable 论文,受到了该论文思想的启发,目前作为 Hadoop 的
子项目来开发维护,用于支持结构化的数据存储。
官方网站:http://hbase.apache.org

  1. 2006 年 Google 发表 BigTable 白皮书
  2. 2006 年开始开发 HBase
  3. 2008 年北京成功开奥运会,程序员默默地将 HBase 弄成了 Hadoop 的子项目
  4. 2010 年 HBase 成为 Apache 顶级项目
  5. 现在很多公司二次开发出了很多发行版本,你也开始使用了。

HBase中Region是分布式存储的最小单元,数据的最小数据单元是cell。
三篇论文:

  • GFS —> HDFS
  • Mapreduce —> Mapreduce
  • BigTable-----> Hbase hadoop base

2、HBase的特点

  • 没有主键,存在行键 rowkey 可以理解为主键
  • 在habase中使用namespasce 的概念替代database的概念
  • 在hbase中同样存在表的概念,和字段的概念
  • 列族 列簇 中才包含了字段,把相同属性的列划分为一组
    Hbase表

3、HBase的功能

mysql顶多处理千万级数据
oracle顶多处理亿级数据
Hbase处理亿级数据很轻松

HMaster功能:
  • 监控 RegionServer
  • 处理 RegionServer 故障转移
  • 处理元数据的变更
  • 处理 region 的分配或移除
  • 在空闲时间进行数据的负载均衡
  • 通过 Zookeeper 发布自己的位置给客户端
RegionServer功能:
  • 负责存储 HBase 的实际数据
  • 处理分配给它的 Region
  • 刷新缓存到 HDFS
  • 维护 HLog
  • 执行压缩
  • 负责处理 Region 分片

4、HBase架构图

HBase的架构

HBase 内置有 Zookeeper,但一般我们会有其他的 Zookeeper 集群来监管 master 和
regionserver,Zookeeper 通过选举,保证任何时候,集群中只有一个活跃的 HMaster,HMaster
与 HRegionServer 启动时会向 ZooKeeper 注册,存储所有 HRegion 的寻址入口,实时监控
HRegionserver 的上线和下线信息。并实时通知给 HMaster,存储 HBase 的 schema 和 table
元数据,默认情况下,HBase 管理 ZooKeeper 实例,Zookeeper 的引入使得 HMaster 不再是
单点故障。一般情况下会启动两个 HMaster,非 Active 的 HMaster 会定期的和 Active HMaster
通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个 HMaster 反而增加
了 Active HMaster 的负担。
一个 RegionServer 可以包含多个 HRegion,每个 RegionServer 维护一个 HLog,和多个 HFiles
以及其对应的 MemStore。RegionServer 运行于 DataNode 上,数量可以与 DatNode 数量一致。


HBase的流程图

HBase的流程图

读流程

Client客户端发送读的请求,会先访问到zookeeper,然后zookeeper将被访问数据的元数据返回给client,客户端根据元数据的描述信息找到存放数据的HReginServer,然后再寻找存放数据的HRegion。在这个里面首先去MemStoree内存中去寻找数据,如果找不到的话再去HFile中寻找数据,找到数据后就将数据返还给Client,这样读流程就结束了。

5、读流程的进一步细化

Client客户端发送写的请求给zookeeper,然后zookeeper把可以存储的位置的信息返回给Client,Client再根据位置信息找到对应的HRegion。在这里面数据先存放在MemStore内存中,然后MemStore再将数据写入到HLog中,当写入完毕后会返回给Client客户端一个成功的提示。
一旦MemStore往HLog传输信息后要再往HFile传入信息的时候挂掉了,重新启动后HLog会运行起来,把执行过的操作运行一遍,将数据再次写入到MemStore中,然后MemStore将数据传入到HFile中,传完之后就轮到HBase发挥作用,将HFile中的数据通过DFS Client客户端写入到HDFS的DataNode中,写完之后HFile会消失,变成存储的数据的元数据,之后访问数据的时候客户端如果走到访问HFile的步骤时会根据HFile存储的元数据找到HDFS中的数据。
尚硅谷的图片

HBase的寻址流程的细化

总共有四个请求响应
1、Client客户端将读的请求发送给zookeeper,zookeeper返回给客户端一个-ROOT-的
元数据信息。
2、Client根据元数据信息去Region Server中寻找-ROOT-,然后在-ROOT-中读取META的元数据信息,获取META location。
3、Client根据META location的信息寻找到.META,然后在.META中获取要访问的业务数据的信息。
4、Client根据.META根据.META location提供的信息找到Region,在Region里scan,找到目标数据并返回给Client客户端。

读流程的进一步细化

读流程的进一步细化

-ROOT-表中存放的是Region,Region就相当于一张table表,它存放的是.META表中各Regionx的元数据(META-REGION)。Region表中的各个Regionx存放的是B表中的数据(B-REGION)。B表中存放的是业务数据(REGION)。当找到数据之后就把数据返还给Client客户端。

Client在Region中读取信息的具体流程

Client在Region中的具体流程图

Client在Region中会先进入Region中的Store中,在Store中的内存区(memstore、blockcache)中寻找数据。

  • memstore是写内存,里面保存的是用户最新写入的数据。
  • blockcache是读内存,里面保存的是用户最新读取的数据。

Client会最先读取写内存,如果写内存中没有目标数据就会再去读取读内存,如果再没有找到目标数据那么会去HFile中寻找数据,HFile相当于DataNode,这里面存放所有的HBase中所有的数据,当然HFile有很多个。

读取数据的进一步细化

我要查找ROWKEY为22的数据

理解东西还是要举个栗子滴:
假设B表中的一个REGION存储的RowKey的数据量是30条。
Client客户端读取数据的时候是要带着它的RowKey去寻找数据的,首先zookeeper告诉Client-ROOT- location的信息,Client寻找就去寻找-ROOT-中Region的位置了。假如Client要找的RowKey是22。那么它会先在-ROOT-中寻找22所在的位置=>META-REGION1(1~ 60),然后再根据这个信息去找到META中的Region1的位置,再在Region1中寻找到B-REGION1(1~30),再根据这个信息去B表中的REGION1中查找它的目标数据RowKey:22。这样就找到了对应的RowKey了,最终返回到客户端Client。

6、写流程的进一步细化

写流程的进一步细化

Client客户端先向zookeeper发送写数据的请求,zookeeper返回给Client一个HRegion位置信息 (严格来讲并不是zookeeper来返回的,是通过-ROOT-与.META两张索引表最终得到的信息)。写数据的时候Client是跟RegionServer进行RPC通信连接(9000端口就是namenode的RPC端口),然后就可以开始写数据了。进入RegionServer后先写HLog,写完HLog后再将HLog中的数据写入到Store中的Memstore中,这样就算一次写入成功了。
MemStore会有一个数据冗余操作,当MemStore中存储的数据大于16KB时,就会将MemStore中的数据打包提交给一个缓冲队列,记作MemStore1。然后再在Store中重新再创建一个MemStore内存区,再次写数据,每一个写满的MemStore,都会打包提交到缓冲队列中。当缓冲队列中的MemStore存储满了之后,会根据队列中的先进先出的原则,将最先进去的MemStore1溢写到Store中变成一个HFile文件。所以就会出现一个Store中有许多的HFile文件。这时候一个HFile文件是16KB,如果有大量的HFile文件的话NameNode会炸掉的,因为这样会消耗大量的资源。所以HRegionServer会提供一个服务,在HRegionServer空闲的时候会在HDFS中将16KB的DataNode文件进行合并,或者是如果文件有些太大了那么HRegionServer就将HDFS中的这个文件分解成小一点的文件,如果合并或拆分完成了,那么之前的文件将被删除掉。

HRegionServer在HDFS中的操作


PS:

1、当memstore中的文件在队列中还没有达到阈值的时候是不会向StoreFile中的HFile中溢写数据的,虽然可以查到吧,这时候在HDFS中是找不到的。如果想要手动溢写的话就要写一句flush code操作,来将它溢写出来。当内存队列中的数据达到阈值的时候RegionServer会自动启动flush code,让数据溢写到HFile中。
2、在regionServer中首先需要内存的资源是很大的

比如: region01 数据达到一定的阈值就会分裂

Start end

1000 3000
region01-01: 1000- 15000
region01-02: 1500-3000

Master 将这个两个region分配到不同的regionserver中
region由一个或者多个strore组成 ,每一个store里面存储的列簇
store里面又由memStore 和0到多个strorefile组成
MemStore就是内存中划分的一块区域
storeFile 是指存储在HDFS上底层文件(HFile)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值