hbase 如何在hdfs上做到实时的

先来看MR如何在hdfs的一个大文件中检索一行数据的。一个大文件在hdfs上被拆分成很多block,在集群中不同的block通常会放在不同的datanode中,当要从改文件中检索一行数据时,每个block都会启

动一个mapper作业来遍历该block中的数据,这就意味着在不同的datanode(更确切的说应该是tasktracker,在本地化计算的时候会在datanode上)上会同时运行mapper任务,也就是说MR需要去暴力的

遍历这个文件中所有的块中的数据。

再来看hbase如何在hdfs上去检索一行数据。首先要只要hbase的检索都是以rowkey值或者rowkey值范围来检索数据的,现在root表中检索mata表的的hregion位置,root表只会有一个region而且永远不会

被拆分以保证能够一次获取到mata表的hregion的位置,在mata表中保存所有的用户表的region的信息,region的rowkey有该region对应的表和第一行的rowkey等组成,因为一个表的rowkey在所有的

region上都是有序的字典排序,所有要检索一个rowkey只要通过对比mata表中region的rowkey就可以知道包含改rowkey的数据在那个region上,meta中还包含了region所咋的hregionserver的信息,通过

mata中的region的信息可以直接定位到包含改rowkey数据的所在的region在哪台hregionserver上。

知道region在哪台hregionserver上对已快速定位rowkey的数据还是不够的,region会根据families把数据才分成store,一个store只能包含一个family,在保存到hdfs的时候store其实就是一个目录而

已,真正存数据的是filestroe也就是hfile,每一个hfile当达到一定大小的时候就会拆分成两个hfile所以一个store目录中会包含多个hfile。因为table是按照rowkey来划分region的,region默认的大

小为256M,通常会设置得更高1G,2G,4G等,所以hfile不可能比region的的值要大。但是hfile有可能还是很大,在hdfs上会拆分成不同的block放在不同的datanode上,这样子仍然无法做到精确定位。

hfile 继续划分,有data block,block index,trailler等组成,已经定位到rowkey所在的hfile时,会先读取hfile的trailer的信息以获取block index的位置,block index的key就是data block中的

第一个rowkey,所以通过block index 的key就能精确的定位到要检索的rowkey在那个data block上,然后直接将该data block读取到内存,需要注意的是这里的data block已经很小了(默认是65k,不

同于hdfs上的block默认为64M,hbase的hfile中的block要小的多)这样子足以读取该block到内存中,将该block进行遍历就能获取到需要的rowkey取出数据,以为这里的block只有64k这样的遍历非常迅

速。这就是为什么hfile的data block要设置的如此之小的原因。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值