先来看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要设置的如此之小的原因。
动一个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要设置的如此之小的原因。