聊一聊 HBase 是如何写入数据的?
2022-05-18 14:47
393 查看
hi,大家好,我是大D。今天继续了解下 HBase 是如何写入数据的,然后再讲解一下一个比较经典的面试题。
Region Server 寻址
- HBase Client 访问 ZooKeeper;
- 获取写入 Region 所在的位置,即获取 hbase:meta 表位于哪个 Region Server;
- 访问对应的 Region Server;
- 获取 hbase:meta 表,并查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 Region 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问;
写 Hlog
- HBase Client 向 Region Server 发送写 Hlog 请求;
- Region Server 会通过顺序写入磁盘的方式,将 Hlog 存储在 HDFS 上;
写 MemStore 并返回结果
- HBase Client 向 Region Server 发送写 MemStore 请求;
- 只有当写 Hlog 和写 MemStore 的请求都成功完成之后,并将反馈给 HBase Client,这时对于整个 HBase Client 写入流程已经完成。
MemStore 刷盘
HBase 会根据 MemStore 配置的刷盘策略定时将数据刷新到 StoreFile 中,完成数据持久化存储。
为什么要把 WAL 加载到 MemStore中,再刷写成 HFile 呢?
WAL (Write-Ahead-Log) 预写日志是 HBase 的 RegionServer 在处理数据插入和删除过程中用来记录操作内容的一种日志。每次Put、Delete等一条记录时,首先将其数据写入到 RegionServer 对应的 HLog 文件中去。
而WAL是保存在HDFS上的持久化文件,数据到达 Region 时先写入 WAL,然后被加载到 MemStore 中。这样就算Region宕机了,操作没来得及执行持久化,也可以再重启的时候从 WAL 加载操作并执行。
那么,我们从写入流程中可以看出,数据进入 HFile 之前就已经被持久化到 WAL了,而 WAL 就是在 HDFS 上的,MemStore 是在内存中的,增加 MemStore 并不能提高写入性能,为什么还要从 WAL 加载到 MemStore中,再刷写成 HFile 呢?
- 数据需要顺序写入,但 HDFS 是不支持对数据进行修改的;
- WAL 的持久化为了保证数据的安全性,是无序的;
- Memstore在内存中维持数据按照row key顺序排列,从而顺序写入磁盘;
所以 MemStore 的意义在于维持数据按照RowKey的字典序排列,而不是做一个缓存提高写入效率。
另外,非常欢迎大家加我VX: Abox_0226 ,备注「进群」,有关大数据技术的问题在群里一起探讨。
相关文章推荐
- 从hbase表1中读取数据,最终结果写入到hbase表2 ,如何通过MapReduce实现 ?
- hbase如何判断数据写入哪个region
- hbase如何确定一条新数据写入到哪个regionserver?
- logstash如何将kakfa合并的数据拆分然后写入ES
- C#程序中:如何向xml文件中写入数据和读取数据
- hive的数据导入与数据导出:(本地,云hdfs,hbase),列分隔符的设置,以及hdfs上传给pig如何处理
- uboot烧写yaffs2过程中,如何写入oob数据的 (转)
- 前端传值到数据库在谷歌chrom可以正常写入数据库数据表中,用ie浏览器传输数据库的值确是乱码该如何解决怎么办
- Bash 脚本中如何使用 here 文档将数据写入文件 | Linux 中国
- android中bluedroid如何读取pcm数据,并将其写入文件中?
- 如何获取自增长列(标识列)的ID,并写入另一张表(多对多关系插入数据示例)
- MapReduce读写结构化文件数据写入HBase表中
- Android设备如何保证数据同步写入磁盘的实现
- uboot烧写yaffs2过程中,如何写入oob数据的
- Hadoop中如何从hdfs中导入数据到hbase中
- hbase大规模数据写入的优化历程
- spark用saveAsHadoopDataset()算子写入hbase数据阻塞
- 在.net中如何把调用存储过程代码写入数据连接层中
- PHP如何把数据写入JSON文件并在另一PHP文件读取JSON数据?
- VC++如何将缓冲数据写入到位图中