HBase 可以被用作 MapReduce Job 的数据源 TableInputFormat, 和数据接收器TableOutputFormat or MultiTableOutputFormat.编写对 HBase 读写的 MapReduce jbos 时,建议使用子类 TableMapper 或者 TableReducer. 有关基本用法请参阅不做任何处理的传递类 IdentityTableMapper 和 IdentityTableReducer . 对于更复杂的例子, 请参阅 RowCounter 或者查看 org.apache.hadoop.hbase.mapreduce.TestTableMapReduce
的单元测试.
如果运行使用 HBase 作为源或接收器的 MapReduce job,则需要在配置中指定源和接收的表和列名称。
当您从 HBase 读取时,TableInputFormat
从 HBase 请求分区列表并生成一个映射,该映射可以是“map-per-region”或“mapreduce.job.maps”映射,以较小者为准。如果您的 job 只有两个 maps,请将mapreduce.job.maps
提升到大于分区数的数字。如果您每个节点正在运行 TaskTracer / NodeManager 和 RegionServer,则 Maps 将在相邻的 TaskTracker / NodeManager 上运行。写入 HBase 时,避免 Reduce 步骤并从 Map 中写回 HBase 可能是有意义的。当您的作业不需要 MapReduce 对 map 发出的数据进行排序和整理时,此方法有效。
在插入时,对于 HBase'排序',除非您需要,否则没有必要对您的 MapReduce 集群进行双重排序(以及对数据进行移动)。如果您不需要 Reduce,您的 map 可能会在作业结束时输出为了报告而处理的记录数,或者将 Reduced 数设置为零并使用 TableOutputFormat。如果在您的情况下运行 Reduce 步骤是有意义的,您通常应该使用多个 reducer,以便负载分布在 HBase 集群中。
新的 HBase 分区程序[HRegionPartitioner](https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/HRegionPartitioner.html)可以尽可能多的减少运行分区的数量。当您的表很大时,HRegionPartitioner 是合适的,并且您的上传在完成后不会大大改变现有区域的数量。否则请使用默认分区程序。