/** * (c) Copyright 2012 WibiData, Inc. * * See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kiji.mapreduce.impl; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.mapreduce.TableSplit; import org.kiji.annotations.ApiAudience; /** * An KijiTableSplit stores exactly the same data as TableSplit, but * does a better job handling default split sizes. */ @ApiAudience.Private public final class KijiTableSplit extends TableSplit { private long mSplitSize; // lazily calculated and populated via getLength(). /** The default constructor. */ public KijiTableSplit() { super(); } /** * Create a new KijiTableSplit instance from an HBase TableSplit. * @param tableSplit the HBase TableSplit to clone. */ public KijiTableSplit(TableSplit tableSplit) { super(tableSplit.getTableName(), tableSplit.getStartRow(), tableSplit.getEndRow(), tableSplit.getRegionLocation()); } /** * Returns the length of the split. * * This method does not currently examine the data in the region * represented by the split. We assume that each split is 3/4 full (where * "full" is defined as hbase.hregion.max.filesize). If the region had * that many bytes in it, it would split in two, each containing 1/2 that * many bytes. So we expect, on average, regions to be halfway between * "newly split" and "just about to split." * * @return the length of the split. * @see org.apache.hadoop.mapreduce.InputSplit#getLength() */ @Override public long getLength() { if (0 == mSplitSize) { // Calculate this value once and memoize its result. Configuration conf = new Configuration(); conf = HBaseConfiguration.addHbaseResources(conf); mSplitSize = (conf.getLong("hbase.hregion.max.filesize", 0) * 4) / 3; if (0 == mSplitSize) { // Set this to some reasonable non-zero default if the HBase properties // weren't set correctly. mSplitSize = 64 * 1024 * 1024; // 64 MB } } return mSplitSize; } }