参考链接:


 

http://www.ithao123.cn/content-101658.html  hbase之 bulkload的主要类 LoadIncrementalHFiles

 

 

http://www.thinksaas.cn/group/topic/233674/  bulkload 执行 mv和cp的区别

 

使用LoadIncrementalHFiles装载HFILE到HBASE的一点心得

 

 

:

 

数据入HBASE一般有两种方法:

1.HTable.put(),单条或者多条的方式入库。

2.先生成HFILE,然后将HFILE入库

前者适合于少量数据入库,后者主要面向海量数据入库。

 

 首先说下HFILE,HFILE是有序的KEYVALUE集合,对于入库HBASE,HFILE需要按照Key进行排序(key是由rowkey和列族、列名等构成的),排序后,HFILE就有个startKey和endKey,她的所有key是再这两者之间的

 

 其次是HBASE的表,一个表可能存储再多个regionserver上,在每个regionserver包括多个Region,关系大概是:TABLE-->REGIONSERVER-->REGION。每个REGION的数据的key是有一个范围的,也是有个startKey和endKey,不同region的key的范围是没有交集的,所以一个table的key的范围可以表示为{{null,endkey1},{startkey2,endtime2},{startkey3,endkey3}......{startkeyn,null}}。

 

 

 接下来说Hfile批量入Hbase,LoadIncrementalHFiles会检查HFILE的目录(结构是主目录->列族目录->hfile),把需要批量导入的Hfile放到一个列表中,依次执行。导入每一个Hfile,系统会判断hfile是否再某个region中还是跨了region(通过前面说的startkey,endkey进行判断)。如果在一个region中,就是进行导入,系统会通过rpc调用regionserver的方法,先把HFILE复制Region所在的文件系统中(如果处于不同的FS),然后直接将HFILE直接改名为Region的一个StoreFile,并更新该Region的Storefile列表,这样该HFILE就入库。如果在HFILE跨的region,那么需要对Hfile进行split(分成.top和.bottom两个文件,每个文件单属于一个region,也是Hfile格式的,放在_tmp下,),接下来把split之后的文件进行入库。

 

 

最后,根据这些理解来解释一些问题:

1、问:HFILE为什么需要排序?

答:那是应为REGION中的storefile是有序的,只有hfile有序,才能通过简单的拆分和rename来转换为storefile,而实现入库。

2、问:有时Hfile入库成功后,原Hfile会被移除,有时又不是?

答:如果Hfile的key属于单个region时,直接通过rename导入的,所以原文件不见了。而如果key跨了region,那么需要split到_tmp下,最终入库的的split后的文件,原hfile没有动,所以需要人工去删它。

3、问:如果HFILE跨域多个region,会不会有问题?

答:每次split都是分成两个文件,前一个文件肯定是属于单个region的,后一个文件就不一定了,所以,处理split后的文件时会做同样的判断,确保跨region的hfile不断的split。