Java Code Examples for org.apache.hadoop.hbase.regionserver.Region#startRegionOperation()
The following examples show how to use
org.apache.hadoop.hbase.regionserver.Region#startRegionOperation() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: Export.java From hbase with Apache License 2.0 | 4 votes |
RegionOp(final Region region) throws IOException { this.region = region; region.startRegionOperation(); }
Example 2
Source File: GroupedAggregateRegionObserver.java From phoenix with Apache License 2.0 | 4 votes |
/** * Used for an aggregate query in which the key order does not necessarily match the group by * key order. In this case, we must collect all distinct groups within a region into a map, * aggregating as we go. * @param limit TODO */ private RegionScanner scanUnordered(ObserverContext<RegionCoprocessorEnvironment> c, Scan scan, final RegionScanner scanner, final List<Expression> expressions, final ServerAggregators aggregators, long limit) throws IOException { if (LOGGER.isDebugEnabled()) { LOGGER.debug(LogUtil.addCustomAnnotations( "Grouped aggregation over unordered rows with scan " + scan + ", group by " + expressions + ", aggregators " + aggregators, ScanUtil.getCustomAnnotations(scan))); } RegionCoprocessorEnvironment env = c.getEnvironment(); Configuration conf = env.getConfiguration(); int estDistVals = conf.getInt(GROUPBY_ESTIMATED_DISTINCT_VALUES_ATTRIB, DEFAULT_GROUPBY_ESTIMATED_DISTINCT_VALUES); byte[] estDistValsBytes = scan.getAttribute(BaseScannerRegionObserver.ESTIMATED_DISTINCT_VALUES); if (estDistValsBytes != null) { // Allocate 1.5x estimation estDistVals = Math.max(MIN_DISTINCT_VALUES, (int) (Bytes.toInt(estDistValsBytes) * 1.5f)); } Pair<Integer, Integer> minMaxQualifiers = EncodedColumnsUtil.getMinMaxQualifiersFromScan(scan); boolean useQualifierAsIndex = EncodedColumnsUtil.useQualifierAsIndex(EncodedColumnsUtil.getMinMaxQualifiersFromScan(scan)); final boolean spillableEnabled = conf.getBoolean(GROUPBY_SPILLABLE_ATTRIB, DEFAULT_GROUPBY_SPILLABLE); final PTable.QualifierEncodingScheme encodingScheme = EncodedColumnsUtil.getQualifierEncodingScheme(scan); GroupByCache groupByCache = GroupByCacheFactory.INSTANCE.newCache( env, ScanUtil.getTenantId(scan), ScanUtil.getCustomAnnotations(scan), aggregators, estDistVals); boolean success = false; try { boolean hasMore; Tuple result = useQualifierAsIndex ? new PositionBasedMultiKeyValueTuple() : new MultiKeyValueTuple(); if (LOGGER.isDebugEnabled()) { LOGGER.debug(LogUtil.addCustomAnnotations( "Spillable groupby enabled: " + spillableEnabled, ScanUtil.getCustomAnnotations(scan))); } Region region = c.getEnvironment().getRegion(); boolean acquiredLock = false; try { region.startRegionOperation(); acquiredLock = true; synchronized (scanner) { do { List<Cell> results = useQualifierAsIndex ? new EncodedColumnQualiferCellsList(minMaxQualifiers.getFirst(), minMaxQualifiers.getSecond(), encodingScheme) : new ArrayList<Cell>(); // Results are potentially returned even when the return // value of s.next is false // since this is an indication of whether or not there are // more values after the // ones returned hasMore = scanner.nextRaw(results); if (!results.isEmpty()) { result.setKeyValues(results); ImmutableBytesPtr key = TupleUtil.getConcatenatedValue(result, expressions); Aggregator[] rowAggregators = groupByCache.cache(key); // Aggregate values here aggregators.aggregate(rowAggregators, result); } } while (hasMore && groupByCache.size() < limit); } } finally { if (acquiredLock) region.closeRegionOperation(); } RegionScanner regionScanner = groupByCache.getScanner(scanner); // Do not sort here, but sort back on the client instead // The reason is that if the scan ever extends beyond a region // (which can happen if we're basing our parallelization split // points on old metadata), we'll get incorrect query results. success = true; return regionScanner; } finally { if (!success) { Closeables.closeQuietly(groupByCache); } } }
Example 3
Source File: GroupedAggregateRegionObserver.java From phoenix with Apache License 2.0 | 4 votes |
/** * Used for an aggregate query in which the key order match the group by key order. In this * case, we can do the aggregation as we scan, by detecting when the group by key changes. * @param limit TODO * @throws IOException */ private RegionScanner scanOrdered(final ObserverContext<RegionCoprocessorEnvironment> c, final Scan scan, final RegionScanner scanner, final List<Expression> expressions, final ServerAggregators aggregators, final long limit) throws IOException { if (LOGGER.isDebugEnabled()) { LOGGER.debug(LogUtil.addCustomAnnotations( "Grouped aggregation over ordered rows with scan " + scan + ", group by " + expressions + ", aggregators " + aggregators, ScanUtil.getCustomAnnotations(scan))); } final Pair<Integer, Integer> minMaxQualifiers = EncodedColumnsUtil.getMinMaxQualifiersFromScan(scan); final boolean useQualifierAsIndex = EncodedColumnsUtil.useQualifierAsIndex(minMaxQualifiers); final PTable.QualifierEncodingScheme encodingScheme = EncodedColumnsUtil.getQualifierEncodingScheme(scan); return new BaseRegionScanner(scanner) { private long rowCount = 0; private ImmutableBytesPtr currentKey = null; @Override public boolean next(List<Cell> results) throws IOException { boolean hasMore; boolean atLimit; boolean aggBoundary = false; Tuple result = useQualifierAsIndex ? new PositionBasedMultiKeyValueTuple() : new MultiKeyValueTuple(); ImmutableBytesPtr key = null; Aggregator[] rowAggregators = aggregators.getAggregators(); // If we're calculating no aggregate functions, we can exit at the // start of a new row. Otherwise, we have to wait until an agg int countOffset = rowAggregators.length == 0 ? 1 : 0; Region region = c.getEnvironment().getRegion(); boolean acquiredLock = false; try { region.startRegionOperation(); acquiredLock = true; synchronized (scanner) { do { List<Cell> kvs = useQualifierAsIndex ? new EncodedColumnQualiferCellsList(minMaxQualifiers.getFirst(), minMaxQualifiers.getSecond(), encodingScheme) : new ArrayList<Cell>(); // Results are potentially returned even when the return // value of s.next is false // since this is an indication of whether or not there // are more values after the // ones returned hasMore = scanner.nextRaw(kvs); if (!kvs.isEmpty()) { result.setKeyValues(kvs); key = TupleUtil.getConcatenatedValue(result, expressions); aggBoundary = currentKey != null && currentKey.compareTo(key) != 0; if (!aggBoundary) { aggregators.aggregate(rowAggregators, result); if (LOGGER.isDebugEnabled()) { LOGGER.debug(LogUtil.addCustomAnnotations( "Row passed filters: " + kvs + ", aggregated values: " + Arrays.asList(rowAggregators), ScanUtil.getCustomAnnotations(scan))); } currentKey = key; } } atLimit = rowCount + countOffset >= limit; // Do rowCount + 1 b/c we don't have to wait for a complete // row in the case of a DISTINCT with a LIMIT } while (hasMore && !aggBoundary && !atLimit); } } finally { if (acquiredLock) region.closeRegionOperation(); } if (currentKey != null) { byte[] value = aggregators.toBytes(rowAggregators); Cell keyValue = PhoenixKeyValueUtil.newKeyValue(currentKey.get(), currentKey.getOffset(), currentKey.getLength(), SINGLE_COLUMN_FAMILY, SINGLE_COLUMN, AGG_TIMESTAMP, value, 0, value.length); results.add(keyValue); // If we're at an aggregation boundary, reset the // aggregators and // aggregate with the current result (which is not a part of // the returned result). if (aggBoundary) { aggregators.reset(rowAggregators); aggregators.aggregate(rowAggregators, result); currentKey = key; rowCount++; atLimit |= rowCount >= limit; } } // Continue if there are more if (!atLimit && (hasMore || aggBoundary)) { return true; } currentKey = null; return false; } }; }