You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ea...@apache.org on 2019/05/16 09:26:44 UTC

[incubator-iotdb] branch cluster updated: update Query of NodeTool

This is an automated email from the ASF dual-hosted git repository.

east pushed a commit to branch cluster
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/cluster by this push:
     new a4ec93c  update Query of NodeTool
a4ec93c is described below

commit a4ec93c29ed048f1b828b84972451cc3f50adbce
Author: mdf369 <95...@qq.com>
AuthorDate: Thu May 16 17:26:25 2019 +0800

    update Query of NodeTool
---
 .../org/apache/iotdb/cluster/entity/Server.java    |  4 +-
 .../QueryJobNumAsyncProcessor.java}                | 17 +++---
 .../QueryMetricAsyncProcessor.java                 |  7 +--
 .../QueryJobNumRequest.java}                       | 18 +++----
 .../{ => querymetric}/QueryMetricRequest.java      | 11 ++--
 .../QueryJobNumResponse.java}                      | 19 +++----
 .../{ => querymetric}/QueryMetricResponse.java     |  3 +-
 .../iotdb/cluster/service/ClusterMonitor.java      |  4 +-
 .../iotdb/cluster/service/ClusterMonitorMBean.java |  6 +--
 .../iotdb/cluster/service/nodetool/Query.java      | 20 +++++--
 .../org/apache/iotdb/cluster/utils/RaftUtils.java  | 63 +++++++++++++++++++---
 .../UserGuideV0.7.0/7-Tools-NodeTool.md            | 24 ++++++---
 12 files changed, 135 insertions(+), 61 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/entity/Server.java b/cluster/src/main/java/org/apache/iotdb/cluster/entity/Server.java
index 842d2ed..5a1fa3b 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/entity/Server.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/entity/Server.java
@@ -32,7 +32,8 @@ import org.apache.iotdb.cluster.entity.metadata.MetadataHolder;
 import org.apache.iotdb.cluster.entity.raft.DataPartitionRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.MetadataRaftHolder;
 import org.apache.iotdb.cluster.rpc.raft.impl.RaftNodeAsClientManager;
-import org.apache.iotdb.cluster.rpc.raft.processor.QueryMetricAsyncProcessor;
+import org.apache.iotdb.cluster.rpc.raft.processor.querymetric.QueryJobNumAsyncProcessor;
+import org.apache.iotdb.cluster.rpc.raft.processor.querymetric.QueryMetricAsyncProcessor;
 import org.apache.iotdb.cluster.rpc.raft.processor.nonquery.DataGroupNonQueryAsyncProcessor;
 import org.apache.iotdb.cluster.rpc.raft.processor.nonquery.MetaGroupNonQueryAsyncProcessor;
 import org.apache.iotdb.cluster.rpc.raft.processor.querydata.CloseSeriesReaderSyncProcessor;
