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 extends RegionGroupingStrategy> clazz;
Strategies(Class extends RegionGroupingStrategy> 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