Hbase原理——写数据、读数据和布隆过滤器(算法)

写数据

客户端写数据–> put a rk1001 cf1:age 21 (a表 rk1001行 列族为cf 属性是age 值为21)

1.客户端写数据找zookeeper,知道要写的数据的元数据在哪个regionserver中
(由于表的META(元数据)过大,存储不了这么大的数据,只能存储META的位置)
2.zookeeper返回给客户端meta的位置
3.客户端向存有META的regionserver下载元数据表
(为什么要下载:因为meta比较大,实际存储meta的是HDFS,region server实际上存储的是HDFS上meta的逻辑指向)
4.客户端下载缓存,并解析META,获取存储该数据的host和regionname,找到给数据应该存储在哪个region server中
5.请求指定region server写数据
6.将数据写到region server a表 rk1001所在位置的内存中
(store代表表的列族,memStore代表写入的内存)
7.写入内存的同时,还将数据写入到WAL日志中
(目的是为了防止内存中的数据还没来得及flush到HDFS的时候机器宕机,实现了Hbase的HA模式)
8.将MemStore和WAL日志一起刷新到HDFS中,在刷新的过程中,MemStore生成StoreFile逻辑,所以说HDFS每存储一个hfile文件就会生成一个StoreFile逻辑
9.最后将数据写到HDFS中的对应目录文件中

  • 其中出现了flush,所以讲讲flush的时机

1.单个MemStore的大小达到128M刷新
2.手动强制刷新
3.机器内存达到阈值时,所有MemSrore刷新
4.写入的次数到达阈值的时候,会刷新

在这里插入图片描述

读数据

客户端读数据–> get a , rk1001 (读a表中的rk1001行的数据)
1.客户端向zookeeper集群中拿数据
2.zookeeper集群返回元数据所在的位置
3.客户端请求向region server中下载元数据
4.客户端存储并下载元数据
5.客户端解析元数据(META)
6.客户端请求读取对应的region server的region信息
7.读取的信息可能还在MemStore中没来得及flush到HDFS中,所以可以直接冲内存中获取
8.如果flush到HDFS中,会通过布隆过滤器快速从大量的hfile文件中找到存储该数据的hfile文件,并返回给客户端
9。在返回给客户端的时候会将数据缓存在region server的blockCache中,目的是为了客户端下次取同样数据的时候可以快速拿到,提高效率

在这里插入图片描述

布隆过滤器(算法)

其中在读数据的过程中提到了布隆过滤器,那为什么要有布隆过滤器呢?

  • 由于HDFS的对应文件夹中存储了大量的hfile文件
  • 布隆过滤器可以快速从大量的hfile文件中找到存储数据的那个文件
tomjim
01

可以将一个数组做成一个表
tom对应的索引为0
jim对应的索引为1
取数据是时
arr[0]---->tom
arr[1]---->jim

  • 通过这个可以想到
  • 将类名的Hashcode作为Key,将类作为Value
User_tomUser_jim
tom.hashcodejim.hashcode

从而可以通过类名的Hashcode找到对应的类

  • 布隆过滤器就是这个原理
  • 在hfile文件下个留一个1M的空间,存储一个1M大小的字节数组 102410248 个字节[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 …](如上图)
  • 在存储这个数据的时候会计算其数据的rowkey的hashcode值,对应的在hfile下面的空间做个标记(加入rk1001的哈希值为100,那么这个字节数组的第100位的0会变成1)
  • 这样在取数据的时候,读文件下面的字节数组就知道这个hfile中是否有要读取的数据
  • 这样大大加快了在HDFS中读数据的速度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值