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

xxyu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/kylin.git


The following commit(s) were added to refs/heads/main by this push:
     new 9797e4c  Refine Kylin Config (#1726)
9797e4c is described below

commit 9797e4c339d041c344a25a0b92c3763bd5b0e184
Author: Xiaoxiang Yu <x...@apache.org>
AuthorDate: Mon Aug 16 08:40:58 2021 +0800

    Refine Kylin Config (#1726)
    
    * Add deprecated notice for some maven modules
    
    * remove duplicated log
    
    * refine kylin config
    
    * refine sample cube desc
    
    * Fix config entry rename
    
    * add switch for sparder canary tool
---
 build/bin/kylin.sh                                 |   4 +-
 .../org/apache/kylin/common/KylinConfigBase.java   | 546 ++++++++++++++-------
 .../java/org/apache/kylin/common/QueryContext.java |   2 -
 .../apache/kylin/common/annotation/ConfigTag.java  |  32 +-
 .../src/main/resources/kylin-defaults.properties   |  52 +-
 core-dictionary/DEPRECATED_MODULE                  |  19 +
 datasource-sdk/DEPRECATED_MODULE                   |  19 +
 docker/conf/kylin/kylin.properties                 |   2 +-
 docker/dockerfile/standalone/conf/bin/kylin.sh     |   4 +-
 .../standalone/conf/kylin/kylin.properties         |   2 +-
 engine-flink/DEPRECATED_MODULE                     |  19 +
 engine-mr/DEPRECATED_MODULE                        |  19 +
 engine-spark/DEPRECATED_MODULE                     |  19 +
 .../template/cube_desc/kylin_sales_cube.json       |   9 +-
 .../test_case_data/file_prunning/kylin.properties  |   2 +-
 examples/test_case_data/localmeta/kylin.properties |   2 +-
 .../test_case_data/parquet_test/kylin.properties   |   2 +-
 examples/test_case_data/sandbox/kylin.properties   |   2 +-
 kylin-it/DEPRECATED_MODULE                         |  19 +
 .../kylin/engine/spark/job/CubeBuildJob.java       |   2 -
 .../kylin/engine/spark/utils/JobMetricsUtils.scala |  24 +-
 .../org/apache/spark/sql/SparderContext.scala      |   2 +-
 source-jdbc/DEPRECATED_MODULE                      |  19 +
 source-kafka/DEPRECATED_MODULE                     |  19 +
 storage-hbase/DEPRECATED_MODULE                    |  19 +
 storage-stream/DEPRECATED_MODULE                   |  19 +
 stream-coordinator/DEPRECATED_MODULE               |  19 +
 stream-core/DEPRECATED_MODULE                      |  19 +
 stream-receiver/DEPRECATED_MODULE                  |  19 +
 stream-source-kafka/DEPRECATED_MODULE              |  19 +
 30 files changed, 711 insertions(+), 244 deletions(-)

diff --git a/build/bin/kylin.sh b/build/bin/kylin.sh
index 9498f0b..a110c8c 100755
--- a/build/bin/kylin.sh
+++ b/build/bin/kylin.sh
@@ -212,7 +212,7 @@ function prepareFairScheduler() {
   <pool name="query_pushdown">
     <schedulingMode>FAIR</schedulingMode>
     <weight>1</weight>
-    <minShare>1</minShare>
+    <minShare>0</minShare>
   </pool>
   <pool name="heavy_tasks">
     <schedulingMode>FAIR</schedulingMode>
@@ -227,7 +227,7 @@ function prepareFairScheduler() {
   <pool name="vip_tasks">
     <schedulingMode>FAIR</schedulingMode>
     <weight>15</weight>
-    <minShare>1</minShare>
+    <minShare>0</minShare>
   </pool>
 </allocations>
 EOL
diff --git 
a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java 
b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
index 8915669..6246b94 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
@@ -566,42 +566,52 @@ public abstract class KylinConfigBase implements 
Serializable {
     // DICTIONARY & SNAPSHOT
     // 
============================================================================
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isUseForestTrieDictionary() {
         return 
Boolean.parseBoolean(getOptional("kylin.dictionary.use-forest-trie", TRUE));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public long getTrieDictionaryForestMaxTrieSizeMB() {
         return 
Integer.parseInt(getOptional("kylin.dictionary.forest-trie-max-mb", "500"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public long getCachedDictMaxEntrySize() {
         return Long.parseLong(getOptional("kylin.dictionary.max-cache-entry", 
"3000"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getCachedDictMaxSize() {
         return Integer.parseInt(getOptional("kylin.dictionary.max-cache-size", 
"-1"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isGrowingDictEnabled() {
         return 
Boolean.parseBoolean(this.getOptional("kylin.dictionary.growing-enabled", 
FALSE));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isDictResuable() {
         return 
Boolean.parseBoolean(this.getOptional("kylin.dictionary.resuable", FALSE));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public long getCachedDictionaryMaxEntrySize() {
         return 
Long.parseLong(getOptional("kylin.dictionary.cached-dict-max-cache-entry", 
"50000"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getAppendDictEntrySize() {
         return 
Integer.parseInt(getOptional("kylin.dictionary.append-entry-size", "10000000"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getAppendDictMaxVersions() {
         return 
Integer.parseInt(getOptional("kylin.dictionary.append-max-versions", "3"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getAppendDictVersionTTL() {
         return 
Integer.parseInt(getOptional("kylin.dictionary.append-version-ttl", 
"259200000"));
     }
@@ -670,43 +680,6 @@ public abstract class KylinConfigBase implements 
Serializable {
         return getOptional("kylin.dictionary.mr-hive.table.suffix", 
"_global_dict");
     }
 
-    // 
============================================================================
-    // Distributed/Spark Global dictionary
-    // Add wiki link here
-    // 
============================================================================
-
-
-    public int getGlobalDictV2MinHashPartitions() {
-        return 
Integer.parseInt(getOptional("kylin.dictionary.globalV2-min-hash-partitions", 
"10"));
-    }
-
-    public int getGlobalDictV2ThresholdBucketSize() {
-        return 
Integer.parseInt(getOptional("kylin.dictionary.globalV2-threshold-bucket-size", 
"500000"));
-    }
-
-    public int getDictionarySliceEvicationThreshold() {
-        return 
Integer.parseInt(getOptional("kylin.dictionary.slice.eviction.threshold", "5"));
-    }
-
-    public double getGlobalDictV2InitLoadFactor() {
-        return 
Double.parseDouble(getOptional("kylin.dictionary.globalV2-init-load-factor", 
"0.5"));
-    }
-
-    public double getGlobalDictV2BucketOverheadFactor() {
-        return 
Double.parseDouble(getOptional("kylin.dictionary.globalV2-bucket-overhead-factor",
 "1.5"));
-    }
-
-    public int getGlobalDictV2MaxVersions() {
-        return 
Integer.parseInt(getOptional("kylin.dictionary.globalV2-max-versions", "3"));
-    }
-
-    public long getGlobalDictV2VersionTTL() {
-        return 
Long.parseLong(getOptional("kylin.dictionary.globalV2-version-ttl", 
"259200000"));
-    }
-
-    public boolean isCheckGlobalDictV2() {
-        return 
Boolean.parseBoolean(getOptional("kylin.dictionary.globalV2-check", "true"));
-    }
 
     // 
============================================================================
     // CUBE
@@ -1106,7 +1079,7 @@ public abstract class KylinConfigBase implements 
Serializable {
     /**
      * was for route to hive, not used any more
      */
-    @Deprecated
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getHiveUrl() {
         return getOptional("kylin.source.hive.connection-url", "");
     }
@@ -1114,7 +1087,7 @@ public abstract class KylinConfigBase implements 
Serializable {
     /**
      * was for route to hive, not used any more
      */
-    @Deprecated
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getHiveUser() {
         return getOptional("kylin.source.hive.connection-user", "");
     }
@@ -1122,7 +1095,7 @@ public abstract class KylinConfigBase implements 
Serializable {
     /**
      * was for route to hive, not used any more
      */
-    @Deprecated
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getHivePassword() {
         return getOptional("kylin.source.hive.connection-password", "");
     }
@@ -1444,7 +1417,7 @@ public abstract class KylinConfigBase implements 
Serializable {
         return 
Integer.parseInt(this.getOptional("kylin.storage.hbase.max-visit-scanrange", 
"1000000"));
     }
 
-    @ConfigTag(ConfigTag.Tag.UNCATEGORIZED)
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getDefaultIGTStorage() {
         return getOptional("kylin.storage.hbase.gtstorage",
                 "org.apache.kylin.storage.hbase.cube.v2.CubeHBaseEndpointRPC");
@@ -1515,7 +1488,6 @@ public abstract class KylinConfigBase implements 
Serializable {
         return 
Integer.parseInt(getOptional("kylin.storage.hbase.replication-scope", "0"));
     }
 
-    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean cleanStorageAfterDelOperation() {
         return 
Boolean.parseBoolean(getOptional("kylin.storage.clean-after-delete-operation", 
FALSE));
     }
@@ -1540,11 +1512,6 @@ public abstract class KylinConfigBase implements 
Serializable {
         return Integer.parseInt(getOptional("kylin.engine.default", "6"));
     }
 
-
-    public String getSparkStandaloneMasterWebUI() {
-        return getOptional("kylin.engine.spark.standalone.master.httpUrl", "");
-    }
-
     public String getKylinJobJarPath() {
         final String jobJar = getOptional(KYLIN_ENGINE_MR_JOB_JAR);
         if (StringUtils.isNotEmpty(jobJar)) {
@@ -1683,89 +1650,95 @@ public abstract class KylinConfigBase implements 
Serializable {
     }
 
     // 
============================================================================
-    // ENGINE.SPARK
+    // ENGINE.SPARK (DEPRECATED)
     // 
============================================================================
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getHadoopConfDir() {
         return getOptional("kylin.env.hadoop-conf-dir", "");
     }
 
-    /**
-     * Get the sparder app name, default value is: 'sparder_on_localhost-7070'
-     */
-    public String getSparderAppName() {
-        String customSparderAppName = 
getOptional("kylin.query.sparder-context.app-name", "");
-        if (StringUtils.isEmpty(customSparderAppName)) {
-            customSparderAppName =
-                    "sparder_on_" + getServerRestAddress().replaceAll(":", 
"-");
-        }
-        return customSparderAppName;
-    }
-
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getSparkAdditionalJars() {
         return getOptional("kylin.engine.spark.additional-jars", "");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getFlinkAdditionalJars() {
         return getOptional("kylin.engine.flink.additional-jars", "");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public float getSparkRDDPartitionCutMB() {
         return 
Float.parseFloat(getOptional("kylin.engine.spark.rdd-partition-cut-mb", 
"10.0"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public float getFlinkPartitionCutMB() {
         return 
Float.parseFloat(getOptional("kylin.engine.flink.partition-cut-mb", "10.0"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getSparkMinPartition() {
         return 
Integer.parseInt(getOptional("kylin.engine.spark.min-partition", "1"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getFlinkMinPartition() {
         return 
Integer.parseInt(getOptional("kylin.engine.flink.min-partition", "1"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getSparkMaxPartition() {
         return 
Integer.parseInt(getOptional("kylin.engine.spark.max-partition", "5000"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getFlinkMaxPartition() {
         return 
Integer.parseInt(getOptional("kylin.engine.flink.max-partition", "5000"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getSparkStorageLevel() {
         return getOptional("kylin.engine.spark.storage-level", 
"MEMORY_AND_DISK_SER");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isSparkSanityCheckEnabled() {
         return 
Boolean.parseBoolean(getOptional("kylin.engine.spark.sanity-check-enabled", 
FALSE));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isSparkFactDistinctEnable() {
         return 
Boolean.parseBoolean(getOptional("kylin.engine.spark-fact-distinct", "false"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isSparkUHCDictionaryEnable() {
         return 
Boolean.parseBoolean(getOptional("kylin.engine.spark-udc-dictionary", "false"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isSparkCardinalityEnabled() {
         return 
Boolean.parseBoolean(getOptional("kylin.engine.spark-cardinality", "false"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getSparkOutputMaxSize() {
         return 
Integer.valueOf(getOptional("kylin.engine.spark.output.max-size", "10485760"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isSparkDimensionDictionaryEnabled() {
         return 
Boolean.parseBoolean(getOptional("kylin.engine.spark-dimension-dictionary", 
"false"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isFlinkSanityCheckEnabled() {
         return 
Boolean.parseBoolean(getOptional("kylin.engine.flink.sanity-check-enabled", 
FALSE));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isSparCreateHiveTableViaSparkEnable() {
         return 
Boolean.parseBoolean(getOptional("kylin.engine.spark-create-table-enabled", 
"false"));
     }
@@ -1774,26 +1747,32 @@ public abstract class KylinConfigBase implements 
Serializable {
     // ENGINE.LIVY
     // 
============================================================================
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isLivyEnabled() {
         return 
Boolean.parseBoolean(getOptional("kylin.engine.livy-conf.livy-enabled", FALSE));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getLivyRestApiBacktick() {
         return getOptional("kylin.engine.livy.backtick.quote", "");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getLivyUrl() {
         return getOptional("kylin.engine.livy-conf.livy-url");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public Map<String, String> getLivyKey() {
         return getPropertiesByPrefix("kylin.engine.livy-conf.livy-key.");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public Map<String, String> getLivyArr() {
         return getPropertiesByPrefix("kylin.engine.livy-conf.livy-arr.");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public Map<String, String> getLivyMap() {
         return getPropertiesByPrefix("kylin.engine.livy-conf.livy-map.");
     }
@@ -1802,6 +1781,7 @@ public abstract class KylinConfigBase implements 
Serializable {
     // QUERY
     // 
============================================================================
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isDictionaryEnumeratorEnabled() {
         return 
Boolean.parseBoolean(getOptional("kylin.query.enable-dict-enumerator", FALSE));
     }
@@ -1871,10 +1851,6 @@ public abstract class KylinConfigBase implements 
Serializable {
         return 
Boolean.parseBoolean(getOptional("kylin.query.stream-aggregate-enabled", TRUE));
     }
 
-    public String getProjectQuerySparkPool() {
-        return getOptional("kylin.query.spark.pool", null);
-    }
-
     public boolean isProjectIsolationEnabled() {
         return 
Boolean.parseBoolean(getOptional("kylin.storage.project-isolation-enable", 
TRUE));
     }
@@ -1908,11 +1884,13 @@ public abstract class KylinConfigBase implements 
Serializable {
         return 
Integer.parseInt(getOptional("kylin.query.project-concurrent-running-threshold",
 "0"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public long getQueryMaxScanBytes() {
         long value = Long.parseLong(getOptional("kylin.query.max-scan-bytes", 
"0"));
         return value > 0 ? value : Long.MAX_VALUE;
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public long getQueryMaxReturnRows() {
         return 
Integer.parseInt(this.getOptional("kylin.query.max-return-rows", "5000000"));
     }
@@ -2456,7 +2434,7 @@ public abstract class KylinConfigBase implements 
Serializable {
     }
 
     // 
============================================================================
-    // jdbc metadata resource store
+    // Jdbc metadata resource store
     // 
============================================================================
 
     public String getMetadataDialect() {
@@ -2492,151 +2470,189 @@ public abstract class KylinConfigBase implements 
Serializable {
     // 
============================================================================
     // Realtime streaming
     // 
============================================================================
+
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getStreamingStoreClass() {
         return getOptional("kylin.stream.store.class",
                 
"org.apache.kylin.stream.core.storage.columnar.ColumnarSegmentStore");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getStreamingBasicCuboidJobDFSBlockSize() {
         return getOptional("kylin.stream.job.dfs.block.size", 
String.valueOf(16 * 1024 * 1024));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getStreamingIndexPath() {
         return getOptional("kylin.stream.index.path", "stream_index");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingCubeConsumerTasksNum() {
         return 
Integer.parseInt(getOptional("kylin.stream.cube-num-of-consumer-tasks", "3"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingCubeWindowInSecs() {
         return Integer.parseInt(getOptional("kylin.stream.cube.window", 
"3600"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingCubeDurationInSecs() {
         return Integer.parseInt(getOptional("kylin.stream.cube.duration", 
"7200"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingCubeMaxDurationInSecs() {
         return Integer.parseInt(getOptional("kylin.stream.cube.duration.max", 
"43200"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingCheckPointFileMaxNum() {
         return 
Integer.parseInt(getOptional("kylin.stream.checkpoint.file.max.num", "5"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingCheckPointIntervalsInSecs() {
         return 
Integer.parseInt(getOptional("kylin.stream.index.checkpoint.intervals", "300"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingIndexMaxRows() {
         return Integer.parseInt(getOptional("kylin.stream.index.maxrows", 
"50000"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingMaxImmutableSegments() {
         return 
Integer.parseInt(getOptional("kylin.stream.immutable.segments.max.num", "100"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isStreamingConsumeFromLatestOffsets() {
         return 
Boolean.parseBoolean(getOptional("kylin.stream.consume.offsets.latest", 
"true"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getStreamingNode() {
         return getOptional("kylin.stream.node", null);
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public Map<String, String> getStreamingNodeProperties() {
         return getPropertiesByPrefix("kylin.stream.node");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getStreamingMetadataStoreType() {
         return getOptional("kylin.stream.metadata.store.type", "zk");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getStreamingSegmentRetentionPolicy() {
         return getOptional("kylin.stream.segment.retention.policy", 
"fullBuild");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getStreamingAssigner() {
         return getOptional("kylin.stream.assigner", "DefaultAssigner");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getCoordinatorHttpClientTimeout() {
         return 
Integer.parseInt(getOptional("kylin.stream.coordinator.client.timeout.millsecond",
 "5000"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getReceiverHttpClientTimeout() {
         return 
Integer.parseInt(getOptional("kylin.stream.receiver.client.timeout.millsecond", 
"5000"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingReceiverHttpMaxThreads() {
         return 
Integer.parseInt(getOptional("kylin.stream.receiver.http.max.threads", "200"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingReceiverHttpMinThreads() {
         return 
Integer.parseInt(getOptional("kylin.stream.receiver.http.min.threads", "10"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingReceiverQueryCoreThreads() {
         return 
Integer.parseInt(getOptional("kylin.stream.receiver.query-core-threads", "50"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingReceiverQueryMaxThreads() {
         return 
Integer.parseInt(getOptional("kylin.stream.receiver.query-max-threads", "200"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingReceiverUseThreadsPerQuery() {
         return 
Integer.parseInt(getOptional("kylin.stream.receiver.use-threads-per-query", 
"8"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingRPCHttpConnTimeout() {
         return 
Integer.parseInt(getOptional("kylin.stream.rpc.http.connect.timeout", "10000"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingRPCHttpReadTimeout() {
         return 
Integer.parseInt(getOptional("kylin.stream.rpc.http.read.timeout", "60000"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isStreamingBuildAdditionalCuboids() {
         return 
Boolean.parseBoolean(getOptional("kylin.stream.build.additional.cuboids", 
"false"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public Map<String, String> 
getStreamingSegmentRetentionPolicyProperties(String policyName) {
         return getPropertiesByPrefix("kylin.stream.segment.retention.policy." 
+ policyName + ".");
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingMaxFragmentsInSegment() {
         return 
Integer.parseInt(getOptional("kylin.stream.segment-max-fragments", "50"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingMinFragmentsInSegment() {
         return 
Integer.parseInt(getOptional("kylin.stream.segment-min-fragments", "15"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public int getStreamingMaxFragmentSizeInMb() {
         return 
Integer.parseInt(getOptional("kylin.stream.max-fragment-size-mb", "300"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isStreamingFragmentsAutoMergeEnabled() {
         return 
Boolean.parseBoolean(getOptional("kylin.stream.fragments-auto-merge-enable", 
"true"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isStreamingConcurrentScanEnabled() {
         return 
Boolean.parseBoolean(getOptional("kylin.stream.segment.concurrent.scan", 
"false"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isStreamingStandAloneMode() {
         return 
Boolean.parseBoolean(getOptional("kylin.stream.stand-alone.mode", "false"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isNewCoordinatorEnabled() {
         return 
Boolean.parseBoolean(getOptional("kylin.stream.new.coordinator-enabled", 
"true"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getLocalStorageImpl() {
         return getOptional("kylin.stream.settled.storage", null);
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getStreamMetrics() {
         return getOptional("kylin.stream.metrics.option", "");
     }
@@ -2644,10 +2660,12 @@ public abstract class KylinConfigBase implements 
Serializable {
     /**
      * whether to print encode integer value for count distinct string value, 
only for debug/test purpose
      */
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isPrintRealtimeDictEnabled() {
         return 
Boolean.parseBoolean(getOptional("kylin.stream.print-realtime-dict-enabled", 
"false"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public long getStreamMetricsInterval() {
         return Long.parseLong(getOptional("kylin.stream.metrics.interval", 
"5"));
     }
@@ -2655,14 +2673,17 @@ public abstract class KylinConfigBase implements 
Serializable {
     /**
      * whether realtime query should add timezone offset by kylin's 
web-timezone, please refer to KYLIN-4010 for detail
      */
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getStreamingDerivedTimeTimezone() {
         return (getOptional("kylin.stream.event.timezone", ""));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public boolean isAutoResubmitDiscardJob() {
         return 
Boolean.parseBoolean(getOptional("kylin.stream.auto-resubmit-after-discard-enabled",
 "true"));
     }
 
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public String getHiveDatabaseLambdaCube() {
         return this.getOptional("kylin.stream.hive.database-for-lambda-cube", 
DEFAULT);
     }
@@ -2691,8 +2712,9 @@ public abstract class KylinConfigBase implements 
Serializable {
         return 
Integer.parseInt(getOptional("kylin.tool.health-check.stale-job-threshold-days",
 "30"));
     }
 
+
     // 
============================================================================
-    // Kylin 4.x related
+    // Kylin 4.X Build Engine
     // 
============================================================================
 
     public String getKylinParquetJobJarPath() {
@@ -2710,6 +2732,7 @@ public abstract class KylinConfigBase implements 
Serializable {
     /**
      * Use https://github.com/spektom/spark-flamegraph for Spark profile
      */
+    @ConfigTag(ConfigTag.Tag.DEBUG_HACK)
     public String getSparkSubmitCmd() {
         return getOptional("kylin.engine.spark-cmd", null);
     }
@@ -2724,32 +2747,6 @@ public abstract class KylinConfigBase implements 
Serializable {
         return getOptional("kylin.engine.spark.build-class-name", 
"org.apache.kylin.engine.spark.job.CubeBuildJob");
     }
 
-    public Boolean getSparkEngineTaskImpactInstanceEnabled() {
-        return 
Boolean.parseBoolean(getOptional("kylin.engine.spark.task-impact-instance-enabled",
 "true"));
-    }
-
-    public int getSparkEngineTaskCoreFactor() {
-        return 
Integer.parseInt(getOptional("kylin.engine.spark.task-core-factor", "3"));
-    }
-
-    public int getSparkEngineDriverMemoryBase() {
-        return Integer.parseInt(getOptional("kylin.engine.driver-memory-base", 
"1024"));
-    }
-
-    public boolean isTrackingUrlIpAddressEnabled() {
-        return 
Boolean.valueOf(this.getOptional("kylin.job.tracking-url-ip-address-enabled", 
TRUE));
-    }
-
-    //Auto adjust the memory of driver
-    public int[] getSparkEngineDriverMemoryStrategy() {
-        String[] dft = {"2", "20", "100"};
-        return getOptionalIntArray("kylin.engine.driver-memory-strategy", dft);
-    }
-
-    public int getSparkEngineDriverMemoryMaximum() {
-        return 
Integer.parseInt(getOptional("kylin.engine.driver-memory-maximum", "4096"));
-    }
-
     public StorageURL getJobTmpMetaStoreUrl(String project, String jobId) {
         Map<String, String> params = new HashMap<>();
         params.put("path", getJobTmpDir(project) + getNestedPath(jobId) + 
"meta");
@@ -2857,10 +2854,11 @@ public abstract class KylinConfigBase implements 
Serializable {
         return 
Integer.valueOf(getOptional("kylin.storage.columnar.dfs-replication", "3"));
     }
 
-    public boolean isAutoSetSparkConf() {
-        return Boolean.parseBoolean(getOptional("kylin.spark-conf.auto.prior", 
"true"));
-    }
-
+    /**
+     * Read-Write separation deployment for Kylin 4
+     * Please check 
https://cwiki.apache.org/confluence/display/KYLIN/Read-Write+Separation+Deployment+for+Kylin+4.0
+     */
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
     public String getBuildConf() {
         return getOptional("kylin.engine.submit-hadoop-conf-dir", "");
     }
@@ -2884,6 +2882,88 @@ public abstract class KylinConfigBase implements 
Serializable {
         return Integer.parseInt(getOptional("kylin.engine.max-retry-time", 
"3"));
     }
 
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
+    public int getSnapshotShardSizeMB() {
+        return Integer.parseInt(getOptional("kylin.snapshot.shard-size-mb", 
"128"));
+    }
+
+    /**
+     * If we should calculate cuboid statistics for each segment, which is 
needed for cube planner phase two
+     */
+    @ConfigTag(ConfigTag.Tag.NOT_CLEAR)
+    public boolean isSegmentStatisticsEnabled() {
+        return 
Boolean.parseBoolean(this.getOptional("kylin.engine.segment-statistics-enabled",
 "false"));
+    }
+
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
+    public String getParentDatasetStorageLevel() {
+        return 
getOptional("kylin.engine.spark.cache-parent-dataset-storage-level", "NONE");
+    }
+
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
+    public int getMaxParentDatasetPersistCount() {
+        return 
Integer.parseInt(getOptional("kylin.engine.spark.cache-parent-dataset-count", 
"1"));
+    }
+
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
+    public boolean isBuildBaseCuboid() {
+        return 
Boolean.valueOf(getOptional("kylin.engine.build-base-cuboid-enabled", TRUE));
+    }
+
+    public boolean isTrackingUrlIpAddressEnabled() {
+        return 
Boolean.valueOf(this.getOptional("kylin.job.tracking-url-ip-address-enabled", 
TRUE));
+    }
+
+    // 
============================================================================
+    // Kylin 4.X Spark resources automatic adjustment strategy configuration
+    // 
============================================================================
+
+    /**
+     * <pre>
+     * For a CubeBuildJob and CubeMergeJob, it is important to allocate enough 
and proper resources(cpu/memory), including following config entries mainly:
+     *   - spark.driver.memory
+     *   - spark.executor.memory
+     *   - spark.executor.cores
+     *   - spark.executor.memoryOverhead
+     *   - spark.executor.instances
+     *   - spark.sql.shuffle.partitions
+     *
+     *  When `kylin.spark-conf.auto.prior` is set to true, Kylin will try to 
adjust above config entries according to:
+     *    - Count of cuboids to be built
+     *    - (Max)Size of fact table
+     *    - Available resources from current resource manager 's queue
+     *
+     *  But user still can choose to override some config via 
`kylin.engine.spark-conf.XXX` in Cube level .
+     *  Check detail at 
https://cwiki.apache.org/confluence/display/KYLIN/How+to+improve+cube+building+and+query+performance
+     * </pre>
+     *
+     */
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
+    public boolean isAutoSetSparkConf() {
+        return Boolean.parseBoolean(getOptional("kylin.spark-conf.auto.prior", 
"true"));
+    }
+
+    public Boolean getSparkEngineTaskImpactInstanceEnabled() {
+        return 
Boolean.parseBoolean(getOptional("kylin.engine.spark.task-impact-instance-enabled",
 "true"));
+    }
+
+    public int getSparkEngineTaskCoreFactor() {
+        return 
Integer.parseInt(getOptional("kylin.engine.spark.task-core-factor", "3"));
+    }
+
+    public int getSparkEngineDriverMemoryBase() {
+        return Integer.parseInt(getOptional("kylin.engine.driver-memory-base", 
"1024"));
+    }
+
+    public int[] getSparkEngineDriverMemoryStrategy() {
+        String[] dft = {"2", "20", "100"};
+        return getOptionalIntArray("kylin.engine.driver-memory-strategy", dft);
+    }
+
+    public int getSparkEngineDriverMemoryMaximum() {
+        return 
Integer.parseInt(getOptional("kylin.engine.driver-memory-maximum", "4096"));
+    }
+
     public double getSparkEngineRetryMemoryGradient() {
         return 
Double.parseDouble(getOptional("kylin.engine.retry-memory-gradient", "1.5"));
     }
@@ -2908,13 +2988,133 @@ public abstract class KylinConfigBase implements 
Serializable {
         return getOptional("kylin.engine.executor-instance-strategy", 
"100,2,500,3,1000,4");
     }
 
-    public int getSnapshotShardSizeMB() {
-        return Integer.parseInt(getOptional("kylin.snapshot.shard-size-mb", 
"128"));
+
+    // 
============================================================================
+    // Kylin 4.X Global dictionary
+    // Wiki : 
https://cwiki.apache.org/confluence/display/KYLIN/Global+Dictionary+on+Spark
+    // 
============================================================================
+
+
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
+    public int getGlobalDictV2MinHashPartitions() {
+        return 
Integer.parseInt(getOptional("kylin.dictionary.globalV2-min-hash-partitions", 
"10"));
+    }
+
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
+    public int getGlobalDictV2ThresholdBucketSize() {
+        return 
Integer.parseInt(getOptional("kylin.dictionary.globalV2-threshold-bucket-size", 
"500000"));
+    }
+
+    public int getDictionarySliceEvicationThreshold() {
+        return 
Integer.parseInt(getOptional("kylin.dictionary.slice.eviction.threshold", "5"));
+    }
+
+    @ConfigTag({ConfigTag.Tag.CUBE_LEVEL})
+    public double getGlobalDictV2InitLoadFactor() {
+        return 
Double.parseDouble(getOptional("kylin.dictionary.globalV2-init-load-factor", 
"0.5"));
+    }
+
+    @ConfigTag({ConfigTag.Tag.CUBE_LEVEL})
+    public double getGlobalDictV2BucketOverheadFactor() {
+        return 
Double.parseDouble(getOptional("kylin.dictionary.globalV2-bucket-overhead-factor",
 "1.5"));
+    }
+
+    @ConfigTag({ConfigTag.Tag.CUBE_LEVEL})
+    public int getGlobalDictV2MaxVersions() {
+        return 
Integer.parseInt(getOptional("kylin.dictionary.globalV2-max-versions", "3"));
+    }
+
+    @ConfigTag({ConfigTag.Tag.CUBE_LEVEL})
+    public long getGlobalDictV2VersionTTL() {
+        return 
Long.parseLong(getOptional("kylin.dictionary.globalV2-version-ttl", 
"259200000"));
+    }
+
+    @ConfigTag({ConfigTag.Tag.CUBE_LEVEL})
+    public boolean isCheckGlobalDictV2() {
+        return 
Boolean.parseBoolean(getOptional("kylin.dictionary.globalV2-check-enabled", 
"true"));
+    }
+
+    /**
+     * Detect dataset skew in dictionary encode step.
+     */
+    @ConfigTag({ConfigTag.Tag.CUBE_LEVEL})
+    public boolean detectDataSkewInDictEncodingEnabled() {
+        return 
Boolean.valueOf(getOptional("kylin.dictionary.detect-data-skew-sample-enabled", 
FALSE));
+    }
+
+    /**
+     * In some data skew cases, the repartition step during dictionary 
encoding will be slow.
+     * We can choose to sample from the dataset to detect skewed. This 
configuration is used to set the sample rate.
+     */
+    @ConfigTag({ConfigTag.Tag.CUBE_LEVEL})
+    public double sampleRateInEncodingSkewDetection() {
+        return 
Double.valueOf(getOptional("kylin.dictionary.detect-data-skew-sample-rate", 
"0.1"));
+    }
+
+    /*
+     * In KYLIN4, dictionaries are hashed into several buckets, column data 
are repartitioned by the same hash algorithm
+     * during encoding step too. In data skew cases, the repartition step will 
be very slow. Kylin will automatically
+     * sample from the source to detect skewed data and repartition these 
skewed data to random partitions.
+     * This configuration is used to set the skew data threshold, valued from 
0 to 1.
+     * e.g.
+     *   if you set this value to 0.05, for each value that takes up more than 
5% percent of the total will be regarded
+     *   as skew data, as a result the skewed data will be no more than 20 
records
+     * */
+    @ConfigTag({ConfigTag.Tag.CUBE_LEVEL})
+    public double skewPercentageThreshHold() {
+        return 
Double.valueOf(getOptional("kylin.dictionary.detect-data-skew-percentage-threshold",
 "0.05"));
+    }
+
+    /***
+     * Global dictionary will be split into several buckets. To encode a 
column to int value more
+     * efficiently, source dataset will be repartitioned by the to-be encoded 
column to the same
+     * amount of partitions as the dictionary's bucket size.
+     *
+     * It sometimes bring side effect, because repartitioning by a single 
column is more likely to cause
+     * serious data skew, causing one task takes the majority of time in first 
layer's cuboid building.
+     *
+     * When faced with this case, you can try repartitioning encoded dataset 
by all
+     * RowKey columns to avoid data skew. The repartition size is default to 
max bucket
+     * size of all dictionaries, but you can also set to other flexible value 
by this option:
+     * 'kylin.engine.spark.dataset.repartition.num.after.encoding'
+     */
+    @ConfigTag({ConfigTag.Tag.CUBE_LEVEL})
+    public boolean rePartitionEncodedDatasetWithRowKey() {
+        return 
Boolean.valueOf(getOptional("kylin.engine.spark.repartition.dataset.after.encode-enabled",
 FALSE));
+    }
+
+    @ConfigTag({ConfigTag.Tag.CUBE_LEVEL})
+    public int getRepartitionNumAfterEncode() {
+        return 
Integer.valueOf(getOptional("kylin.engine.spark.repartition.dataset.after.encode.num",
 "0"));
+    }
+
+    @ConfigTag(ConfigTag.Tag.GLOBAL_LEVEL)
+    public String getSparkStandaloneMasterWebUI() {
+        return getOptional("kylin.engine.spark.standalone.master.httpUrl", "");
+    }
+
+
+    // 
============================================================================
+    // Kylin 4.X Query Engine (SparderContext)
+    // 
============================================================================
+
+    /**
+     * Set the sparder app name, default value is: 
'sparder_on_${hostname}-${port}'
+     */
+    @ConfigTag(ConfigTag.Tag.GLOBAL_LEVEL)
+    public String getSparderAppName() {
+        String customSparderAppName = 
getOptional("kylin.query.sparder-context.app-name", "");
+        if (StringUtils.isEmpty(customSparderAppName)) {
+            customSparderAppName =
+                    "sparder_on_" + getServerRestAddress().replaceAll(":", 
"-");
+        }
+        return customSparderAppName;
     }
 
     /**
      * driver memory that can be used by join(mostly BHJ)
      */
+    @ConfigTag(ConfigTag.Tag.DEPRECATED)
     public double getJoinMemoryFraction() {
         return 
Double.parseDouble(getOptional("kylin.query.spark-engine.join-memory-fraction", 
"0.3"));
     }
@@ -2932,7 +3132,6 @@ public abstract class KylinConfigBase implements 
Serializable {
         return getLogPropertyFile("spark-executor-log4j.properties");
     }
 
-
     private String getLogPropertyFile(String filename) {
         if (isDevEnv()) {
             return Paths.get(getKylinHomeWithoutWarn(),
@@ -2943,30 +3142,59 @@ public abstract class KylinConfigBase implements 
Serializable {
         }
     }
 
+    /**
+     * <pre>
+     * SparderContext will try to set `spark.sql.shuffle.partitions` for each 
query according to bytes to scan
+     * 1. set to -1 to let it auto decided by query engine, to be specific, it 
is
+     *   ${total bytes of all files after pruned by FilePruner} / 
KylinConfigBase#getQueryPartitionSplitSizeMB
+     * 2. other positive integer to set a fixed value.
+     * </pre>
+     *
+     * @see KylinConfigBase#getQueryPartitionSplitSizeMB
+     */
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
+    public int getSparkSqlShufflePartitions() {
+        return 
Integer.parseInt(getOptional("kylin.query.spark-engine.spark-sql-shuffle-partitions",
+                "-1"));
+    }
+
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
     public int getQueryPartitionSplitSizeMB() {
         return 
Integer.parseInt(getOptional("kylin.query.spark-engine.partition-split-size-mb",
                 "64"));
     }
 
+    @ConfigTag(ConfigTag.Tag.GLOBAL_LEVEL)
+    public boolean isAutoSetPushDownPartitions() {
+        return Boolean
+                
.parseBoolean(this.getOptional("kylin.query.pushdown.auto-set-shuffle-partitions-enabled",
 "true"));
+    }
+
+    @ConfigTag(ConfigTag.Tag.GLOBAL_LEVEL)
+    public int getBaseShufflePartitionSize() {
+        return 
Integer.parseInt(this.getOptional("kylin.query.pushdown.base-shuffle-partition-size",
 "48"));
+    }
+
     /**
      * The max size in mb handled per task when using shard by column,
      * if the sharding size exceeds this value, it will fall back to 
non-sharding read RDD
      */
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
     public int getMaxShardingSizeMBPerTask() {
         return 
Integer.parseInt(getOptional("kylin.query.spark-engine.max-sharding-size-mb",
                 "64"));
     }
 
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
     public boolean isShardingJoinOptEnabled() {
         return 
Boolean.parseBoolean(getOptional("kylin.query.spark-engine.expose-sharding-trait",
                 "true"));
     }
 
-    public int getSparkSqlShufflePartitions() {
-        return 
Integer.parseInt(getOptional("kylin.query.spark-engine.spark-sql-shuffle-partitions",
-                "-1"));
-    }
-
+    /**
+     * Set proper resources(cpu and memory) for SparderContext
+     */
+    @ConfigTag(ConfigTag.Tag.GLOBAL_LEVEL)
     public Map<String, String> getQuerySparkConf() {
         return getPropertiesByPrefix("kylin.query.spark-conf.");
     }
@@ -2986,6 +3214,7 @@ public abstract class KylinConfigBase implements 
Serializable {
         return Integer.parseInt(getOptional("kylin.query.bitmap-upper-bound", 
"10000000"));
     }
 
+    @ConfigTag(ConfigTag.Tag.CUBE_LEVEL)
     public boolean needReplaceAggWhenExactlyMatched() {
         return 
Boolean.parseBoolean(getOptional("kylin.query.need-replace-exactly-agg", 
"true"));
     }
@@ -3045,26 +3274,50 @@ public abstract class KylinConfigBase implements 
Serializable {
         }
     }
 
-    public boolean isAutoSetPushDownPartitions() {
-        return Boolean
-                
.parseBoolean(this.getOptional("kylin.query.pushdown.auto-set-shuffle-partitions-enabled",
 "true"));
-    }
-
     public String getJobOutputStorePath(String project, String jobId) {
         return getSparkLogDir(project) + getNestedPath(jobId) + 
"execute_output.json";
     }
 
-    public int getBaseShufflePartitionSize() {
-        return 
Integer.parseInt(this.getOptional("kylin.query.pushdown.base-shuffle-partition-size",
 "48"));
+    /**
+     * <pre>
+     * The fair scheduler of Apache Spark supports grouping jobs into pools, 
and setting different scheduling options (e.g. weight) for each pool. This can 
be useful to create a “high-priority” pool for more important query jobs.
+     *
+     * Query engine of Kylin 4 support set pool for query at project level and 
thread level, and it has built-in pools:($KYLIN_HOME/conf/fairscheduler.xml)
+     *
+     *   - lightweight_tasks are query which not require all available cpu 
cores
+     *   - heavy_tasks are query which require all available cpu cores
+     *   - query_pushdown are query which not answered by cube
+     *
+     * Please check following link for detail.
+     *   - 
http://spark.apache.org/docs/latest/job-scheduling.html#scheduling-within-an-application
+     *   - 
https://cwiki.apache.org/confluence/display/KYLIN/Use+different+spark+pool+for+different+query
+     * </pre>
+     */
+    @ConfigTag({ConfigTag.Tag.PROJECT_LEVEL, ConfigTag.Tag.THREAD_LEVEL})
+    public String getProjectQuerySparkPool() {
+        return getOptional("kylin.query.spark.pool", null);
     }
 
+    /**
+     * Whether or not to start SparderContext when query server start, set to 
false if your
+     */
+    @ConfigTag(ConfigTag.Tag.GLOBAL_LEVEL)
     public boolean isAutoStartSparder() {
-        return 
Boolean.parseBoolean(this.getOptional("kylin.query.auto-sparder-context", 
"false"));
+        return 
Boolean.parseBoolean(this.getOptional("kylin.query.auto-sparder-context-enabled",
 "false"));
+    }
+
+    /**
+     * whether to enable sparder monitor function
+     */
+    @ConfigTag(ConfigTag.Tag.GLOBAL_LEVEL)
+    public boolean isSparderCanaryEnabled() {
+        return 
Boolean.parseBoolean(this.getOptional("kylin.canary.sparder-context-canary-enabled",
 TRUE));
     }
 
     /**
      * Sparder is considered unavailable when the check task is unresponsive 
for more than this time
      */
+    @ConfigTag(ConfigTag.Tag.GLOBAL_LEVEL)
     public int getSparderCanaryErrorResponseMs() {
         return 
Integer.parseInt(this.getOptional("kylin.canary.sparder-context-error-response-ms",
 "3000"));
     }
@@ -3072,6 +3325,7 @@ public abstract class KylinConfigBase implements 
Serializable {
     /**
      * The maximum number of restart sparder when sparder is not available
      */
+    @ConfigTag(ConfigTag.Tag.GLOBAL_LEVEL)
     public int getThresholdToRestartSparder() {
         return 
Integer.parseInt(this.getOptional("kylin.canary.sparder-context-threshold-to-restart-spark",
 "3"));
     }
@@ -3079,16 +3333,11 @@ public abstract class KylinConfigBase implements 
Serializable {
     /**
      * Time period between two sparder health checks
      */
+    @ConfigTag(ConfigTag.Tag.GLOBAL_LEVEL)
     public int getSparderCanaryPeriodMinutes() {
         return 
Integer.parseInt(this.getOptional("kylin.canary.sparder-context-period-min", 
"3"));
     }
 
-    /**
-     * If we should calculate cuboid statistics for each segment, which is 
needed for cube planner phase two
-     */
-    public boolean isSegmentStatisticsEnabled() {
-        return 
Boolean.parseBoolean(this.getOptional("kylin.engine.segment-statistics-enabled",
 "false"));
-    }
 
     // 
============================================================================
     // Spark with Kerberos
@@ -3154,65 +3403,4 @@ public abstract class KylinConfigBase implements 
Serializable {
     public String getKerberosPrincipal() {
         return getOptional("kylin.kerberos.principal");
     }
-
-    public String getParentDatasetStorageLevel() {
-        return getOptional("kylin.engine.spark.parent-dataset.storage.level", 
"NONE");
-    }
-
-    public int getMaxParentDatasetPersistCount() {
-        return 
Integer.parseInt(getOptional("kylin.engine.spark.parent-dataset.max.persist.count",
 "1"));
-    }
-
-    public int getRepartitionNumAfterEncode() {
-        return 
Integer.valueOf(getOptional("kylin.engine.spark.dataset.repartition.num.after.encoding",
 "0"));
-    }
-
-    /***
-     * Global dictionary will be split into several buckets. To encode a 
column to int value more
-     * efficiently, source dataset will be repartitioned by the to-be encoded 
column to the same
-     * amount of partitions as the dictionary's bucket size.
-     *
-     * It sometimes bring side effect, because repartitioning by a single 
column is more likely to cause
-     * serious data skew, causing one task takes the majority of time in first 
layer's cuboid building.
-     *
-     * When faced with this case, you can try repartitioning encoded dataset 
by all
-     * RowKey columns to avoid data skew. The repartition size is default to 
max bucket
-     * size of all dictionaries, but you can also set to other flexible value 
by this option:
-     * 'kylin.engine.spark.dataset.repartition.num.after.encoding'
-     ***/
-    public boolean rePartitionEncodedDatasetWithRowKey() {
-        return 
Boolean.valueOf(getOptional("kylin.engine.spark.repartition.encoded.dataset", 
"false"));
-    }
-
-    /*
-     * Detect dataset skew in dictionary encode step.
-     * */
-    public boolean detectDataSkewInDictEncodingEnabled() {
-        return 
Boolean.valueOf(getOptional("kylin.dictionary.detect.data.skew.in.encoding", 
"false"));
-    }
-
-    /*
-    * In some data skew cases, the repartition step during dictionary encoding 
will be slow.
-    * We can choose to sample from the dataset to detect skewed. This 
configuration is used to set the sample rate.
-    * */
-    public double sampleRateInEncodingSkewDetection() {
-        return 
Double.valueOf(getOptional("kylin.dictionary.detect.data.skew.sample.rate", 
"0.1"));
-    }
-
-    /*
-    * In KYLIN4, dictionaries are hashed into several buckets, column data are 
repartitioned by the same hash algorithm
-    * during encoding step too. In data skew cases, the repartition step will 
be very slow. Kylin will automatically
-    * sample from the source to detect skewed data and repartition these 
skewed data to random partitions.
-    * This configuration is used to set the skew data threshhold, valued from 
0 to 1.
-    * e.g.
-    *   if you set this value to 0.05, for each value that takes up more than 
5% percent of the total will be regarded
-    *   as skew data, as a result the skewed data will be no more than 20 
records
-    * */
-    public double skewPercentageThreshHold() {
-        return 
Double.valueOf(getOptional("kylin.dictionary.data.skew.percentage.threshhold", 
"0.05"));
-    }
-
-    public boolean isBuildBaseCuboid() {
-        return Boolean.valueOf(getOptional("kylin.engine.cuboid.build.base", 
"true"));
-    }
 }
diff --git 
a/core-common/src/main/java/org/apache/kylin/common/QueryContext.java 
b/core-common/src/main/java/org/apache/kylin/common/QueryContext.java
index 16999e9..53f67f9 100644
--- a/core-common/src/main/java/org/apache/kylin/common/QueryContext.java
+++ b/core-common/src/main/java/org/apache/kylin/common/QueryContext.java
@@ -214,12 +214,10 @@ public class QueryContext {
         return scanTime.addAndGet(time);
     }
 
-    @Clarification(priority = Clarification.Priority.MAJOR, msg = "remove 
this")
     public void addQueryStopListener(QueryStopListener listener) {
         this.stopListeners.add(listener);
     }
 
-    @Clarification(priority = Clarification.Priority.MAJOR, msg = "Maybe we 
can change spark.scheduler.pool to implement resource isolation.")
     public void setHighPriorityQuery(boolean highPriorityQuery) {
         isHighPriorityQuery = highPriorityQuery;
     }
diff --git 
a/core-common/src/main/java/org/apache/kylin/common/annotation/ConfigTag.java 
b/core-common/src/main/java/org/apache/kylin/common/annotation/ConfigTag.java
index 53a6967..e82fa49 100644
--- 
a/core-common/src/main/java/org/apache/kylin/common/annotation/ConfigTag.java
+++ 
b/core-common/src/main/java/org/apache/kylin/common/annotation/ConfigTag.java
@@ -34,11 +34,17 @@ public @interface ConfigTag {
     Tag[] value();
 
     enum Tag {
+
+        // =============== basic classification ===============
+
         /**
-         * Indicate this property will be removed soon.
+         * Out of date, indicate this property will be removed soon, most of 
them are from Kylin 3.X.
          */
         DEPRECATED,
 
+        /**
+         * Not well tested/supported for now.
+         */
         NOT_CLEAR,
 
         /**
@@ -47,28 +53,36 @@ public @interface ConfigTag {
         NOT_IMPLEMENTED,
 
         /**
-         * To be categorized
+         * For hacker or developer, not for user
          */
-        UNCATEGORIZED,
+        DEBUG_HACK,
+
+        // =============== configuration level ===============
 
         /**
-         * For hacker or developer
+         * Support thread/local level configuration (BackdoorToggles)
          */
-        DEBUG_HACK,
+        THREAD_LEVEL,
 
         /**
-         * Support cube level configuration
+         * Support cube level configuration (CubeInstance)
          */
         CUBE_LEVEL,
 
         /**
-         * Support project level configuration
+         * Support project level configuration (ProjectInstance)
          */
         PROJECT_LEVEL,
 
         /**
-         * Only support global configuration
+         * Only support global level configuration, require restart Kylin 
instance (kylin.properties)
          */
-        GLOBAL_LEVEL
+        GLOBAL_LEVEL,
+
+        // =============== importance level ===============
+
+        MAJOR,
+
+        MINOR
     }
 }
\ No newline at end of file
diff --git a/core-common/src/main/resources/kylin-defaults.properties 
b/core-common/src/main/resources/kylin-defaults.properties
index 1009ee6..384466f 100644
--- a/core-common/src/main/resources/kylin-defaults.properties
+++ b/core-common/src/main/resources/kylin-defaults.properties
@@ -87,26 +87,9 @@ kylin.server.external-acl-provider=
 # Default time filter for job list, 0->current day, 1->last one day, 2->last 
one week, 3->last one year, 4->all
 kylin.web.default-time-filter=1
 
-### SOURCE ###
-# Define how to access to hive metadata
-# When user deploy kylin on AWS EMR and Glue is used as external metadata, use 
gluecatalog instead
-kylin.source.hive.metadata-type=hcatalog
-
-# Hive client, valid value [cli, beeline]
-kylin.source.hive.client=cli
-
-# Absolute path to beeline shell, can be set to spark beeline instead of the 
default hive beeline on PATH
-kylin.source.hive.beeline-shell=beeline
-
-# Hive database name for putting the intermediate flat tables
-kylin.source.hive.database-for-flat-table=default
-
 ### STORAGE ###
 
-# The storage for final cube file in hbase
-kylin.storage.url=hbase
-
-# clean real storage after delete operation
+# clean real storage after purge operation
 # if you want to delete the real storage like htable of deleting segment, you 
can set it to true
 kylin.storage.clean-after-delete-operation=false
 
@@ -136,18 +119,6 @@ kylin.job.scheduler.default=0
 
 kylin.cube.cuboid-scheduler=org.apache.kylin.cube.cuboid.DefaultCuboidScheduler
 kylin.cube.segment-advisor=org.apache.kylin.cube.CubeSegmentAdvisor
-
-# 'auto', 'inmem', 'layer' or 'random' for testing 
-kylin.cube.algorithm=layer
-
-# A smaller threshold prefers layer, a larger threshold prefers in-mem
-kylin.cube.algorithm.layer-or-inmem-threshold=7
-
-# auto use inmem algorithm:
-# 1, cube planner optimize job
-# 2, no source record
-kylin.cube.algorithm.inmem-auto-optimize=true
-
 kylin.cube.aggrgroup.max-combination=32768
 
 kylin.cube.cubeplanner.enabled=false
@@ -160,11 +131,6 @@ kylin.cube.cubeplanner.algorithm-threshold-genetic=23
 
 ### QUERY ###
 
-# Controls the maximum number of bytes a query is allowed to scan storage.
-# The default value 0 means no limit.
-# The counterpart kylin.storage.partition.max-scan-bytes sets the maximum per 
coprocessor.
-kylin.query.max-scan-bytes=0
-
 kylin.query.cache-enabled=true
 kylin.query.cache-threshold-scan-count=10240
 kylin.query.cache-threshold-duration=2000
@@ -235,12 +201,19 @@ kylin.security.saml.context-server-name=hostname
 kylin.security.saml.context-server-port=443
 kylin.security.saml.context-path=/kylin
 
+##################################
 ### SPARK BUILD ENGINE CONFIGS ###
 
 # Hadoop conf folder, will export this as "HADOOP_CONF_DIR" to run spark-submit
 # This must contain site xmls of core, yarn, hive, and hbase in one folder
 #kylin.env.hadoop-conf-dir=/etc/hadoop/conf
 
+# Switch to spark resources automatic adjustment strategy
+kylin.spark-conf.auto.prior=true
+
+# Read-Write separation deployment for Kylin 4, please check 
https://cwiki.apache.org/confluence/display/KYLIN/Read-Write+Separation+Deployment+for+Kylin+4.0
+#kylin.engine.submit-hadoop-conf-dir=
+
 # Spark conf (default is in spark/conf/spark-defaults.conf)
 kylin.engine.spark-conf.spark.master=yarn
 kylin.engine.spark-conf.spark.submit.deployMode=client
@@ -269,11 +242,16 @@ 
kylin.engine.spark-conf.spark.executor.extraJavaOptions=-Dfile.encoding=UTF-8 -D
 #kylin.engine.spark-conf.spark.yarn.am.extraJavaOptions=-Dhdp.version=current
 
kylin.engine.spark-conf.spark.driver.extraJavaOptions=-XX:+CrashOnOutOfMemoryError
 
-### SPARK QUERY ENGINE CONFIGS (a.k.a. Sparder Context) ###
+##################################
+### SPARK QUERY ENGINE CONFIGS ###
+
 # Enlarge cores and memory to improve query performance in production env, 
please check https://cwiki.apache.org/confluence/display/KYLIN/User+Manual+4.X
 
+#Whether or not to start SparderContext when query server start
+kylin.query.auto-sparder-context-enabled-enabled=false
+#kylin.query.sparder-context.app-name=
+
 kylin.query.spark-conf.spark.master=yarn
-#kylin.query.spark-conf.spark.submit.deployMode=client
 kylin.query.spark-conf.spark.driver.cores=1
 kylin.query.spark-conf.spark.driver.memory=4G
 kylin.query.spark-conf.spark.driver.memoryOverhead=1G
diff --git a/core-dictionary/DEPRECATED_MODULE 
b/core-dictionary/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/core-dictionary/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git a/datasource-sdk/DEPRECATED_MODULE b/datasource-sdk/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/datasource-sdk/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git a/docker/conf/kylin/kylin.properties 
b/docker/conf/kylin/kylin.properties
index 7054d83..a537d46 100644
--- a/docker/conf/kylin/kylin.properties
+++ b/docker/conf/kylin/kylin.properties
@@ -332,7 +332,7 @@ kylin.storage.columnar.shard-countdistinct-rowcount=1000000
 kylin.storage.columnar.repartition-threshold-size-mb=128
 kylin.storage.columnar.shard-size-mb=128
 
-kylin.query.auto-sparder-context=true
+kylin.query.auto-sparder-context-enabled=true
 kylin.query.spark-conf.spark.master=yarn
 kylin.query.spark-conf.spark.driver.memory=512M
 kylin.query.spark-conf.spark.driver.memoryOverhead=512M
diff --git a/docker/dockerfile/standalone/conf/bin/kylin.sh 
b/docker/dockerfile/standalone/conf/bin/kylin.sh
index 9498f0b..a110c8c 100755
--- a/docker/dockerfile/standalone/conf/bin/kylin.sh
+++ b/docker/dockerfile/standalone/conf/bin/kylin.sh
@@ -212,7 +212,7 @@ function prepareFairScheduler() {
   <pool name="query_pushdown">
     <schedulingMode>FAIR</schedulingMode>
     <weight>1</weight>
-    <minShare>1</minShare>
+    <minShare>0</minShare>
   </pool>
   <pool name="heavy_tasks">
     <schedulingMode>FAIR</schedulingMode>
@@ -227,7 +227,7 @@ function prepareFairScheduler() {
   <pool name="vip_tasks">
     <schedulingMode>FAIR</schedulingMode>
     <weight>15</weight>
-    <minShare>1</minShare>
+    <minShare>0</minShare>
   </pool>
 </allocations>
 EOL
diff --git a/docker/dockerfile/standalone/conf/kylin/kylin.properties 
b/docker/dockerfile/standalone/conf/kylin/kylin.properties
index 280b846..b555a4a 100644
--- a/docker/dockerfile/standalone/conf/kylin/kylin.properties
+++ b/docker/dockerfile/standalone/conf/kylin/kylin.properties
@@ -336,7 +336,7 @@ kylin.storage.columnar.shard-countdistinct-rowcount=1000000
 kylin.storage.columnar.repartition-threshold-size-mb=128
 kylin.storage.columnar.shard-size-mb=128
 
-kylin.query.auto-sparder-context=true
+kylin.query.auto-sparder-context-enabled=true
 kylin.query.sparder-context.app-name=sparder_on_docker
 kylin.query.spark-conf.spark.master=yarn
 kylin.query.spark-conf.spark.driver.memory=512M
diff --git a/engine-flink/DEPRECATED_MODULE b/engine-flink/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/engine-flink/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git a/engine-mr/DEPRECATED_MODULE b/engine-mr/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/engine-mr/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git a/engine-spark/DEPRECATED_MODULE b/engine-spark/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/engine-spark/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git a/examples/sample_cube/template/cube_desc/kylin_sales_cube.json 
b/examples/sample_cube/template/cube_desc/kylin_sales_cube.json
index 4c970c5..e344444 100644
--- a/examples/sample_cube/template/cube_desc/kylin_sales_cube.json
+++ b/examples/sample_cube/template/cube_desc/kylin_sales_cube.json
@@ -306,7 +306,14 @@
   "storage_type" : %default_storage_type%,
   "override_kylin_properties" : {
     "kylin.cube.aggrgroup.is-mandatory-only-valid" : "true",
-    "kylin.engine.spark.rdd-partition-cut-mb" : "500"
+    "kylin.engine.build-base-cuboid-enabled": "false",
+    "kylin.query.spark.pool": "vip_tasks",
+    "kylin.storage.columnar.shard-countdistinct-rowcount" : "2500",
+    "kylin.query.spark-engine.spark-sql-shuffle-partitions" : "4",
+    "kylin.dictionary.globalV2-min-hash-partitions" : "3",
+    "kylin.dictionary.globalV2-threshold-bucket-size": "1000",
+    "kylin.engine.spark.cache-parent-dataset-count" : "5",
+    "kylin.engine.spark.cache-parent-dataset-storage-level" : 
"MEMORY_AND_DISK_SER"
   },
   "cuboid_black_list" : [ ],
   "parent_forward" : 3,
diff --git a/examples/test_case_data/file_prunning/kylin.properties 
b/examples/test_case_data/file_prunning/kylin.properties
index 679ef64..1d8f345 100644
--- a/examples/test_case_data/file_prunning/kylin.properties
+++ b/examples/test_case_data/file_prunning/kylin.properties
@@ -157,4 +157,4 @@ kylin.source.jdbc.user=
 kylin.source.jdbc.pass=
 
 
-kylin.query.auto-sparder-context=false
\ No newline at end of file
+kylin.query.auto-sparder-context-enabled=false
\ No newline at end of file
diff --git a/examples/test_case_data/localmeta/kylin.properties 
b/examples/test_case_data/localmeta/kylin.properties
index 4b015c4..cbcd3c2 100644
--- a/examples/test_case_data/localmeta/kylin.properties
+++ b/examples/test_case_data/localmeta/kylin.properties
@@ -159,7 +159,7 @@ kylin.source.jdbc.connection-url=jdbc:h2:mem:db
 kylin.source.jdbc.user=
 kylin.source.jdbc.pass=
 
-kylin.query.auto-sparder-context=false
+kylin.query.auto-sparder-context-enabled=false
 
 kylin.metrics.query-cache.expire-seconds=5
 kylin.metrics.query-cache.max-entries=2
diff --git a/examples/test_case_data/parquet_test/kylin.properties 
b/examples/test_case_data/parquet_test/kylin.properties
index 96ee3c5..b78591d 100644
--- a/examples/test_case_data/parquet_test/kylin.properties
+++ b/examples/test_case_data/parquet_test/kylin.properties
@@ -156,4 +156,4 @@ kylin.source.jdbc.connection-url=jdbc:h2:mem:db
 kylin.source.jdbc.user=
 kylin.source.jdbc.pass=
 
-kylin.query.auto-sparder-context=false
\ No newline at end of file
+kylin.query.auto-sparder-context-enabled=false
\ No newline at end of file
diff --git a/examples/test_case_data/sandbox/kylin.properties 
b/examples/test_case_data/sandbox/kylin.properties
index 8179b6f..ca2f7f4 100644
--- a/examples/test_case_data/sandbox/kylin.properties
+++ b/examples/test_case_data/sandbox/kylin.properties
@@ -230,4 +230,4 @@ kylin.engine.flink-conf.yarn.nodelabel=
 
 kylin.query.transformers=org.apache.kylin.query.util.DefaultQueryTransformer
 
-kylin.query.auto-sparder-context=false
\ No newline at end of file
+kylin.query.auto-sparder-context-enabled=false
\ No newline at end of file
diff --git a/kylin-it/DEPRECATED_MODULE b/kylin-it/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/kylin-it/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git 
a/kylin-spark-project/kylin-spark-engine/src/main/scala/org/apache/kylin/engine/spark/job/CubeBuildJob.java
 
b/kylin-spark-project/kylin-spark-engine/src/main/scala/org/apache/kylin/engine/spark/job/CubeBuildJob.java
index 5b6500f..1262ad5 100644
--- 
a/kylin-spark-project/kylin-spark-engine/src/main/scala/org/apache/kylin/engine/spark/job/CubeBuildJob.java
+++ 
b/kylin-spark-project/kylin-spark-engine/src/main/scala/org/apache/kylin/engine/spark/job/CubeBuildJob.java
@@ -467,8 +467,6 @@ public class CubeBuildJob extends SparkApplication {
         JobMetrics metrics = JobMetricsUtils.collectMetrics(queryExecutionId);
         long rowCount = metrics.getMetrics(Metrics.CUBOID_ROWS_CNT());
         if (rowCount == -1) {
-            infos.recordAbnormalLayouts(layoutId, "'Job metrics seems null, 
use count() to collect cuboid rows.'");
-            logger.debug("Can not get cuboid row cnt, use count() to collect 
cuboid rows.");
             long cuboidRowCnt = dataset.count();
             layout.setRows(cuboidRowCnt);
             // record the row count of cuboid
diff --git 
a/kylin-spark-project/kylin-spark-engine/src/main/scala/org/apache/kylin/engine/spark/utils/JobMetricsUtils.scala
 
b/kylin-spark-project/kylin-spark-engine/src/main/scala/org/apache/kylin/engine/spark/utils/JobMetricsUtils.scala
index 7b6e558..dfb0d19 100644
--- 
a/kylin-spark-project/kylin-spark-engine/src/main/scala/org/apache/kylin/engine/spark/utils/JobMetricsUtils.scala
+++ 
b/kylin-spark-project/kylin-spark-engine/src/main/scala/org/apache/kylin/engine/spark/utils/JobMetricsUtils.scala
@@ -40,9 +40,13 @@ object JobMetricsUtils extends Logging {
     if (execution != null) {
       metrics = collectOutputRows(execution.executedPlan)
       logInfo(s"Collect output rows successfully. $metrics")
-    } else {
-      logInfo(s"Collect output rows failed.")
     }
+
+    // comment below source, because it always collect failed when using 
apache spark.
+
+    // else {
+    // logDebug(s"Collect output rows failed.")
+    //}
     metrics
   }
 
@@ -86,7 +90,21 @@ object JobMetricsUtils extends Logging {
     rowMetrics
   }
 
-  // to get actual QueryExecution when write parquet, more info in issue #8212
+  /**
+   * When using a custom spark which sent event which contain QueryExecution 
belongs to a specific N_EXECUTION_ID_KEY,
+   * kylin can cache QueryExecution object into QueryExecutionCache and 
collect metrics such as bytes/row count for a cuboid
+   *
+     override def onOtherEvent(event: SparkListenerEvent): Unit = event match {
+        case e: PostQueryExecutionForKylin =>
+          val nExecutionId = 
e.localProperties.getProperty(QueryExecutionCache.N_EXECUTION_ID_KEY, "")
+          if (nExecutionId != "" && e.queryExecution != null) {
+            QueryExecutionCache.setQueryExecution(nExecutionId, 
e.queryExecution)
+          } else {
+            logWarning("executionIdStr is null, can't get QueryExecution from 
SQLExecution.")
+          }
+        case _ => // Ignore
+      }
+   */
   def registerListener(ss: SparkSession): Unit = {
     sparkListener = new SparkListener {
 
diff --git 
a/kylin-spark-project/kylin-spark-query/src/main/scala/org/apache/spark/sql/SparderContext.scala
 
b/kylin-spark-project/kylin-spark-query/src/main/scala/org/apache/spark/sql/SparderContext.scala
index c6916d2..5ae1961 100644
--- 
a/kylin-spark-project/kylin-spark-query/src/main/scala/org/apache/spark/sql/SparderContext.scala
+++ 
b/kylin-spark-project/kylin-spark-query/src/main/scala/org/apache/spark/sql/SparderContext.scala
@@ -205,7 +205,7 @@ object SparderContext extends Logging {
         initializingThread.join()
       }
 
-      if (System.getProperty("spark.local") ne "true") {
+      if (System.getProperty("spark.local") != "true" && 
KylinConfig.getInstanceFromEnv.isSparderCanaryEnabled) {
         //monitor sparder
         SparderContextCanary.init()
       }
diff --git a/source-jdbc/DEPRECATED_MODULE b/source-jdbc/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/source-jdbc/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git a/source-kafka/DEPRECATED_MODULE b/source-kafka/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/source-kafka/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git a/storage-hbase/DEPRECATED_MODULE b/storage-hbase/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/storage-hbase/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git a/storage-stream/DEPRECATED_MODULE b/storage-stream/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/storage-stream/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git a/stream-coordinator/DEPRECATED_MODULE 
b/stream-coordinator/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/stream-coordinator/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git a/stream-core/DEPRECATED_MODULE b/stream-core/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/stream-core/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git a/stream-receiver/DEPRECATED_MODULE 
b/stream-receiver/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/stream-receiver/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file
diff --git a/stream-source-kafka/DEPRECATED_MODULE 
b/stream-source-kafka/DEPRECATED_MODULE
new file mode 100644
index 0000000..b593cf2
--- /dev/null
+++ b/stream-source-kafka/DEPRECATED_MODULE
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+This maven module is deprecated and maybe be removed in the future.
\ No newline at end of file

Reply via email to