HBASE-3162 Add TimeRange support into Increment to optimize for counters that are partitioned on time
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1029118 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8f3c1a5bc4
commit
5abb3867c0
|
@ -1065,6 +1065,8 @@ Release 0.21.0 - Unreleased
|
||||||
a RS no longer present
|
a RS no longer present
|
||||||
HBASE-3174 Add ability for Get operations to enable/disable use of block
|
HBASE-3174 Add ability for Get operations to enable/disable use of block
|
||||||
caching
|
caching
|
||||||
|
HBASE-3162 Add TimeRange support into Increment to optimize for counters
|
||||||
|
that are partitioned on time
|
||||||
|
|
||||||
NEW FEATURES
|
NEW FEATURES
|
||||||
HBASE-1961 HBase EC2 scripts
|
HBASE-1961 HBase EC2 scripts
|
||||||
|
|
|
@ -27,6 +27,7 @@ import java.util.NavigableMap;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
import org.apache.hadoop.hbase.io.TimeRange;
|
||||||
import org.apache.hadoop.hbase.util.Bytes;
|
import org.apache.hadoop.hbase.util.Bytes;
|
||||||
import org.apache.hadoop.io.Writable;
|
import org.apache.hadoop.io.Writable;
|
||||||
|
|
||||||
|
@ -48,6 +49,7 @@ public class Increment implements Writable {
|
||||||
private byte [] row = null;
|
private byte [] row = null;
|
||||||
private long lockId = -1L;
|
private long lockId = -1L;
|
||||||
private boolean writeToWAL = true;
|
private boolean writeToWAL = true;
|
||||||
|
private TimeRange tr = new TimeRange();
|
||||||
private Map<byte [], NavigableMap<byte [], Long>> familyMap =
|
private Map<byte [], NavigableMap<byte [], Long>> familyMap =
|
||||||
new TreeMap<byte [], NavigableMap<byte [], Long>>(Bytes.BYTES_COMPARATOR);
|
new TreeMap<byte [], NavigableMap<byte [], Long>>(Bytes.BYTES_COMPARATOR);
|
||||||
|
|
||||||
|
@ -143,6 +145,34 @@ public class Increment implements Writable {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the TimeRange used for this increment.
|
||||||
|
* @return TimeRange
|
||||||
|
*/
|
||||||
|
public TimeRange getTimeRange() {
|
||||||
|
return this.tr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the TimeRange to be used on the Get for this increment.
|
||||||
|
* <p>
|
||||||
|
* This is useful for when you have counters that only last for specific
|
||||||
|
* periods of time (ie. counters that are partitioned by time). By setting
|
||||||
|
* the range of valid times for this increment, you can potentially gain
|
||||||
|
* some performance with a more optimal Get operation.
|
||||||
|
* <p>
|
||||||
|
* This range is used as [minStamp, maxStamp).
|
||||||
|
* @param minStamp minimum timestamp value, inclusive
|
||||||
|
* @param maxStamp maximum timestamp value, exclusive
|
||||||
|
* @throws IOException if invalid time range
|
||||||
|
* @return this
|
||||||
|
*/
|
||||||
|
public Increment setTimeRange(long minStamp, long maxStamp)
|
||||||
|
throws IOException {
|
||||||
|
tr = new TimeRange(minStamp, maxStamp);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method for retrieving the keys in the familyMap
|
* Method for retrieving the keys in the familyMap
|
||||||
* @return keys in the current familyMap
|
* @return keys in the current familyMap
|
||||||
|
@ -241,6 +271,8 @@ public class Increment implements Writable {
|
||||||
throw new IOException("unsupported version");
|
throw new IOException("unsupported version");
|
||||||
}
|
}
|
||||||
this.row = Bytes.readByteArray(in);
|
this.row = Bytes.readByteArray(in);
|
||||||
|
this.tr = new TimeRange();
|
||||||
|
tr.readFields(in);
|
||||||
this.lockId = in.readLong();
|
this.lockId = in.readLong();
|
||||||
int numFamilies = in.readInt();
|
int numFamilies = in.readInt();
|
||||||
if (numFamilies == 0) {
|
if (numFamilies == 0) {
|
||||||
|
@ -270,6 +302,7 @@ public class Increment implements Writable {
|
||||||
throws IOException {
|
throws IOException {
|
||||||
out.writeByte(INCREMENT_VERSION);
|
out.writeByte(INCREMENT_VERSION);
|
||||||
Bytes.writeByteArray(out, this.row);
|
Bytes.writeByteArray(out, this.row);
|
||||||
|
tr.write(out);
|
||||||
out.writeLong(this.lockId);
|
out.writeLong(this.lockId);
|
||||||
if (familyMap.size() == 0) {
|
if (familyMap.size() == 0) {
|
||||||
throw new IOException("At least one column required");
|
throw new IOException("At least one column required");
|
||||||
|
|
|
@ -71,6 +71,7 @@ import org.apache.hadoop.hbase.client.Scan;
|
||||||
import org.apache.hadoop.hbase.filter.Filter;
|
import org.apache.hadoop.hbase.filter.Filter;
|
||||||
import org.apache.hadoop.hbase.filter.IncompatibleFilterException;
|
import org.apache.hadoop.hbase.filter.IncompatibleFilterException;
|
||||||
import org.apache.hadoop.hbase.io.HeapSize;
|
import org.apache.hadoop.hbase.io.HeapSize;
|
||||||
|
import org.apache.hadoop.hbase.io.TimeRange;
|
||||||
import org.apache.hadoop.hbase.io.hfile.BlockCache;
|
import org.apache.hadoop.hbase.io.hfile.BlockCache;
|
||||||
import org.apache.hadoop.hbase.ipc.HRegionInterface;
|
import org.apache.hadoop.hbase.ipc.HRegionInterface;
|
||||||
import org.apache.hadoop.hbase.regionserver.wal.HLog;
|
import org.apache.hadoop.hbase.regionserver.wal.HLog;
|
||||||
|
@ -2946,6 +2947,8 @@ public class HRegion implements HeapSize { // , Writable{
|
||||||
newGet.addColumn(family, qualifier);
|
newGet.addColumn(family, qualifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
newGet.setTimeRange(get.getTimeRange().getMin(),
|
||||||
|
get.getTimeRange().getMax());
|
||||||
iscan = new InternalScan(newGet);
|
iscan = new InternalScan(newGet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3002,6 +3005,7 @@ public class HRegion implements HeapSize { // , Writable{
|
||||||
// TODO: Use RWCC to make this set of increments atomic to reads
|
// TODO: Use RWCC to make this set of increments atomic to reads
|
||||||
byte [] row = increment.getRow();
|
byte [] row = increment.getRow();
|
||||||
checkRow(row);
|
checkRow(row);
|
||||||
|
TimeRange tr = increment.getTimeRange();
|
||||||
boolean flush = false;
|
boolean flush = false;
|
||||||
WALEdit walEdits = null;
|
WALEdit walEdits = null;
|
||||||
List<KeyValue> allKVs = new ArrayList<KeyValue>(increment.numColumns());
|
List<KeyValue> allKVs = new ArrayList<KeyValue>(increment.numColumns());
|
||||||
|
@ -3025,6 +3029,7 @@ public class HRegion implements HeapSize { // , Writable{
|
||||||
for (Map.Entry<byte [], Long> column : family.getValue().entrySet()) {
|
for (Map.Entry<byte [], Long> column : family.getValue().entrySet()) {
|
||||||
get.addColumn(family.getKey(), column.getKey());
|
get.addColumn(family.getKey(), column.getKey());
|
||||||
}
|
}
|
||||||
|
get.setTimeRange(tr.getMin(), tr.getMax());
|
||||||
List<KeyValue> results = getLastIncrement(get);
|
List<KeyValue> results = getLastIncrement(get);
|
||||||
|
|
||||||
// Iterate the input columns and update existing values if they were
|
// Iterate the input columns and update existing values if they were
|
||||||
|
|
Loading…
Reference in New Issue