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/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push: new 913b2ca [Dynamic Partition]Support set replication number (#3965) 913b2ca is described below commit 913b2caac47ce75724c0fe97814567b7c71437a7 Author: WingC <1018957...@qq.com> AuthorDate: Sun Jul 5 03:28:38 2020 -0500 [Dynamic Partition]Support set replication number (#3965) This CL mainly support set replication_num property in dynamic partition table if dynamic_partition.replication_num is not set, the value is the same as table's default replication_num. --- docs/en/administrator-guide/dynamic-partition.md | 6 +++- .../zh-CN/administrator-guide/dynamic-partition.md | 6 +++- .../doris/analysis/ShowDynamicPartitionStmt.java | 1 + .../doris/catalog/DynamicPartitionProperty.java | 9 +++++ .../doris/clone/DynamicPartitionScheduler.java | 6 +++- .../java/org/apache/doris/common/ErrorCode.java | 6 +++- .../doris/common/util/DynamicPartitionUtil.java | 34 +++++++++++-------- .../java/org/apache/doris/qe/ShowExecutor.java | 3 ++ .../doris/catalog/DynamicPartitionTableTest.java | 39 ++++++++++++++++++++++ 9 files changed, 93 insertions(+), 17 deletions(-) diff --git a/docs/en/administrator-guide/dynamic-partition.md b/docs/en/administrator-guide/dynamic-partition.md index f4c6a54..0fce2ac 100644 --- a/docs/en/administrator-guide/dynamic-partition.md +++ b/docs/en/administrator-guide/dynamic-partition.md @@ -108,7 +108,11 @@ The rules of dynamic partition are prefixed with `dynamic_partition.`: * `dynamic_partition.buckets` The number of buckets corresponding to the dynamically created partitions. - + +* `dynamic_partition.replication_num` + + The replication number of dynamic partition.If not filled in, defaults to the number of table's replication number. + * `dynamic_partition.start_day_of_week` When `time_unit` is` WEEK`, this parameter is used to specify the starting point of the week. The value ranges from 1 to 7. Where 1 is Monday and 7 is Sunday. The default is 1, which means that every week starts on Monday. diff --git a/docs/zh-CN/administrator-guide/dynamic-partition.md b/docs/zh-CN/administrator-guide/dynamic-partition.md index 709c154..0e56a6c 100644 --- a/docs/zh-CN/administrator-guide/dynamic-partition.md +++ b/docs/zh-CN/administrator-guide/dynamic-partition.md @@ -106,7 +106,11 @@ under the License. * `dynamic_partition.buckets` 动态创建的分区所对应的分桶数量。 - + +* `dynamic_partition.replication_num` + + 动态创建的分区所对应的副本数量,如果不填写,则默认为该表创建时指定的副本数量。 + * `dynamic_partition.start_day_of_week` 当 `time_unit` 为 `WEEK` 时,该参数用于指定每周的起始点。取值为 1 到 7。其中 1 表示周一,7 表示周日。默认为 1,即表示每周以周一为起始点。 diff --git a/fe/src/main/java/org/apache/doris/analysis/ShowDynamicPartitionStmt.java b/fe/src/main/java/org/apache/doris/analysis/ShowDynamicPartitionStmt.java index 4e98bef..529da1d 100644 --- a/fe/src/main/java/org/apache/doris/analysis/ShowDynamicPartitionStmt.java +++ b/fe/src/main/java/org/apache/doris/analysis/ShowDynamicPartitionStmt.java @@ -38,6 +38,7 @@ public class ShowDynamicPartitionStmt extends ShowStmt { .addColumn(new Column("End", ScalarType.createVarchar(20))) .addColumn(new Column("Prefix", ScalarType.createVarchar(20))) .addColumn(new Column("Buckets", ScalarType.createVarchar(20))) + .addColumn(new Column("ReplicationNum", ScalarType.createVarchar(20))) .addColumn(new Column("StartOf", ScalarType.createVarchar(20))) .addColumn(new Column("LastUpdateTime", ScalarType.createVarchar(20))) .addColumn(new Column("LastSchedulerTime", ScalarType.createVarchar(20))) diff --git a/fe/src/main/java/org/apache/doris/catalog/DynamicPartitionProperty.java b/fe/src/main/java/org/apache/doris/catalog/DynamicPartitionProperty.java index 63ce513..8783acc 100644 --- a/fe/src/main/java/org/apache/doris/catalog/DynamicPartitionProperty.java +++ b/fe/src/main/java/org/apache/doris/catalog/DynamicPartitionProperty.java @@ -35,8 +35,10 @@ public class DynamicPartitionProperty { public static final String START_DAY_OF_WEEK = "dynamic_partition.start_day_of_week"; public static final String START_DAY_OF_MONTH = "dynamic_partition.start_day_of_month"; public static final String TIME_ZONE = "dynamic_partition.time_zone"; + public static final String REPLICATION_NUM = "dynamic_partition.replication_num"; public static final int MIN_START_OFFSET = Integer.MIN_VALUE; + public static final int NOT_SET_REPLICATION_NUM = -1; private boolean exist; @@ -49,6 +51,7 @@ public class DynamicPartitionProperty { private StartOfDate startOfWeek; private StartOfDate startOfMonth; private TimeZone tz = TimeUtils.getSystemTimeZone(); + private int replicationNum; public DynamicPartitionProperty(Map<String, String> properties) { if (properties != null && !properties.isEmpty()) { @@ -61,6 +64,7 @@ public class DynamicPartitionProperty { this.end = Integer.parseInt(properties.get(END)); this.prefix = properties.get(PREFIX); this.buckets = Integer.parseInt(properties.get(BUCKETS)); + this.replicationNum = Integer.parseInt(properties.getOrDefault(REPLICATION_NUM, String.valueOf(NOT_SET_REPLICATION_NUM))); createStartOfs(properties); } else { this.exist = false; @@ -133,6 +137,10 @@ public class DynamicPartitionProperty { return tz; } + public int getReplicationNum() { + return replicationNum; + } + @Override public String toString() { String res = ",\n\"" + ENABLE + "\" = \"" + enable + "\"" + @@ -141,6 +149,7 @@ public class DynamicPartitionProperty { ",\n\"" + START + "\" = \"" + start + "\"" + ",\n\"" + END + "\" = \"" + end + "\"" + ",\n\"" + PREFIX + "\" = \"" + prefix + "\"" + + ",\n\"" + REPLICATION_NUM + "\" = \"" + replicationNum + "\"" + ",\n\"" + BUCKETS + "\" = \"" + buckets + "\""; if (getTimeUnit().equalsIgnoreCase(TimeUnit.WEEK.toString())) { res += ",\n\"" + START_DAY_OF_WEEK + "\" = \"" + startOfWeek.dayOfWeek + "\""; diff --git a/fe/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java b/fe/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java index 17d3b91..da3d844 100644 --- a/fe/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java +++ b/fe/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java @@ -172,7 +172,11 @@ public class DynamicPartitionScheduler extends MasterDaemon { // construct partition desc PartitionKeyDesc partitionKeyDesc = new PartitionKeyDesc(Collections.singletonList(lowerValue), Collections.singletonList(upperValue)); HashMap<String, String> partitionProperties = new HashMap<>(1); - partitionProperties.put("replication_num", String.valueOf(DynamicPartitionUtil.estimateReplicateNum(olapTable))); + if (dynamicPartitionProperty.getReplicationNum() == DynamicPartitionProperty.NOT_SET_REPLICATION_NUM) { + partitionProperties.put("replication_num", String.valueOf(olapTable.getDefaultReplicationNum())); + } else { + partitionProperties.put("replication_num", String.valueOf(dynamicPartitionProperty.getReplicationNum())); + } String partitionName = dynamicPartitionProperty.getPrefix() + DynamicPartitionUtil.getFormattedPartitionName( dynamicPartitionProperty.getTimeZone(), prevBorder, dynamicPartitionProperty.getTimeUnit()); SingleRangePartitionDesc rangePartitionDesc = new SingleRangePartitionDesc(true, partitionName, diff --git a/fe/src/main/java/org/apache/doris/common/ErrorCode.java b/fe/src/main/java/org/apache/doris/common/ErrorCode.java index 7b416a3..186899c 100644 --- a/fe/src/main/java/org/apache/doris/common/ErrorCode.java +++ b/fe/src/main/java/org/apache/doris/common/ErrorCode.java @@ -232,7 +232,11 @@ public enum ErrorCode { ERROR_DYNAMIC_PARTITION_PREFIX(5069, new byte[] {'4', '2', '0', '0', '0'}, "Invalid dynamic partition prefix: %s."), ERR_OPERATION_DISABLED(5070, new byte[] {'4', '2', '0', '0', '0'}, - "Operation %s is disabled. %s"); + "Operation %s is disabled. %s"), + ERROR_DYNAMIC_PARTITION_REPLICATION_NUM_ZERO(5071, new byte[] {'4', '2', '0', '0', '0'}, + "Dynamic partition replication num must greater than 0"), + ERROR_DYNAMIC_PARTITION_REPLICATION_NUM_FORMAT(5072, new byte[] {'4', '2', '0', '0', '0'}, + "Invalid dynamic partition replication num: %s."); ErrorCode(int code, byte[] sqlState, String errorMsg) { this.code = code; diff --git a/fe/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java b/fe/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java index c9bdd83..8be5b2e 100644 --- a/fe/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java +++ b/fe/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java @@ -23,7 +23,6 @@ import org.apache.doris.catalog.Catalog; import org.apache.doris.catalog.Column; import org.apache.doris.catalog.DynamicPartitionProperty; import org.apache.doris.catalog.OlapTable; -import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.PartitionInfo; import org.apache.doris.catalog.PartitionType; import org.apache.doris.catalog.PrimitiveType; @@ -151,6 +150,19 @@ public class DynamicPartitionUtil { } } + private static void checkReplicationNum(String val) throws DdlException { + if (Strings.isNullOrEmpty(val)) { + throw new DdlException("Invalid properties: " + DynamicPartitionProperty.REPLICATION_NUM); + } + try { + if (Integer.parseInt(val) <= 0) { + ErrorReport.reportDdlException(ErrorCode.ERROR_DYNAMIC_PARTITION_REPLICATION_NUM_ZERO); + } + } catch (NumberFormatException e) { + ErrorReport.reportDdlException(ErrorCode.ERROR_DYNAMIC_PARTITION_REPLICATION_NUM_FORMAT, val); + } + } + public static boolean checkDynamicPartitionPropertiesExist(Map<String, String> properties) { if (properties == null) { return false; @@ -161,6 +173,7 @@ public class DynamicPartitionUtil { properties.containsKey(DynamicPartitionProperty.END) || properties.containsKey(DynamicPartitionProperty.PREFIX) || properties.containsKey(DynamicPartitionProperty.BUCKETS) || + properties.containsKey(DynamicPartitionProperty.REPLICATION_NUM) || properties.containsKey(DynamicPartitionProperty.ENABLE) || properties.containsKey(DynamicPartitionProperty.START_DAY_OF_WEEK) || properties.containsKey(DynamicPartitionProperty.START_DAY_OF_MONTH); @@ -179,6 +192,7 @@ public class DynamicPartitionUtil { String timeZone = properties.get(DynamicPartitionProperty.TIME_ZONE); String end = properties.get(DynamicPartitionProperty.END); String buckets = properties.get(DynamicPartitionProperty.BUCKETS); + String replicationNum = properties.get(DynamicPartitionProperty.REPLICATION_NUM); String enable = properties.get(DynamicPartitionProperty.ENABLE); if (!((Strings.isNullOrEmpty(enable) && Strings.isNullOrEmpty(timeUnit) && @@ -284,6 +298,12 @@ public class DynamicPartitionUtil { properties.remove(DynamicPartitionProperty.TIME_ZONE); analyzedProperties.put(DynamicPartitionProperty.TIME_ZONE, val); } + if (properties.containsKey(DynamicPartitionProperty.REPLICATION_NUM)) { + String val = properties.get(DynamicPartitionProperty.REPLICATION_NUM); + checkReplicationNum(val); + properties.remove(DynamicPartitionProperty.REPLICATION_NUM); + analyzedProperties.put(DynamicPartitionProperty.REPLICATION_NUM, val); + } return analyzedProperties; } @@ -440,18 +460,6 @@ public class DynamicPartitionUtil { return DateTimeFormatter.ofPattern(format).format(timeWithoutHourMinuteSecond); } - public static int estimateReplicateNum(OlapTable table) { - int replicateNum = table.getDefaultReplicationNum(); - long maxPartitionId = 0; - for (Partition partition: table.getPartitions()) { - if (partition.getId() > maxPartitionId) { - maxPartitionId = partition.getId(); - replicateNum = table.getPartitionInfo().getReplicationNum(partition.getId()); - } - } - return replicateNum; - } - /** * Used to indicate the start date. * Taking the year as the granularity, it can indicate the month and day as the start date. diff --git a/fe/src/main/java/org/apache/doris/qe/ShowExecutor.java b/fe/src/main/java/org/apache/doris/qe/ShowExecutor.java index f7bf43b..30870fd 100644 --- a/fe/src/main/java/org/apache/doris/qe/ShowExecutor.java +++ b/fe/src/main/java/org/apache/doris/qe/ShowExecutor.java @@ -1502,6 +1502,8 @@ public class ShowExecutor { } DynamicPartitionProperty dynamicPartitionProperty = olapTable.getTableProperty().getDynamicPartitionProperty(); String tableName = olapTable.getName(); + int replicationNum = dynamicPartitionProperty.getReplicationNum(); + replicationNum = (replicationNum == DynamicPartitionProperty.NOT_SET_REPLICATION_NUM) ? olapTable.getDefaultReplicationNum() : FeConstants.default_replication_num; rows.add(Lists.newArrayList( tableName, String.valueOf(dynamicPartitionProperty.getEnable()), @@ -1510,6 +1512,7 @@ public class ShowExecutor { String.valueOf(dynamicPartitionProperty.getEnd()), dynamicPartitionProperty.getPrefix(), String.valueOf(dynamicPartitionProperty.getBuckets()), + String.valueOf(replicationNum), dynamicPartitionProperty.getStartOfInfo(), dynamicPartitionScheduler.getRuntimeInfo(tableName, DynamicPartitionScheduler.LAST_UPDATE_TIME), dynamicPartitionScheduler.getRuntimeInfo(tableName, DynamicPartitionScheduler.LAST_SCHEDULER_TIME), diff --git a/fe/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java b/fe/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java index ecc82c3..8084ae4 100644 --- a/fe/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java +++ b/fe/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java @@ -25,6 +25,7 @@ import org.apache.doris.qe.ConnectContext; import org.apache.doris.utframe.UtFrameUtils; import org.junit.AfterClass; +import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; @@ -93,6 +94,9 @@ public class DynamicPartitionTableTest { "\"dynamic_partition.buckets\" = \"1\"\n" + ");"; createTable(createOlapTblStmt); + Database db = Catalog.getCurrentCatalog().getDb("default_cluster:test"); + OlapTable table = (OlapTable) db.getTable("dynamic_partition_normal"); + Assert.assertEquals(table.getTableProperty().getDynamicPartitionProperty().getReplicationNum(), DynamicPartitionProperty.NOT_SET_REPLICATION_NUM); } @Test @@ -399,4 +403,39 @@ public class DynamicPartitionTableTest { expectedException.expectMessage("errCode = 2, detailMessage = Unknown or incorrect time zone: 'invalid'"); createTable(createOlapTblStmt); } + + @Test + public void testSetDynamicPartitionReplicationNum() throws Exception { + String tableName = "dynamic_partition_replication_num"; + String createOlapTblStmt = "CREATE TABLE test.`" + tableName + "` (\n" + + " `k1` date NULL COMMENT \"\",\n" + + " `k2` int NULL COMMENT \"\",\n" + + " `k3` smallint NULL COMMENT \"\",\n" + + " `v1` varchar(2048) NULL COMMENT \"\",\n" + + " `v2` datetime NULL COMMENT \"\"\n" + + ") ENGINE=OLAP\n" + + "DUPLICATE KEY(`k1`, `k2`, `k3`)\n" + + "COMMENT \"OLAP\"\n" + + "PARTITION BY RANGE (k1)\n" + + "(\n" + + "PARTITION p1 VALUES LESS THAN (\"2014-01-01\"),\n" + + "PARTITION p2 VALUES LESS THAN (\"2014-06-01\"),\n" + + "PARTITION p3 VALUES LESS THAN (\"2014-12-01\")\n" + + ")\n" + + "DISTRIBUTED BY HASH(`k1`) BUCKETS 32\n" + + "PROPERTIES (\n" + + "\"replication_num\" = \"1\",\n" + + "\"dynamic_partition.enable\" = \"true\",\n" + + "\"dynamic_partition.start\" = \"-3\",\n" + + "\"dynamic_partition.end\" = \"3\",\n" + + "\"dynamic_partition.time_unit\" = \"day\",\n" + + "\"dynamic_partition.prefix\" = \"p\",\n" + + "\"dynamic_partition.buckets\" = \"1\",\n" + + "\"dynamic_partition.replication_num\" = \"2\"\n" + + ");"; + createTable(createOlapTblStmt); + Database db = Catalog.getCurrentCatalog().getDb("default_cluster:test"); + OlapTable table = (OlapTable) db.getTable(tableName); + Assert.assertEquals(table.getTableProperty().getDynamicPartitionProperty().getReplicationNum(), 2); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org