我们知道客户端是通过MultiServerCallable.call()调用multi()来进行RPC请求的。

1 RegionServer在接受到客户端写请求后,首先反序列化PUT对象,然后判断操作是否是原子性的,如果不是原子性的则调用doNonAtomicRegionMutatiOn操作

2 获取PUT请求中的row key,family,以及qualifier等信息

3 检查RegionServer上MemStore是否超过当前堆内存使用率的百分比,默认是0.4,你也可以通过hbase.regionserver.global.memstore.upper

Limit去配置;如果超过限制则唤醒Flush线程把当前占用内存最大的memstores,直到低于最低限制,参考参数hbase.regionserver.global.

memstore.lowerLimit

4 然后检查Region是否只读,检查当前Region的MemStore是否大于blockingMemStoreSize=(hbase.hregion.memstore.flush.size* hbase.

hregion.memstore.block.multiplier) ,如果大于则进行flush操作,释放内存

注意:

hbase.hregion.memstore.flush.size: 默认大小128M

hbase.hregion.memstore.block.multiplier: 默认倍数2倍

我们考虑一种情况,理想情况memstore达到128M时,就该刷新到StoreFile但是,这时候MemStore的数据是127M,然后下一个请求写的数据是100M,这时候MemStore会涨到会涨到228M > 128M,那么发生OOM的风险就增大了,所以HBase就让MemStore现在实际大小 超过默认hbase.hregion.memstore.block.multiplier倍时就暂时block该Region 的请求,然后进行flush,释放内存。

这两个参数的设置需要进行综合权衡,因为一旦flush了之后,就有可能发生compact、split操作,这时候是比较耗时的,可能达到十几秒之类的,如果是online应用是不可接受,我们可以适当增加hbase.hregion.memstore.block.multiplier这个倍数,然后内存不够用的话,还可以加内存。

以上步骤完成则正式进入写核心的写流程:

5 构造WALEdit

6 获取行锁,锁定row,如果之前还有事务未结束,等待之前的事务结束,获取Region更新锁,防止多个请求同时更新Region

7 从MultiVersionConsistencyControl(MVCC)获取一个Write Number,

主要用于HBase的在并发情况下的写一致性的前提下,保证高性能读取;构造一个往MemStore写的入口类WriteEntry

8 从PUT请求中获取<family,cell>映射,然后检查family,更新这次请求的时间戳,并设置到这次请求中,然后把这个操作放到一个集合中

9 遍历PUT操作的集合,获取每一个单元格,然后将其添加到WALEdit

10 遍历PUT操作集合,遍历每一个单元格,然后将其写入MemStore

11 遍历WALEdit,将日志添加到HLog中

12 释放Region更新锁和行锁

13 同步这WALEdit

14 最后会检查MemStore是否应该flush,如果满足flush条件,则进行flush操作

HBase之HRegionServer处理put请求相关推荐

  1. linux无法启动hbase密码,linux – 无法在请求的2181端口启动ZK,而导出HBASE_MANAGES_ZK = false...

    问题 第一个目标是独立运行HBase. HBase启动后,导航到ip:60010 / master-status是成功的. 第二个目标是运行一个独特的ZooKeeper仲裁. ZooKeeper已下载 ...

  2. 启动hbase后hregionserver没有启动

    log路径是: /home/appleyuchi/bigdata/hbase-2.2.4/logs 根据log来排错

  3. Linux环境HBase安装配置及使用

    Linux环境HBase安装配置及使用 1. 认识HBase (1) HBase介绍 HBase = Hadoop database,Hadoop数据库 开源数据库 官网:hbase.apache.o ...

  4. HBase源代码分析之MemStore的flush发起时机、推断条件等详情(二)

    在<HBase源代码分析之MemStore的flush发起时机.推断条件等详情>一文中,我们具体介绍了MemStore flush的发起时机.推断条件等详情.主要是两类操作.一是会引起Me ...

  5. hbase 租约超时及rpc超时出现的问题

    随着数据量的增大,HIVE查询HBase的时候又出现了scan数据缓慢的问题,在HBase regionserver的log中出现了如下错误: [plain] view plaincopy org.a ...

  6. Hadoop学习笔记—15.HBase框架学习(基础知识篇)

    Hadoop学习笔记-15.HBase框架学习(基础知识篇) HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase ...

  7. HBase:分布式列式NoSQL数据库

    传统的ACID数据库,可扩展性上受到了巨大的挑战.而HBase这类系统,兼具可扩展性的同时,也提出了类SQL的接口. HBase架构组成 HBase采用Master/Slave架构搭建集群,它隶属于H ...

  8. Hbase Compaction 源码分析 - CompactionChecker

    其他相关文章 Hbase Compaction 源码分析 - CompactionChecker Hbase Compaction 源码分析 - RatioBasedCompactionPolicy ...

  9. hbase 页面访问_HBase

    HBase 特点 海量存储 Hbase 适合存储 PB 级别的海量数据,在 PB 级别的数据以及采用廉价 PC 存储的情况下, 能在几十到百毫秒内返回数据.这与 Hbase 的极易扩展性息息相关.正式 ...

最新文章

  1. php mysql orm_PHP ORM操作MySQL数据库
  2. mysql 分区表优化_Sql优化之Mysql表分区
  3. Scrapy -- 05
  4. (二)html5中的属性
  5. javaone_Javaone 2013评论
  6. C语言switch中break的作用,C语言中switch...case语句中break的重要性
  7. maven+SSM框架工程搭建
  8. chrome 控制台 base64加密解密
  9. 圆柱与平面接触宽度_好烦!这个建筑高大斜圆柱真难施工!别怕!学会这种工法就不难了...
  10. xlrd,xlwt操作Excel实例
  11. 2. jQuery 语法
  12. 廖雪峰Python教程练习题
  13. 数据恢复 FinalData 3.0 testdisk
  14. Python库 Pandas 安装失败解决方案
  15. 两种求矩阵伪逆的方法
  16. 离散信号(八)| 离散傅里叶变换DFT性质(圆周移位、圆周卷积)
  17. EasyPlayer播放H.265的HLS视频流出现加载异常的问题分析及解决方法
  18. 【死磕 Spring】----- IOC 之 Factory 实例化 bean
  19. ORACLE错误代码对照表
  20. 清晰理解红黑树的演变-红黑的含义

热门文章

  1. python垃圾回收 循环引用_在做 Python 循环引用垃圾回收实验中的一个小问题, Python3 的 print 是线程安全的吗?...
  2. mysql 取substring_如何在MySQL中的字段上应用Substring()以获取字符串的一部分?
  3. 第八篇:稳定性之提升团队潜意识【及时复盘、开关设计】
  4. 七阶拉丁方阵_【C语言】输出N阶拉丁方阵并统计个数
  5. 社区儿童计算机活动总结,寒假社区服务活动总结
  6. color-loss pytorch实现
  7. tiny服务器系列,项目:TinyHTTP服务器
  8. matlab 32和64,在32或64位matlab上运行?
  9. rtsp服务器如何低延时linux,web实现RTSP无插件低延迟播放方案整理
  10. 计算机系统高级设置在哪里,Win7系统高级设置在哪里