对于MapReduce 作业,HBase可用作数据源——TableInputFormat,也可用作数据接收器——TableOutputFormat或 MultiTableOutputFormat,使用TableMapper、TableReducer子类,编写MapReduce作业读取或写入HBase。可以参考IdentityTableMapper和 IdentityTableReducer了解基本的应用。更详细的实例可以阅读RowCounter的源码或者单元测试用例org.apache.hadoop.hbase.mapreduce.TestTableMapReduce的源码。
如果你运行的MapReduce 作业使用HBase作为源或者接收器,那么你需要配置源或接收器的table以及column names。
当你从HBase读取数据时,TableInputFormat从HBase请求1个regions的list,然后封装为1个map,这个map可以是map-per-region或mapreduce.job.maps其中之一,不管是哪1个map都很小。如果你的Job仅有2个maps,提高mapreduce.job.maps这个值,以超过regions的数量。如果你运行的集群是1个node运行1个TaskTracer/NodeManager、RegionServer的话,那么maps将运行在相邻的TaskTracer/NodeManager上。
当你写数据到HBase时,可能会避免Reduce阶段,而从你的map中将数据回写到HBase。当你的Job不会要排序、整理时,这种方法合适,这种MapReduce一般都是用map来分发数据。在Insert方面,除非是你指定,要不然HBase不会使用sort。如果你不需要reduce,可以把reduces的数量设置为0,你的map可用分开记录处理用于报告,在Job最后使用TableOutputFormat将数据写入HBase。如果你真要使用reduce,大多数情况下都是使用多个reduce,这样HBase集群会负载会均衡一点。
HRegionPartitioner是1个新的HBase分区器,它可以将大量存在的regions作为大量的reduces来运行。当你的table很大,你通过上传的方式无法大大的减少regions的数量,那么HRegionPartitioner很适合。除了这种情况之外,都使用默认的分区器。