什么是HBase的Region?

  大家一定对一个词不陌生:域分区,这个域就是Region;Region定义为key的一个取值范围的子集的数据载体;比如常见的域分区有固定大小分区,比如1-10一个region,2-50一个region以此类推;不过更常见的Hash分区;但是region在每台机器的物理实现上对应的是HFile;region的分割的逻辑,其实是指region的物理实现HFile的分割。

  那么HFile的分割之后数据是一分为二了,那么未来向HFile中插入数据的时候怎么知道向那个HFile中插入呢?其实每个HFile都会有自己的startRowKey以及endRowKey;被一分为二的HFile在META表中会被重新分配startRowKey以及endRowKey信息;这个两个HFile的startRowKey以及EndRowkey的合集的区间是split前的HFile的范围。

  那么什么是HFile,和region到底是什么关系?我们首先看一下hbase官方的一张图:

  一个Table在每个region server上面对应一个或者多个region,这里region概念其实就是一个RowSet(在KUDU里面就是称之为rowset)。一个Region在存储时候,会刷到一个或者多个HFile中,因为HFile是和ColumnFamily(CF)对应,如果一个Tabe中有多个CF,那么一个Region就会对应多个HFile;在物理实现上,其实每个CF对应一个MemStore,当(任何一个)MemStore的大小达到一定程度之后,将会把所有的Memstore刷到一个新的HFile中;当HFile达到了一定数量之后,将会触发合并(合并时机有三:memestore在flush的时候,HBase后台定时线程跑,手动跑)这里注意,合并有minor和major两种,生产环境一般会关闭major,因为会影响读写,手动在业务少的时候触发。然后当HFile达到一定大小后,将会进行分割,分割的原则就是对半分,整体来讲Region的key值范围不变,只不过分成两个文件而已;然后Region Server将会通知META,对于region的取值范围对应的HFile进行修改。

  因为HBase对于多于两个CF支持并不好,其实HBase更加支持一个CF,这样在MemStore刷硬盘的时候不会有连带反应(一个memstore还很少,被迫刷盘),如果这样看来其实列式存储的特性并不明显,因为在每个HFile中还是row的形式存储。但是HBase和传统数据差别还是在于数据分块存储,这样可以进行并行查询,提高查询效率。

  分片,就是分片,一个region就是一个数据分片;就是elasticsearch里面的分片;一个索引相当于HBase里面的table概念(到了6之后是这样,ES5的时候index还是库概念)。

  其实到了这里,你会发现,HBase严格来讲并不是列式存储,或者说列族存储更合适一些,因为其本质是key-value的存储机制,当一条数据PUT到HBase的Region Server,其实内部处理是把这一条记录拆开来,每个cell配上相同的rowkey(rowkey早就存在的,其实打到那个region server就是根据rowkey来路由的,rowkey是client端根据规则生成)。所以说HBase是key-value存储更加合适一些,这里和MongoDB比较类似,MongoDB相对而言是比较轻量级的Key-value数据库,因为没有和HDFS绑扎一起。

最新文章

  1. Sql Cursor example
  2. (转)spring boot注解 --@EnableAsync 异步调用
  3. Keil的标题“礦ision3" 的改变(转)
  4. CUDA编程学习(一)
  5. DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档
  6. [转]android使用shape stroke描边只保留底部
  7. Centos7安装Docker Engine
  8. 宣布在 Azure 镜像库中正式推出 Windows Server 2012 R2 并降低 Windows Azure 的实例定价
  9. 理解Python中的yield
  10. java开发环境配置——JDK
  11. idea工具和激活码获取
  12. Hibernate原理及应用
  13. 增删改查Spring+MyBatis
  14. Codeforces Round #459 Div. 1
  15. Django 中间件 请求前
  16. STC15W408AS简单使用教程-简单的光强检测!
  17. 自定义简单的模板引擎-JS模板引擎
  18. Linux系统不能解析域名
  19. C++的命名空间的使用
  20. mysql命令用法复习笔记

热门文章

  1. linux内核分析第七周-Linux内核如何装载和启动一个可执行程序
  2. 高级Bash脚本编程(二)
  3. ubuntu下各类快捷键汇总记录
  4. ExtJS清除表格缓存
  5. Helm - Error: cannot connect to Tiller
  6. Excel导入oracle库
  7. web——自己实现一个淘宝购物车页面
  8. 监听器的使用例子 ServletContextListener
  9. 201621123005《Java程序设计》第十三次实验总结
  10. OMAP4之DSP核(Tesla)软件开发学习(三)使能DSP核