From a79268298c233fce7244c1e79d672dddc88d757f Mon Sep 17 00:00:00 2001 From: xianjing feng <583872483@qq.com> Date: Tue, 12 Oct 2021 23:43:37 +0800 Subject: [PATCH 1/2] [HBASE-26351] Implement a table-based region grouping strategy for RegionGroupingProvider --- .../hbase/wal/BoundedGroupingStrategy.java | 9 ++-- .../hbase/wal/NamespaceGroupingStrategy.java | 15 ++---- .../hbase/wal/RegionGroupingProvider.java | 27 +++++------ .../hbase/wal/TableGroupingStrategy.java | 47 +++++++++++++++++++ 4 files changed, 66 insertions(+), 32 deletions(-) create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/wal/TableGroupingStrategy.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/BoundedGroupingStrategy.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/BoundedGroupingStrategy.java index bafcee339e7d..7a9831ff6331 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/BoundedGroupingStrategy.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/BoundedGroupingStrategy.java @@ -24,9 +24,9 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.hadoop.conf.Configuration; -import org.apache.yetus.audience.InterfaceAudience; -import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.wal.RegionGroupingProvider.RegionGroupingStrategy; +import org.apache.yetus.audience.InterfaceAudience; /** * A WAL grouping strategy that limits the number of wal groups to @@ -43,9 +43,8 @@ public class BoundedGroupingStrategy implements RegionGroupingStrategy{ private String[] groupNames; @Override - public String group(byte[] identifier, byte[] namespace) { - String idStr = Bytes.toString(identifier); - return computeIfAbsent(groupNameCache, idStr, + public String group(RegionInfo region) { + return computeIfAbsent(groupNameCache, region.getEncodedName(), () -> groupNames[getAndIncrAtomicInteger(counter, groupNames.length)]); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/NamespaceGroupingStrategy.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/NamespaceGroupingStrategy.java index 3022a25fdb11..70d465daeea8 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/NamespaceGroupingStrategy.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/NamespaceGroupingStrategy.java @@ -19,10 +19,9 @@ package org.apache.hadoop.hbase.wal; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.hbase.NamespaceDescriptor; -import org.apache.yetus.audience.InterfaceAudience; -import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.wal.RegionGroupingProvider.RegionGroupingStrategy; +import org.apache.yetus.audience.InterfaceAudience; /** * A WAL grouping strategy based on namespace. @@ -34,14 +33,8 @@ public class NamespaceGroupingStrategy implements RegionGroupingStrategy { String providerId; @Override - public String group(byte[] identifier, byte[] namespace) { - String namespaceString; - if (namespace == null || namespace.length == 0) { - namespaceString = NamespaceDescriptor.DEFAULT_NAMESPACE_NAME_STR; - } else { - namespaceString = Bytes.toString(namespace); - } - return providerId + GROUP_NAME_DELIMITER + namespaceString; + public String group(RegionInfo region) { + return providerId + GROUP_NAME_DELIMITER + region.getTable().getNamespaceAsString(); } @Override diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/RegionGroupingProvider.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/RegionGroupingProvider.java index 20d043b6ae26..95d59a979291 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/RegionGroupingProvider.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/RegionGroupingProvider.java @@ -31,12 +31,10 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Abortable; -import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.regionserver.wal.MetricsWAL; // imports for classes still in regionserver.wal import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener; -import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.KeyLocker; import org.apache.yetus.audience.InterfaceAudience; import org.slf4j.Logger; @@ -55,6 +53,8 @@ * "bounded". *
  • identity : each region belongs to its own group.
  • *
  • bounded : bounded number of groups and region evenly assigned to each group.
  • + *
  • namespace : region of the same namespace assigned to the same group.
  • + *
  • table : region of the same table assigned to the same group.
  • * * Optionally, a FQCN to a custom implementation may be given. */ @@ -69,9 +69,9 @@ public static interface RegionGroupingStrategy { String GROUP_NAME_DELIMITER = "."; /** - * Given an identifier and a namespace, pick a group. + * Given an region, pick a group. */ - String group(final byte[] identifier, byte[] namespace); + String group(RegionInfo region); void init(Configuration config, String providerId); } @@ -82,7 +82,8 @@ static enum Strategies { defaultStrategy(BoundedGroupingStrategy.class), identity(IdentityGroupingStrategy.class), bounded(BoundedGroupingStrategy.class), - namespace(NamespaceGroupingStrategy.class); + namespace(NamespaceGroupingStrategy.class), + table(TableGroupingStrategy.class); final Class clazz; Strategies(Class clazz) { @@ -210,16 +211,10 @@ public WAL getWAL(RegionInfo region) throws IOException { if (META_WAL_PROVIDER_ID.equals(this.providerId)) { group = META_WAL_GROUP_NAME; } else { - byte[] id; - byte[] namespace; - if (region != null) { - id = region.getEncodedNameAsBytes(); - namespace = region.getTable().getNamespace(); - } else { - id = HConstants.EMPTY_BYTE_ARRAY; - namespace = null; + if (region == null) { + return getWAL(""); } - group = strategy.group(id, namespace); + group = strategy.group(region); } return getWAL(group); } @@ -268,8 +263,8 @@ static class IdentityGroupingStrategy implements RegionGroupingStrategy { @Override public void init(Configuration config, String providerId) {} @Override - public String group(final byte[] identifier, final byte[] namespace) { - return Bytes.toString(identifier); + public String group(RegionInfo region) { + return region.getEncodedName(); } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/TableGroupingStrategy.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/TableGroupingStrategy.java new file mode 100644 index 000000000000..ad6dcd625b61 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/TableGroupingStrategy.java @@ -0,0 +1,47 @@ +/** + * + * 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. + */ +package org.apache.hadoop.hbase.wal; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.RegionInfo; +import org.apache.hadoop.hbase.wal.RegionGroupingProvider.RegionGroupingStrategy; +import org.apache.yetus.audience.InterfaceAudience; + +/** + * A WAL grouping strategy based on table. + */ +@InterfaceAudience.Private +public class TableGroupingStrategy implements RegionGroupingStrategy { + String providerId; + + @Override + public String group(RegionInfo region) { + TableName tableName = region.getTable(); + return new StringBuilder(providerId).append(GROUP_NAME_DELIMITER) + .append(tableName.getNamespaceAsString()).append(GROUP_NAME_DELIMITER) + .append(tableName.getNameAsString()).toString(); + } + + @Override + public void init(Configuration config, String providerId) { + this.providerId = providerId; + } + +} From 1bcd1ae778b3b2e54540d6ce3992bdeafd425cce Mon Sep 17 00:00:00 2001 From: xianjing feng <583872483@qq.com> Date: Fri, 14 Jan 2022 17:38:59 +0800 Subject: [PATCH 2/2] improve group name --- .../java/org/apache/hadoop/hbase/wal/TableGroupingStrategy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/TableGroupingStrategy.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/TableGroupingStrategy.java index ad6dcd625b61..0e9c27bc3326 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/TableGroupingStrategy.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/TableGroupingStrategy.java @@ -36,7 +36,7 @@ public String group(RegionInfo region) { TableName tableName = region.getTable(); return new StringBuilder(providerId).append(GROUP_NAME_DELIMITER) .append(tableName.getNamespaceAsString()).append(GROUP_NAME_DELIMITER) - .append(tableName.getNameAsString()).toString(); + .append(tableName.getQualifierAsString()).toString(); } @Override