in hbase-table-reporter/src/main/java/org/apache/hbase/reporter/TableReporter.java [257:326]
private static void sketch(Configuration configuration, String tableNameAsStr, int limit,
double fraction, int threads, String isoNow, String encodedRegionName)
throws IOException, InterruptedException, ExecutionException {
TableName tableName = TableName.valueOf(tableNameAsStr);
AccumlatingSketch totalSketches = new AccumlatingSketch();
long startTime = System.currentTimeMillis();
int count = 0;
try (Connection connection = ConnectionFactory.createConnection(configuration)) {
// Get list of Regions. If 'fraction', get this fraction of all Regions. If
// encodedRegionName, then set fraction to 1.0 in case the returned set does not
// include the encodedRegionName we're looking for.
List<RegionInfo> regions = getRegions(connection, tableName, fraction, encodedRegionName);
count = regions.size();
if (count <= 0) {
throw new HBaseIOException("Empty regions list; fraction " + fraction +
" too severe or communication problems?");
} else {
System.out.println(Instant.now().toString() + " Scanning " + tableNameAsStr +
" regions=" + count + ", " + regions);
}
ExecutorService es =
Executors.newFixedThreadPool(threads, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
});
try {
List<SketchRegion> srs = regions.stream().
map(ri -> new SketchRegion(connection, tableName, ri, limit)).
collect(Collectors.toList());
List<Future<SketchRegion>> futures = new ArrayList<>(srs.size());
for (SketchRegion sr: srs) {
// Do submit rather than inokeall; invokeall blocks until all done.
// This way I get control back after all submitted.
futures.add(es.submit(sr));
}
// Avoid java.util.ConcurrentModificationException
List<Future<SketchRegion>> removals = new ArrayList<>();
while (!futures.isEmpty()) {
for (Future<SketchRegion> future: futures) {
if (future.isDone()) {
SketchRegion sr = future.get();
sr.getSketches().print(Instant.now().toString() +
" region=" + sr.getRegionInfo().getRegionNameAsString() + ", duration=" +
(Duration.ofMillis(sr.getDuration()).toString()));
totalSketches.add(sr.getSketches());
removals.add(future);
}
}
if (!removals.isEmpty()) {
futures.removeAll(removals);
removals.clear();
}
Thread.sleep(1000);
}
} finally {
es.shutdown();
}
}
Sketches sketches = totalSketches.get();
String isoDuration = Duration.ofMillis(System.currentTimeMillis() - startTime).toString();
sketches.print(Instant.now().toString() + " Totals for " + tableNameAsStr +
" regions=" + count + ", limit=" + limit + ", fraction=" + fraction +
", took=" + isoDuration);
// Dump out the gnuplot files. Saves time generating graphs.
dumpGnuplotDataFiles(isoNow, sketches, tableNameAsStr, count, isoDuration);
}