@@ -163,6 +164,7 @@ public class Server {
 
   private void registerQueryMetricProcessor(RpcServer rpcServer) {
     rpcServer.registerUserProcessor(new QueryMetricAsyncProcessor());
+    rpcServer.registerUserProcessor(new QueryJobNumAsyncProcessor());
   }
 
   public void stop() throws ProcessorException, InterruptedException {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryMetricAsyncProcessor.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetric/QueryJobNumAsyncProcessor.java
similarity index 67%
copy from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryMetricAsyncProcessor.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetric/QueryJobNumAsyncProcessor.java
index a76d2a6..5074d45 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryMetricAsyncProcessor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetric/QueryJobNumAsyncProcessor.java
@@ -16,29 +16,30 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.processor;
+package org.apache.iotdb.cluster.rpc.raft.processor.querymetric;
 
 import com.alipay.remoting.AsyncContext;
 import com.alipay.remoting.BizContext;
-import org.apache.iotdb.cluster.rpc.raft.request.QueryMetricRequest;
-import org.apache.iotdb.cluster.rpc.raft.response.QueryMetricResponse;
+import org.apache.iotdb.cluster.rpc.raft.processor.BasicAsyncUserProcessor;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetric.QueryJobNumRequest;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetric.QueryJobNumResponse;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 
-public class QueryMetricAsyncProcessor extends BasicAsyncUserProcessor<QueryMetricRequest> {
+public class QueryJobNumAsyncProcessor extends BasicAsyncUserProcessor<QueryJobNumRequest> {
 
   @Override
   public void handleRequest(BizContext bizContext, AsyncContext asyncContext,
-      QueryMetricRequest request) {
+      QueryJobNumRequest request) {
     String groupId = request.getGroupID();
 
-    QueryMetricResponse response = QueryMetricResponse.createSuccessResponse(groupId,
-        RaftUtils.getReplicaMetric(request.getGroupID(), request.getMetric()));
+    QueryJobNumResponse response = QueryJobNumResponse.createSuccessResponse(groupId,
+        RaftUtils.getLocalQueryJobNumMap());
     response.addResult(true);
     asyncContext.sendResponse(response);
   }
 
   @Override
   public String interest() {
-    return QueryMetricRequest.class.getName();
+    return QueryJobNumRequest.class.getName();
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryMetricAsyncProcessor.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetric/QueryMetricAsyncProcessor.java
similarity index 83%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryMetricAsyncProcessor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetric/QueryMetricAsyncProcessor.java
index a76d2a6..c2dfef1 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryMetricAsyncProcessor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetric/QueryMetricAsyncProcessor.java
@@ -16,12 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.processor;
+package org.apache.iotdb.cluster.rpc.raft.processor.querymetric;
 
 import com.alipay.remoting.AsyncContext;
 import com.alipay.remoting.BizContext;
-import org.apache.iotdb.cluster.rpc.raft.request.QueryMetricRequest;
-import org.apache.iotdb.cluster.rpc.raft.response.QueryMetricResponse;
+import org.apache.iotdb.cluster.rpc.raft.processor.BasicAsyncUserProcessor;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetric.QueryMetricRequest;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetric.QueryMetricResponse;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 
 public class QueryMetricAsyncProcessor extends BasicAsyncUserProcessor<QueryMetricRequest> {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetricRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetric/QueryJobNumRequest.java
similarity index 69%
copy from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetricRequest.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetric/QueryJobNumRequest.java
index eb81769..61069e8 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetricRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetric/QueryJobNumRequest.java
@@ -16,20 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.request;
+package org.apache.iotdb.cluster.rpc.raft.request.querymetric;
 
 import java.io.Serializable;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 
-public class QueryMetricRequest extends BasicQueryRequest implements Serializable {
+public class QueryJobNumRequest extends BasicRequest implements Serializable {
 
-  private String metric;
+  private static final long serialVersionUID = 8438291845259380829L;
 
-  public QueryMetricRequest(String groupID, int readConsistencyLevel, String metric) {
-    super(groupID, readConsistencyLevel);
-    this.metric = metric;
+  public QueryJobNumRequest(String groupID) {
+    super(groupID);
   }
-
-  public String getMetric() {
-    return metric;
-  }
-}
\ No newline at end of file
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetricRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetric/QueryMetricRequest.java
similarity index 72%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetricRequest.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetric/QueryMetricRequest.java
index eb81769..4d0c0f6 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetricRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetric/QueryMetricRequest.java
@@ -16,16 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.request;
+package org.apache.iotdb.cluster.rpc.raft.request.querymetric;
 
 import java.io.Serializable;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 
-public class QueryMetricRequest extends BasicQueryRequest implements Serializable {
+public class QueryMetricRequest extends BasicRequest implements Serializable {
+
+  private static final long serialVersionUID = 8434915883945730829L;
 
   private String metric;
 
-  public QueryMetricRequest(String groupID, int readConsistencyLevel, String metric) {
-    super(groupID, readConsistencyLevel);
+  public QueryMetricRequest(String groupID, String metric) {
+    super(groupID);
     this.metric = metric;
   }
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryMetricResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetric/QueryJobNumResponse.java
similarity index 63%
copy from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryMetricResponse.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetric/QueryJobNumResponse.java
index 9c77792..c681390 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryMetricResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetric/QueryJobNumResponse.java
@@ -16,31 +16,32 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.response;
+package org.apache.iotdb.cluster.rpc.raft.response.querymetric;
 
 import java.util.Map;
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
-public class QueryMetricResponse extends BasicResponse {
+public class QueryJobNumResponse extends BasicResponse {
 
-  private Map<String, Long> value;
+  private Map<String, Integer> value;
 
-  private QueryMetricResponse(String groupId, boolean redirected, String leaderStr,
+  private QueryJobNumResponse(String groupId, boolean redirected, String leaderStr,
       String errorMsg) {
     super(groupId, redirected, leaderStr, errorMsg);
   }
 
-  public static QueryMetricResponse createSuccessResponse(String groupId, Map<String, Long> value) {
-    QueryMetricResponse response = new QueryMetricResponse(groupId, false, null,
+  public static QueryJobNumResponse createSuccessResponse(String groupId, Map<String, Integer> value) {
+    QueryJobNumResponse response = new QueryJobNumResponse(groupId, false, null,
         null);
     response.value = value;
     return response;
   }
 
-  public static QueryMetricResponse createErrorResponse(String groupId, String errorMsg) {
-    return new QueryMetricResponse(groupId, false, null, errorMsg);
+  public static QueryJobNumResponse createErrorResponse(String groupId, String errorMsg) {
+    return new QueryJobNumResponse(groupId, false, null, errorMsg);
   }
 
-  public Map<String, Long> getValue() {
+  public Map<String, Integer> getValue() {
     return value;
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryMetricResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetric/QueryMetricResponse.java
similarity index 92%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryMetricResponse.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetric/QueryMetricResponse.java
index 9c77792..2f847db 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryMetricResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetric/QueryMetricResponse.java
@@ -16,9 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.response;
+package org.apache.iotdb.cluster.rpc.raft.response.querymetric;
 
 import java.util.Map;
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
 public class QueryMetricResponse extends BasicResponse {
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/service/ClusterMonitor.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/ClusterMonitor.java
index 5e14e0b..916ea1d 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/service/ClusterMonitor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/ClusterMonitor.java
@@ -107,7 +107,7 @@ public class ClusterMonitor implements ClusterMonitorMBean, IService {
   }
 
   @Override
-  public Map<String, Integer> getQueryJobNumMap() {
-    return RaftUtils.getQueryJobNumMap();
+  public Map<String, Map<String, Integer>> getQueryJobNumMap() {
+    return RaftUtils.getQueryJobNumMapForCluster();
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/service/ClusterMonitorMBean.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/ClusterMonitorMBean.java
index 5fe4c53..02b0207 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/service/ClusterMonitorMBean.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/ClusterMonitorMBean.java
@@ -71,9 +71,9 @@ public interface ClusterMonitorMBean {
   Map<String, Map<String, Long>> getReplicaLagMap();
 
   /**
-   * Get number of query jobs for each data partition
+   * Get number of query jobs on each data partition for all nodes
    *
-   * @return key: groupId, value: number of query jobs
+   * @return outer key: ip, inner key: groupId, value: number of query jobs
    */
-  Map<String, Integer> getQueryJobNumMap();
+  Map<String, Map<String, Integer>> getQueryJobNumMap();
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/service/nodetool/Query.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/nodetool/Query.java
index 2acd2ee..d0682fd 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/service/nodetool/Query.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/nodetool/Query.java
@@ -23,15 +23,25 @@ import java.util.Map;
 import org.apache.iotdb.cluster.service.nodetool.NodeTool.NodeToolCmd;
 import org.apache.iotdb.cluster.service.ClusterMonitorMBean;
 
-@Command(name = "query", description = "Print number of query jobs for all data partitions of connected host")
+@Command(name = "query", description = "Print number of query jobs for all data partitions for all hosts")
 public class Query extends NodeToolCmd {
 
   @Override
   public void execute(ClusterMonitorMBean proxy)
   {
-    Map<String, Integer> queryNumMap = proxy.getQueryJobNumMap();
-    queryNumMap.forEach((groupId, num) -> System.out.println(groupId + "\t->\t" + num));
-    int sum = queryNumMap.values().stream().mapToInt(num -> num).sum();
-    System.out.println("Total\t->\t" + sum);
+    Map<String, Map<String, Integer>> queryNumMap = proxy.getQueryJobNumMap();
+    queryNumMap.forEach((ip, map) -> {
+      System.out.println(ip + ":");
+      if (map != null) {
+        map.forEach((groupId, num) -> System.out.println("\t" + groupId + "\t->\t" + num));
+      }
+    });
+    final int[] sum = {0};
+    queryNumMap.forEach((ip, map) -> {
+      if (map != null) {
+        map.forEach((groupId, num) -> sum[0] += num);
+      }
+    });
+    System.out.println("Total\t->\t" + sum[0]);
   }
 }
\ No newline at end of file
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
index d5486fb..fe9fb8f 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
@@ -60,9 +60,11 @@ import org.apache.iotdb.cluster.rpc.raft.closure.ResponseClosure;
 import org.apache.iotdb.cluster.rpc.raft.impl.RaftNodeAsClientManager;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicNonQueryRequest;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
-import org.apache.iotdb.cluster.rpc.raft.request.QueryMetricRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetric.QueryJobNumRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetric.QueryMetricRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.QueryMetricResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetric.QueryJobNumResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetric.QueryMetricResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.nonquery.DataGroupNonQueryResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.nonquery.MetaGroupNonQueryResponse;
 import org.apache.iotdb.cluster.utils.hash.PhysicalNode;
@@ -98,6 +100,22 @@ public class RaftUtils {
   }
 
   /**
+   * Get peer id by input ip
+   *
+   * @return null if not found
+   */
+  public static PeerId getPeerIDByIP(String ip) {
+    RaftService service = (RaftService) server.getMetadataHolder().getService();
+    List<PeerId> peerIdList = service.getPeerIdList();
+    for (int i = 0; i < peerIdList.size(); i++) {
+      if (peerIdList.get(i).getIp().equals(ip)) {
+        return peerIdList.get(i);
+      }
+    }
+    return null;
+  }
+
+  /**
    * Get peer id to send request. If groupLeaderCache has the group id, then return leader id of the
    * group.Otherwise, random get a peer of the group.
    *
@@ -546,8 +564,7 @@ public class RaftUtils {
   }
 
   private static Map<String, Long> getReplicaMetricFromRemoteNode(String groupId, String metric) {
-    QueryMetricRequest request = new QueryMetricRequest(groupId,
-        config.getReadDataConsistencyLevel(), metric);
+    QueryMetricRequest request = new QueryMetricRequest(groupId, metric);
     SingleQPTask task = new SingleQPTask(false, request);
 
     LOGGER.debug("Execute get metric for {} statement for group {}.", metric, groupId);
@@ -572,14 +589,48 @@ public class RaftUtils {
   }
 
   /**
-   * Get query job number running on each data partition
+   * Get query job number running on each data partition for all nodes
    *
    * @return key: data partition ID, value: query job number
    */
-  public static Map<String, Integer> getQueryJobNumMap() {
+  public static Map<String, Map<String, Integer>> getQueryJobNumMapForCluster() {
+    PeerId[] peerIds = RaftUtils.convertStringArrayToPeerIdArray(config.getNodes());
+    Map<String, Map<String, Integer>> res = new HashMap<>();
+    for (int i = 0; i < peerIds.length; i++) {
+      PeerId peerId = peerIds[i];
+      res.put(peerId.getIp(), getQueryJobNumMapFromRemoteNode(peerId));
+    }
+
+    return res;
+  }
+
+  public static Map<String, Integer> getLocalQueryJobNumMap() {
     return ClusterRpcQueryManager.getInstance().getAllReadUsage();
   }
 
+  private static Map<String, Integer> getQueryJobNumMapFromRemoteNode(PeerId peerId) {
+    QueryJobNumRequest request = new QueryJobNumRequest("");
+    SingleQPTask task = new SingleQPTask(false, request);
+
+    LOGGER.debug("Execute get query job num map for node {}.", peerId);
+    try {
+      NodeAsClient client = RaftNodeAsClientManager.getInstance().getRaftNodeAsClient();
+      /** Call async method **/
+      client.asyncHandleRequest(task.getRequest(), peerId, task);
+
+      task.await();
+      Map<String, Integer> value = null;
+      if (task.getTaskState() == TaskState.FINISH) {
+        BasicResponse response = task.getResponse();
+        value = response == null ? null : ((QueryJobNumResponse) response).getValue();
+      }
+      return value;
+    } catch (RaftConnectionException | InterruptedException e) {
+      LOGGER.error("Fail to get query job num map from remote node {} because of {}.", peerId, e);
+      return null;
+    }
+  }
+
   /**
    * try to get raft rpc client
    */
diff --git a/docs/Documentation/UserGuideV0.7.0/7-Tools-NodeTool.md b/docs/Documentation/UserGuideV0.7.0/7-Tools-NodeTool.md
index a7113b6..938c68d 100644
--- a/docs/Documentation/UserGuideV0.7.0/7-Tools-NodeTool.md
+++ b/docs/Documentation/UserGuideV0.7.0/7-Tools-NodeTool.md
@@ -226,7 +226,7 @@ The command to query replica lag is `lag`, no additional parameters are needed.
 
 #### Output
 
-The output is multiple string lines, where is divided into multiplt data groups info. the first line of each data group info is data group ID, each line after the ID represents a key-value pair ,where the key is IP of the replica holder and the value is difference of committed log index between replica and leader. The format of each line is `key -> value`.
+The output is multiple string lines, where is divided into multiple data groups info. The first line of each data group info is data group ID, each line after the ID represents a key-value pair, where the key is IP of the replica holder and the value is difference of committed log index between replica and leader. The format of each line is `key -> value`.
 
 #### Example
 
@@ -256,9 +256,9 @@ data-group-0:
 ```
 The above output indicates that the current cluster contains 2 data groups, wherein the metadata group contains 3 nodes and 2 replicas, of which 192.168.130.14 acts as leader, each replica has a lag of 0; and the data partition data-group-0 contains 3 nodes and 2 replicas, of which 192.168.130.14 acts as leader, and each replica has a lag of 0.
 
-### Query Number of Query Tasks among All Storage Groups (query)
+### Query Number of Query Tasks among Cluster (query)
 
-IoTDB Cluster contains multiple data partitions, where there may be multiple concurrent query tasks running on each data partition. With this command, users are able to know the query task load and the total query task load of each data group on the current node, and the task load is represented by the number of tasks.
+In IoTDB Cluster, each node belongs to multiple data partitions, where there may be multiple concurrent query tasks running on each data partition. With this command, users are able to know the query task load and the total query task load of each data group on all nodes of cluster, and the task load is represented by the number of tasks.
 
 #### Input
 
@@ -266,7 +266,7 @@ The command to query number of query tasks is `query`, no additional parameters
 
 #### Output
 
-The output is multiple string lines, each line represents a key-value pair ,where the key is data group ID and the value is number of query tasks running on this data partition. The format of each line is `key -> value`. The last line represents the total number of query tasks running on current node.
+The output is multiple string lines, where is divided into multiple nodes info. The first line of each node info is node IP, each line after the IP represents a key-value pair, where the key is data group ID and the value is number of query tasks running on this data partition. The format of each line is `key -> value`. The last line represents the total number of query tasks running on cluster.
 
 #### Example
 
@@ -285,8 +285,16 @@ The Windows system startup commands are as follows:
 After using the command, the successful output will be as follows: 
 	
 ```
-data-group-0	->	1
-data-group-3	->	3
-Total	->	4
+192.168.130.14:
+  data-group-0  ->   1
+  data-group-1  ->   3
+192.168.130.16:
+  data-group-2  ->   2
+  data-group-1  ->   0
+192.168.130.18:
+  data-group-0  ->   0
+  data-group-2  ->   1
+Total  ->   7
+
 ```
-The above output indicates that node 192.168.130.14 contains 2 data partitions and 4 query tasks are running on it, wherein 1 query tasks is running on data partition data-group-0, and 3 query tasks are running on data partition data-group-1.
\ No newline at end of file
+The above output indicates that 7 query tasks are running on cluster. Moreover, node 192.168.130.14 contains 2 data partitions and 4 query tasks are running on it, wherein 1 query task is running on data partition data-group-0, and 3 query tasks are running on data partition data-group-1; node 192.168.130.16 contains 2 data partitions and 2 query tasks are running on it, wherein 2 query tasks is running on data partition data-group-2, and no query task is running on data partition data-g [...]
\ No newline at end of file