如下图所示,是一个利用HBase Coprocessor机制来减少应用和HBase集群间多步串行查询网络交互次数的方法。

图的大体流程是,应用将查询的rowkey等参数传递到Region Server,然后Region Server先做自己所在Region的查询,将本机查询的结果作为下次查询的Rowkey,并将在本Region的Rowkey通过RPC请求其他Region Server,多步查询后将结果一次返回给应用,从而减少应用和HBase集群间的调用次数。

Region Server之间coprocessor相互调用

1. 编写coprocessor

步骤参照实际动手编写HBase Coprocessor

2. coprocessor的核心查询代码片段如下

@Override
    public void getAdjacentVertices(RpcController controller, GraphTravesalProtocol.TraversalRequest request, RpcCallback<GraphTravesalProtocol.TraversalResponse> done) {

        /**
         * 1. If call by local region server itself, just return.
         */
        long reqRegionId = request.getRegionId();
        if(reqRegionId == env.getRegionInfo().getRegionId()){
            GraphTravesalProtocol.TraversalResponse response = localRegionServerRPCCallProcess();
            done.run(response);
            return;
        }

        /**
         * 2. Iterate execute traversal on local region server
         *    and find out vertex ids which not in local region server.
         */
        List<GraphTravesalProtocol.TravesalStep> travesalSteps = new ArrayList<GraphTravesalProtocol.TravesalStep>(request.getTravesalStepsList());
        List<GraphTravesalProtocol.TravesalStep> travesalStepsNotInLocalRegionServer = new ArrayList<GraphTravesalProtocol.TravesalStep>();
        for(GraphTravesalProtocol.TravesalStep travesalStep : travesalSteps){
            stepExecution(travesalSteps, travesalStep, travesalStepsNotInLocalRegionServer);
        }

        /**
         * 3. RPC call other region server to execute traversal
         *    which vertex ids not in local region server.
         */
        Map<byte[], GraphTravesalProtocol.TraversalResponse> responseMap = null;
        try {
            responseMap = GraphTravesalClient.getInstance().remoteTraversal(travesalStepsNotInLocalRegionServer, env.getRegionInfo().getRegionId());
        } catch (Throwable throwable) {
            log.error(throwable.getStackTrace());
        }

        /**
         * 4. Generate Response
         */
        GraphTravesalProtocol.TraversalResponse.Builder builder = GraphTravesalProtocol.TraversalResponse.newBuilder();
        /** 4.1 Merge RPC call response from other region server. */
        Iterator iterator = responseMap.keySet().iterator();
        while (iterator.hasNext()){
            byte[] key = (byte[]) iterator.next();
            GraphTravesalProtocol.TraversalResponse response = responseMap.get(key);
            builder.addAllVertices(response.getVerticesList());
        }

        /** 4.2 Local region vertex ids merge */
        GraphTravesalProtocol.TravesalStep finalStep = travesalSteps.get(travesalSteps.size() - 1 );
        builder.addAllVertices(finalStep.getAdjacentVerticesList());

        /**
         * 5. Return response
         */
        GraphTravesalProtocol.TraversalResponse response = builder.build();
        done.run(response);

    }

 更多详情请关注:娃娃学软件

 

相关文章:

  • 2021-08-31
  • 2021-11-04
  • 2022-12-23
  • 2021-12-29
  • 2022-01-15
  • 2021-12-08
  • 2021-09-09
  • 2022-02-13
猜你喜欢
  • 2022-12-23
  • 2022-01-24
  • 2022-02-07
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-04-13
相关资源
相似解决方案