参考链接:
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。
标签:region,---,split,key,bulkload,hbase,Hfile,入库,HFILE From: https://blog.51cto.com/u_16081606/6478701