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

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new e4ac52b2aa [Improvement](profile)Add init and finalize external scan 
node time in profile (#21749)
e4ac52b2aa is described below

commit e4ac52b2aab17fc61c2a63f40566da5a221ea0b5
Author: Jibing-Li <64681310+jibing...@users.noreply.github.com>
AuthorDate: Thu Jul 20 20:29:18 2023 +0800

    [Improvement](profile)Add init and finalize external scan node time in 
profile (#21749)
    
    Add more profile information for external table plan time. Including init 
and finalize scan node time, getSplits time, create scan range time, get all 
partitions time and get all files for all partitions time. Also modified the 
Indentation to make it easier to read.
    
    This is an example output of the new profile summary.
    ```
        Execution  Summary:
              -  Analysis  Time:  3ms
              -  Plan  Time:  26s885ms
                  -  JoinReorder  Time:  N/A
                  -  CreateSingleNode  Time:  N/A
                  -  QueryDistributed  Time:  N/A
                  -  Init  Scan  Node  Time:  1ms
                  -  Finalize  Scan  Node  Time:  26s868ms
                      -  Get  Splits  Time:  26s554ms
                          -  Get  PARTITIONS  Time:  20s189ms
                          -  Get  PARTITION  FILES  Time:  6s289ms
                      -  Create  Scan  Range  Time:  314ms
              -  Schedule  Time:  1s67ms
              -  Fetch  Result  Time:  56ms
              -  Write  Result  Time:  0ms
              -  Wait  and  Fetch  Result  Time:  57ms
    ```
---
 .../doris/common/profile/SummaryProfile.java       | 123 ++++++++++++++++++++-
 .../apache/doris/common/util/RuntimeProfile.java   |  13 ++-
 .../doris/planner/external/FileQueryScanNode.java  |  27 +++++
 .../doris/planner/external/HiveScanNode.java       |  13 ++-
 4 files changed, 169 insertions(+), 7 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/common/profile/SummaryProfile.java 
b/fe/fe-core/src/main/java/org/apache/doris/common/profile/SummaryProfile.java
index 1646120254..1cd2c171e2 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/common/profile/SummaryProfile.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/common/profile/SummaryProfile.java
@@ -22,6 +22,7 @@ import org.apache.doris.common.util.TimeUtils;
 import org.apache.doris.thrift.TUnit;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 
 import java.util.Map;
@@ -55,6 +56,12 @@ public class SummaryProfile {
     public static final String JOIN_REORDER_TIME = "JoinReorder Time";
     public static final String CREATE_SINGLE_NODE_TIME = "CreateSingleNode 
Time";
     public static final String QUERY_DISTRIBUTED_TIME = "QueryDistributed 
Time";
+    public static final String INIT_SCAN_NODE_TIME = "Init Scan Node Time";
+    public static final String FINALIZE_SCAN_NODE_TIME = "Finalize Scan Node 
Time";
+    public static final String GET_SPLITS_TIME = "Get Splits Time";
+    public static final String GET_PARTITIONS_TIME = "Get PARTITIONS Time";
+    public static final String GET_PARTITION_FILES_TIME = "Get PARTITION FILES 
Time";
+    public static final String CREATE_SCAN_RANGE_TIME = "Create Scan Range 
Time";
     public static final String PLAN_TIME = "Plan Time";
     public static final String SCHEDULE_TIME = "Schedule Time";
     public static final String FETCH_RESULT_TIME = "Fetch Result Time";
@@ -66,7 +73,26 @@ public class SummaryProfile {
             IS_CACHED, TOTAL_INSTANCES_NUM, INSTANCES_NUM_PER_BE, 
PARALLEL_FRAGMENT_EXEC_INSTANCE, TRACE_ID);
 
     public static final ImmutableList<String> EXECUTION_SUMMARY_KEYS = 
ImmutableList.of(ANALYSIS_TIME, PLAN_TIME,
-            SCHEDULE_TIME, FETCH_RESULT_TIME, WRITE_RESULT_TIME, 
WAIT_FETCH_RESULT_TIME);
+            JOIN_REORDER_TIME, CREATE_SINGLE_NODE_TIME, QUERY_DISTRIBUTED_TIME,
+            INIT_SCAN_NODE_TIME, FINALIZE_SCAN_NODE_TIME, GET_SPLITS_TIME, 
GET_PARTITIONS_TIME,
+            GET_PARTITION_FILES_TIME, CREATE_SCAN_RANGE_TIME, SCHEDULE_TIME, 
FETCH_RESULT_TIME,
+            WRITE_RESULT_TIME, WAIT_FETCH_RESULT_TIME);
+
+    public static ImmutableMap<String, Integer> 
EXECUTION_SUMMARY_KEYS_IDENTATION = ImmutableMap.of();
+
+    {
+        ImmutableMap.Builder builder = new ImmutableMap.Builder();
+        builder.put(JOIN_REORDER_TIME, 1);
+        builder.put(CREATE_SINGLE_NODE_TIME, 1);
+        builder.put(QUERY_DISTRIBUTED_TIME, 1);
+        builder.put(INIT_SCAN_NODE_TIME, 1);
+        builder.put(FINALIZE_SCAN_NODE_TIME, 1);
+        builder.put(GET_SPLITS_TIME, 2);
+        builder.put(GET_PARTITIONS_TIME, 3);
+        builder.put(GET_PARTITION_FILES_TIME, 3);
+        builder.put(CREATE_SCAN_RANGE_TIME, 2);
+        EXECUTION_SUMMARY_KEYS_IDENTATION = builder.build();
+    }
 
     private RuntimeProfile summaryProfile;
     private RuntimeProfile executionSummaryProfile;
@@ -81,6 +107,15 @@ public class SummaryProfile {
     private long queryCreateSingleNodeFinishTime = -1;
     // Create distribute plan end time
     private long queryDistributedFinishTime = -1;
+    private long initScanNodeStartTime = -1;
+    private long initScanNodeFinishTime = -1;
+    private long finalizeScanNodeStartTime = -1;
+    private long finalizeScanNodeFinishTime = -1;
+    private long getSplitsStartTime = -1;
+    private long getPartitionsFinishTime = -1;
+    private long getPartitionFilesFinishTime = -1;
+    private long getSplitsFinishTime = -1;
+    private long createScanRangeFinishTime = -1;
     // Plan end time
     private long queryPlanFinishTime = -1;
     // Fragment schedule and send end time
@@ -123,10 +158,16 @@ public class SummaryProfile {
 
     private void updateExecutionSummaryProfile() {
         executionSummaryProfile.addInfoString(ANALYSIS_TIME, 
getPrettyQueryAnalysisFinishTime());
+        executionSummaryProfile.addInfoString(PLAN_TIME, 
getPrettyQueryPlanFinishTime());
         executionSummaryProfile.addInfoString(JOIN_REORDER_TIME, 
getPrettyQueryJoinReorderFinishTime());
         executionSummaryProfile.addInfoString(CREATE_SINGLE_NODE_TIME, 
getPrettyCreateSingleNodeFinishTime());
         executionSummaryProfile.addInfoString(QUERY_DISTRIBUTED_TIME, 
getPrettyQueryDistributedFinishTime());
-        executionSummaryProfile.addInfoString(PLAN_TIME, 
getPrettyQueryPlanFinishTime());
+        executionSummaryProfile.addInfoString(INIT_SCAN_NODE_TIME, 
getPrettyInitScanNodeTime());
+        executionSummaryProfile.addInfoString(FINALIZE_SCAN_NODE_TIME, 
getPrettyFinalizeScanNodeTime());
+        executionSummaryProfile.addInfoString(GET_SPLITS_TIME, 
getPrettyGetSplitsTime());
+        executionSummaryProfile.addInfoString(GET_PARTITIONS_TIME, 
getPrettyGetPartitionsTime());
+        executionSummaryProfile.addInfoString(GET_PARTITION_FILES_TIME, 
getPrettyGetPartitionFilesTime());
+        executionSummaryProfile.addInfoString(CREATE_SCAN_RANGE_TIME, 
getPrettyCreateScanRangeTime());
         executionSummaryProfile.addInfoString(SCHEDULE_TIME, 
getPrettyQueryScheduleFinishTime());
         executionSummaryProfile.addInfoString(FETCH_RESULT_TIME,
                 RuntimeProfile.printCounter(queryFetchResultConsumeTime, 
TUnit.TIME_MS));
@@ -151,6 +192,42 @@ public class SummaryProfile {
         this.queryCreateSingleNodeFinishTime = TimeUtils.getStartTimeMs();
     }
 
+    public void setInitScanNodeStartTime() {
+        this.initScanNodeStartTime = TimeUtils.getStartTimeMs();
+    }
+
+    public void setInitScanNodeFinishTime() {
+        this.initScanNodeFinishTime = TimeUtils.getStartTimeMs();
+    }
+
+    public void setFinalizeScanNodeStartTime() {
+        this.finalizeScanNodeStartTime = TimeUtils.getStartTimeMs();
+    }
+
+    public void setFinalizeScanNodeFinishTime() {
+        this.finalizeScanNodeFinishTime = TimeUtils.getStartTimeMs();
+    }
+
+    public void setGetSplitsStartTime() {
+        this.getSplitsStartTime = TimeUtils.getStartTimeMs();
+    }
+
+    public void setGetPartitionsFinishTime() {
+        this.getPartitionsFinishTime = TimeUtils.getStartTimeMs();
+    }
+
+    public void setGetPartitionFilesFinishTime() {
+        this.getPartitionFilesFinishTime = TimeUtils.getStartTimeMs();
+    }
+
+    public void setGetSplitsFinishTime() {
+        this.getSplitsFinishTime = TimeUtils.getStartTimeMs();
+    }
+
+    public void setCreateScanRangeFinishTime() {
+        this.createScanRangeFinishTime = TimeUtils.getStartTimeMs();
+    }
+
     public void setQueryDistributedFinishTime() {
         this.queryDistributedFinishTime = TimeUtils.getStartTimeMs();
     }
@@ -304,6 +381,48 @@ public class SummaryProfile {
         return RuntimeProfile.printCounter(queryDistributedFinishTime - 
queryCreateSingleNodeFinishTime, TUnit.TIME_MS);
     }
 
+    private String getPrettyInitScanNodeTime() {
+        if (initScanNodeStartTime == -1 || initScanNodeFinishTime == -1) {
+            return "N/A";
+        }
+        return RuntimeProfile.printCounter(initScanNodeFinishTime - 
initScanNodeStartTime, TUnit.TIME_MS);
+    }
+
+    private String getPrettyFinalizeScanNodeTime() {
+        if (finalizeScanNodeFinishTime == -1 || finalizeScanNodeStartTime == 
-1) {
+            return "N/A";
+        }
+        return RuntimeProfile.printCounter(finalizeScanNodeFinishTime - 
finalizeScanNodeStartTime, TUnit.TIME_MS);
+    }
+
+    private String getPrettyGetSplitsTime() {
+        if (getSplitsFinishTime == -1 || getSplitsStartTime == -1) {
+            return "N/A";
+        }
+        return RuntimeProfile.printCounter(getSplitsFinishTime - 
getSplitsStartTime, TUnit.TIME_MS);
+    }
+
+    private String getPrettyGetPartitionsTime() {
+        if (getSplitsStartTime == -1 || getPartitionsFinishTime == -1) {
+            return "N/A";
+        }
+        return RuntimeProfile.printCounter(getPartitionsFinishTime - 
getSplitsStartTime, TUnit.TIME_MS);
+    }
+
+    private String getPrettyGetPartitionFilesTime() {
+        if (getPartitionsFinishTime == -1 || getPartitionFilesFinishTime == 
-1) {
+            return "N/A";
+        }
+        return RuntimeProfile.printCounter(getPartitionFilesFinishTime - 
getPartitionsFinishTime, TUnit.TIME_MS);
+    }
+
+    private String getPrettyCreateScanRangeTime() {
+        if (getSplitsFinishTime == -1 || createScanRangeFinishTime == -1) {
+            return "N/A";
+        }
+        return RuntimeProfile.printCounter(createScanRangeFinishTime - 
getSplitsFinishTime, TUnit.TIME_MS);
+    }
+
     private String getPrettyQueryPlanFinishTime() {
         if (queryAnalysisFinishTime == -1 || queryPlanFinishTime == -1) {
             return "N/A";
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/common/util/RuntimeProfile.java 
b/fe/fe-core/src/main/java/org/apache/doris/common/util/RuntimeProfile.java
index 084b69f135..fea16c2f75 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/util/RuntimeProfile.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/RuntimeProfile.java
@@ -19,6 +19,7 @@ package org.apache.doris.common.util;
 
 import org.apache.doris.common.Pair;
 import org.apache.doris.common.Reference;
+import org.apache.doris.common.profile.SummaryProfile;
 import org.apache.doris.thrift.TCounter;
 import org.apache.doris.thrift.TRuntimeProfileNode;
 import org.apache.doris.thrift.TRuntimeProfileTree;
@@ -268,7 +269,13 @@ public class RuntimeProfile {
         infoStringsLock.readLock().lock();
         try {
             for (String key : this.infoStringsDisplayOrder) {
-                builder.append(prefix).append("   - ").append(key).append(": ")
+                builder.append(prefix);
+                if 
(SummaryProfile.EXECUTION_SUMMARY_KEYS_IDENTATION.containsKey(key)) {
+                    for (int i = 0; i < 
SummaryProfile.EXECUTION_SUMMARY_KEYS_IDENTATION.get(key); i++) {
+                        builder.append("  ");
+                    }
+                }
+                builder.append("   - ").append(key).append(": ")
                         .append(this.infoStrings.get(key)).append("\n");
             }
         } finally {
@@ -493,11 +500,9 @@ public class RuntimeProfile {
         infoStringsLock.writeLock().lock();
         try {
             String target = this.infoStrings.get(key);
+            this.infoStrings.put(key, value);
             if (target == null) {
-                this.infoStrings.put(key, value);
                 this.infoStringsDisplayOrder.add(key);
-            } else {
-                this.infoStrings.put(key, value);
             }
         } finally {
             infoStringsLock.writeLock().unlock();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/FileQueryScanNode.java
 
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/FileQueryScanNode.java
index 5b6238bf14..d6ec536d5f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/FileQueryScanNode.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/FileQueryScanNode.java
@@ -102,8 +102,14 @@ public abstract class FileQueryScanNode extends 
FileScanNode {
 
     @Override
     public void init(Analyzer analyzer) throws UserException {
+        if (ConnectContext.get().getExecutor() != null) {
+            
ConnectContext.get().getExecutor().getSummaryProfile().setInitScanNodeStartTime();
+        }
         super.init(analyzer);
         doInitialize();
+        if (ConnectContext.get().getExecutor() != null) {
+            
ConnectContext.get().getExecutor().getSummaryProfile().setInitScanNodeFinishTime();
+        }
     }
 
     /**
@@ -111,7 +117,13 @@ public abstract class FileQueryScanNode extends 
FileScanNode {
      */
     @Override
     public void init() throws UserException {
+        if (ConnectContext.get().getExecutor() != null) {
+            
ConnectContext.get().getExecutor().getSummaryProfile().setInitScanNodeStartTime();
+        }
         doInitialize();
+        if (ConnectContext.get().getExecutor() != null) {
+            
ConnectContext.get().getExecutor().getSummaryProfile().setInitScanNodeFinishTime();
+        }
     }
 
     // Init scan provider and schema related params.
@@ -194,8 +206,14 @@ public abstract class FileQueryScanNode extends 
FileScanNode {
 
     // Create scan range locations and the statistics.
     protected void doFinalize() throws UserException {
+        if (ConnectContext.get().getExecutor() != null) {
+            
ConnectContext.get().getExecutor().getSummaryProfile().setFinalizeScanNodeStartTime();
+        }
         createScanRangeLocations();
         updateRequiredSlots();
+        if (ConnectContext.get().getExecutor() != null) {
+            
ConnectContext.get().getExecutor().getSummaryProfile().setFinalizeScanNodeFinishTime();
+        }
     }
 
     private void setColumnPositionMapping()
@@ -229,7 +247,13 @@ public abstract class FileQueryScanNode extends 
FileScanNode {
     @Override
     public void createScanRangeLocations() throws UserException {
         long start = System.currentTimeMillis();
+        if (ConnectContext.get().getExecutor() != null) {
+            
ConnectContext.get().getExecutor().getSummaryProfile().setGetSplitsStartTime();
+        }
         List<Split> inputSplits = getSplits();
+        if (ConnectContext.get().getExecutor() != null) {
+            
ConnectContext.get().getExecutor().getSummaryProfile().setGetSplitsFinishTime();
+        }
         this.inputSplitsNum = inputSplits.size();
         if (inputSplits.isEmpty()) {
             return;
@@ -312,6 +336,9 @@ public abstract class FileQueryScanNode extends 
FileScanNode {
             scanRangeLocations.add(curLocations);
             this.totalFileSize += fileSplit.getLength();
         }
+        if (ConnectContext.get().getExecutor() != null) {
+            
ConnectContext.get().getExecutor().getSummaryProfile().setCreateScanRangeFinishTime();
+        }
         LOG.debug("create #{} ScanRangeLocations cost: {} ms",
                 scanRangeLocations.size(), (System.currentTimeMillis() - 
start));
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/HiveScanNode.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/HiveScanNode.java
index d629914775..1fe115a0b9 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/HiveScanNode.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/HiveScanNode.java
@@ -150,7 +150,12 @@ public class HiveScanNode extends FileQueryScanNode {
                 ListPartitionItem listPartitionItem = (ListPartitionItem) 
idToPartitionItem.get(id);
                 
partitionValuesList.add(listPartitionItem.getItems().get(0).getPartitionValuesAsStringList());
             }
-            return cache.getAllPartitions(hmsTable.getDbName(), 
hmsTable.getName(), partitionValuesList);
+            List<HivePartition> allPartitions =
+                    cache.getAllPartitions(hmsTable.getDbName(), 
hmsTable.getName(), partitionValuesList);
+            if (ConnectContext.get().getExecutor() != null) {
+                
ConnectContext.get().getExecutor().getSummaryProfile().setGetPartitionsFinishTime();
+            }
+            return allPartitions;
         } else {
             // unpartitioned table, create a dummy partition to save location 
and inputformat,
             // so that we can unify the interface.
@@ -159,6 +164,9 @@ public class HiveScanNode extends FileQueryScanNode {
                     hmsTable.getRemoteTable().getSd().getLocation(), null);
             this.totalPartitionNum = 1;
             this.readPartitionNum = 1;
+            if (ConnectContext.get().getExecutor() != null) {
+                
ConnectContext.get().getExecutor().getSummaryProfile().setGetPartitionsFinishTime();
+            }
             return Lists.newArrayList(dummyPartition);
         }
     }
@@ -191,6 +199,9 @@ public class HiveScanNode extends FileQueryScanNode {
         } else {
             fileCaches = cache.getFilesByPartitions(partitions, 
useSelfSplitter);
         }
+        if (ConnectContext.get().getExecutor() != null) {
+            
ConnectContext.get().getExecutor().getSummaryProfile().setGetPartitionFilesFinishTime();
+        }
         for (HiveMetaStoreCache.FileCacheValue fileCacheValue : fileCaches) {
             // This if branch is to support old splitter, will remove later.
             if (fileCacheValue.getSplits() != null) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to