重载getSplits自定义hbase mapreduce时map数量

mapreduce任务map数量由InputFomat类的getSplits决定,例如FileInputFormat,则实现是通过输入源文件数决定map数量;mapreduce同时最多运行的任务数由yarn配置决定,为cpu vcores*节点数。它们两个一起影响着任务同时运行的容器数量(Running Containers)。

 

采用TableMapReduceUtil实现的从hbase读入数据进行处理的mapreduce程序,map数量由TableInputFormat控制,默认情况下由涉及的region数量决定(当然还有一些调整的机制,如hbase.mapreduce.inputtable.shufflemaps、hbase.mapreduce.input.autobalance,这些默认为false)。

如果想自定义调整操作hbase的map数量,有一个便捷的方法就是继承TableInputFormat类,重载它的getSplits方法,下面的例子代码通过一个配置参数hbase.mapreduce.icare.mergeStep设置map的数量,并会粗略按记录数均衡分割map涉及的region:

public class HBaseInputFormat extends TableInputFormat {

	@Override
	public List<InputSplit> getSplits(JobContext context) throws IOException {
		List<InputSplit> inputSplits = super.getSplits(context);
		List<InputSplit> newInputSplits = new ArrayList<InputSplit>();
		super.initialize(context);
		TableName tName = super.getTable().getName();

		int mergeStep = context.getConfiguration().getInt(
				"hbase.mapreduce.icare.mergeStep", 13);

		long totalRegionSize = 0;
		for (int i = 0; i < inputSplits.size(); i++) {
			TableSplit ts = (TableSplit) inputSplits.get(i);
			totalRegionSize += ts.getLength();
		}
		long averageRegionSize = totalRegionSize / inputSplits.size();
		long spiltTotalSize = averageRegionSize * mergeStep;

		int index = 0;
		while (index < inputSplits.size()) {
			TableSplit ts = (TableSplit) inputSplits.get(index);
			long totalSize = ts.getLength();
			byte[] splitStartKey = ts.getStartRow();
			byte[] splitEndKey = ts.getEndRow();
			index++;
			for (; index < inputSplits.size(); index++) {
				TableSplit nextRegion = (TableSplit) inputSplits.get(index);
				long nextRegionSize = nextRegion.getLength();
				if (totalSize + nextRegionSize < spiltTotalSize) {
					totalSize = totalSize + nextRegionSize;
					splitEndKey = nextRegion.getEndRow();
				} else {
					break;
				}
			}
			
			TableSplit tsNew = new TableSplit(tName, splitStartKey,
					splitEndKey, ts.getRegionLocation(), totalSize);

			newInputSplits.add(tsNew);
		}

		super.closeTable();
		return newInputSplits;
	}

}


  • 2
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 6

打赏作者

上岸の鱼

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值