HBase 数据读写流程

读数据

HBase的表是按行拆分为一个个 region 块儿,这些块儿被放置在各个 regionserver 中

假设现在想在用户表中获取 row keyrow0001 的用户信息

要想取得这条数据,就需要先找到含有此条记录的 region

HBase 是如何定位到具体 regionserver 中的具体 region 的呢?

HBase 中有一个内置的 hbase:meta 表,其中记录了所有表的所有 region 的详细信息

例如 region 的 开始KEY结束KEY所在server的地址……

hbase:meta 表就像一个目录,通过他可以快速定位数据的实际位置

hbase:meta 表是存储在 ZooKeeper 中的,所以客户端就需要先访问 ZooKeeper,获取到 hbase:meta,从中查询出目标数据是在哪个 regionserver 中的哪个 region 中,然后到 region 中进行读取

我们可能会感觉这个寻址路径有点长,所以客户端会将查询过的位置信息保存缓存起来,方便以后快速读取

写数据

写操作会被分配到对应的 regionserver 进行处理,先回顾一下 regionserver 的结构

从客户端来看,写操作比较简单,写请求到达 regionserver 后,这些修改会先被写到 MemStoreHLog 中,成功写入后便会通知客户端写入完成了

MemStore 是内存缓存,保存最近更新的数据 HLog 是日志文件,记录着所有的更新操作

对于系统来说,写操作还没完,系统会定期调用刷新缓存的方法,把MemStore中的内容写入文件,生成一个新的 StoreFile,然后把缓存清空,并在HLog中做一个标记,表明上面的内容已经写入文件

这样,数据就真正落地了,但写操作会引发一些后续问题,例如HLog日志文件越来越大了、StoreFile越来越多了、当前region越来越大了,所以,系统有还有更多的工作需要做

  • 系统会定期清理HLog日志文件,把其中已经写入文件的记录删除
  • StoreFile 文件数量超过设定值时,会触发合并操作,合并成一个大文件,如果这个大文件超过了设定值,会再被分割开
  • region的大小达到阈值时,会被切分开,生成一个新的regionHMaster会对其进行管理,分配到合适的 regionserver
  • region的变化后,系统还需要对 hbase:meta 表进行维护

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2016-10-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java进阶

再谈session 和 cookie的差异

2808
来自专栏大壮

iOS GCD定时器

3493
来自专栏IT可乐

Linux系列教程(二十一)——Linux的bash基本功能

  上篇博客我们介绍了什么是shell,以及编写shell脚本的两种执行方式。我们知道在敲命令的时候,有很多快捷键,比如tab键能补全命令,在比如为什么我们直接...

2038
来自专栏向治洪

android studio编译慢的问题

1.修改android studio的使用堆内存,根据自己电脑的内存,尽量设置的大一点,点击help->如下图: ? ?    2.接下来设置使用离线gradl...

2458
来自专栏遊俠扎彪

inux (CentOS 5.6) 安装 Sun JDK (切换自带OpenJDK)

可根据需要卸载不需要的JDK Version

2008
来自专栏电光石火

EMLOG无插件实现网站源码压缩

在以往的Emlog优化教程中,相信都是使用的代码压缩插件,今天主要是分享插件的代码版本,也就是不使用插件,直接将代码丢在module.php中就可以,好吧,又消...

2735
来自专栏喵了个咪的博客空间

PhalApi-RabbitMQ基于PhalApi专业队列拓展

PhalApi-RabbitMQ基于PhalApi专业队列拓展 ? 前言 RabbitMQ一直都是队列中的标杆,这次有幸PhalApi也能啃上RabbitMQ真...

3187
来自专栏linux驱动个人学习

中断标志位 IRQF_ONESHOT

1744
来自专栏Java成神之路

Idea_学习_09_Idea 方法自动生成参数默认名

生成方法后,还空着参数,可以使用 ctrl + alt + 空格 ,列出参数,然后选择参数即可。

1224
来自专栏好好学习吧

testng执行多个suite

由于testng.xml中只能设置一个<suite>标签,就无法创建多个测试集,通过<suite-files >标签可以实现允许多个测试集。

4431

扫码关注云+社区

领取腾讯云代金券