Although Hbase has intrinsic non async client API, an async client API derived from OpenTSDB OpenTSDB/asynchbase outperforms the former.
In this blog, we demonstrate its basic put and scan async API which return Deferred object, the equivalent one to Java 8 CompletableFuture.  The code demo does the following 3 operations in sequential order.

  1. Verify specified table and column family of a hbase cluster
  2. Puts several number of records asynchronously
  3. After put operations succeed, perform a total scan
    public static Deferred putData() throws Exception {
        String rowKey = UUID.randomUUID().toString();
        String data = "value " + counter.incrementAndGet();
        PutRequest putRequest = new PutRequest(tableName.getBytes(),
                rowKey.getBytes(), columnFamily.getBytes(),
                qualifier.getBytes(),
                data.getBytes());
        return hBaseClient.put(putRequest).addCallbacks(
                arg -> {
                    System.out.println("put data: rowkey=" + rowKey + ", value=" + data);
                    return null;
                },
                new Callback<Object, Exception>() {
            @Override
            public Object call(Exception arg) throws Exception {
                arg.printStackTrace();
                return null;
            }
        });

    }

To coordinate the order of verify phase and put phase, CountDownLatch is used whereas Deferred.group for put and scan coordination.

        List<Deferred<Object>> putDeferredList = new ArrayList<>();
        int total = 100;
        for (int i = 0; i < total; i++) {
            putDeferredList.add(putData());
        }
        Deferred.group(putDeferredList).addCallback(
                cb -> {
                    System.out.println("All put finished");
                    startProcessScan();
                    return null;
                }
        );

The maven project is downloadable @ hbaseasyncclientdemo.

Screen snapshot of the code in ME-Mydoc
code_asynchbase