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

reidchan pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-3 by this push:
     new d5510bd7d34 HBASE-29238 ExportSnapshot support specify storage policy 
(#6874)
d5510bd7d34 is described below

commit d5510bd7d34a26bc7b46d2b42ef0e313c0fe880c
Author: Reid Chan <[email protected]>
AuthorDate: Mon Apr 14 11:06:35 2025 +0800

    HBASE-29238 ExportSnapshot support specify storage policy (#6874)
    
    Signed-off-by: Duo Zhang <[email protected]>
    Signed-off-by: Wei-Chiu Chuang <[email protected]>
    (cherry-picked from commit f6fdbbcb4c291f4cceda75872f65f73414e440ef)
---
 .../hadoop/hbase/snapshot/ExportSnapshot.java      | 46 ++++++++++++++++++++--
 1 file changed, 42 insertions(+), 4 deletions(-)

diff --git 
a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/snapshot/ExportSnapshot.java
 
b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/snapshot/ExportSnapshot.java
index 42d10ca8d46..5e87075d70a 100644
--- 
a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/snapshot/ExportSnapshot.java
+++ 
b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/snapshot/ExportSnapshot.java
@@ -26,9 +26,11 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -122,6 +124,7 @@ public class ExportSnapshot extends AbstractHBaseTool 
implements Tool {
     "snapshot.export.copy.references.threads";
   private static final int DEFAULT_COPY_MANIFEST_THREADS =
     Runtime.getRuntime().availableProcessors();
+  private static final String CONF_STORAGE_POLICY = 
"snapshot.export.storage.policy.family";
 
   static class Testing {
     static final String CONF_TEST_FAILURE = "test.snapshot.export.failure";
@@ -159,6 +162,8 @@ public class ExportSnapshot extends AbstractHBaseTool 
implements Tool {
       new Option(null, "bandwidth", true, "Limit bandwidth to this value in 
MB/second.");
     static final Option RESET_TTL =
       new Option(null, "reset-ttl", false, "Do not copy TTL for the snapshot");
+    static final Option STORAGE_POLICY = new Option(null, "storage-policy", 
true,
+      "Storage policy for export snapshot output directory, with format like: 
f=HOT&g=ALL_SDD");
   }
 
   // Export Map-Reduce Counters, to keep track of the progress
@@ -328,6 +333,13 @@ public class ExportSnapshot extends AbstractHBaseTool 
implements Tool {
 
         // Ensure that the output folder is there and copy the file
         createOutputPath(outputPath.getParent());
+        String family = new Path(inputInfo.getHfile()).getParent().getName();
+        String familyStoragePolicy = generateFamilyStoragePolicyKey(family);
+        if 
(stringIsNotEmpty(context.getConfiguration().get(familyStoragePolicy))) {
+          String key = context.getConfiguration().get(familyStoragePolicy);
+          LOG.info("Setting storage policy {} for {}", key, 
outputPath.getParent());
+          outputFs.setStoragePolicy(outputPath.getParent(), key);
+        }
         FSDataOutputStream out = outputFs.create(outputPath, true);
 
         long stime = EnvironmentEdgeManager.currentTime();
@@ -426,7 +438,7 @@ public class ExportSnapshot extends AbstractHBaseTool 
implements Tool {
     }
 
     private boolean stringIsNotEmpty(final String str) {
-      return str != null && str.length() > 0;
+      return str != null && !str.isEmpty();
     }
 
     private long copyData(final Context context, final Path inputPath, final 
InputStream in,
@@ -907,8 +919,8 @@ public class ExportSnapshot extends AbstractHBaseTool 
implements Tool {
    */
   private void runCopyJob(final Path inputRoot, final Path outputRoot, final 
String snapshotName,
     final Path snapshotDir, final boolean verifyChecksum, final String 
filesUser,
-    final String filesGroup, final int filesMode, final int mappers, final int 
bandwidthMB)
-    throws IOException, InterruptedException, ClassNotFoundException {
+    final String filesGroup, final int filesMode, final int mappers, final int 
bandwidthMB,
+    final String storagePolicy) throws IOException, InterruptedException, 
ClassNotFoundException {
     Configuration conf = getConf();
     if (filesGroup != null) conf.set(CONF_FILES_GROUP, filesGroup);
     if (filesUser != null) conf.set(CONF_FILES_USER, filesUser);
@@ -923,6 +935,11 @@ public class ExportSnapshot extends AbstractHBaseTool 
implements Tool {
     conf.setInt(CONF_BANDWIDTH_MB, bandwidthMB);
     conf.set(CONF_SNAPSHOT_NAME, snapshotName);
     conf.set(CONF_SNAPSHOT_DIR, snapshotDir.toString());
+    if (storagePolicy != null) {
+      for (Map.Entry<String, String> entry : 
storagePolicyPerFamily(storagePolicy).entrySet()) {
+        conf.set(generateFamilyStoragePolicyKey(entry.getKey()), 
entry.getValue());
+      }
+    }
 
     String jobname = conf.get(CONF_MR_JOB_NAME, "ExportSnapshot-" + 
snapshotName);
     Job job = new Job(conf);
@@ -1009,6 +1026,23 @@ public class ExportSnapshot extends AbstractHBaseTool 
implements Tool {
     }, conf);
   }
 
+  private Map<String, String> storagePolicyPerFamily(String storagePolicy) {
+    Map<String, String> familyStoragePolicy = new HashMap<>();
+    for (String familyConf : storagePolicy.split("&")) {
+      String[] familySplit = familyConf.split("=");
+      if (familySplit.length != 2) {
+        continue;
+      }
+      // family is key, storage policy is value
+      familyStoragePolicy.put(familySplit[0], familySplit[1]);
+    }
+    return familyStoragePolicy;
+  }
+
+  private static String generateFamilyStoragePolicyKey(String family) {
+    return CONF_STORAGE_POLICY + "." + family;
+  }
+
   private boolean verifyTarget = true;
   private boolean verifySource = true;
   private boolean verifyChecksum = true;
@@ -1023,6 +1057,7 @@ public class ExportSnapshot extends AbstractHBaseTool 
implements Tool {
   private int filesMode = 0;
   private int mappers = 0;
   private boolean resetTtl = false;
+  private String storagePolicy = null;
 
   @Override
   protected void processOptions(CommandLine cmd) {
@@ -1045,6 +1080,9 @@ public class ExportSnapshot extends AbstractHBaseTool 
implements Tool {
     verifyTarget = !cmd.hasOption(Options.NO_TARGET_VERIFY.getLongOpt());
     verifySource = !cmd.hasOption(Options.NO_SOURCE_VERIFY.getLongOpt());
     resetTtl = cmd.hasOption(Options.RESET_TTL.getLongOpt());
+    if (cmd.hasOption(Options.STORAGE_POLICY.getLongOpt())) {
+      storagePolicy = cmd.getOptionValue(Options.STORAGE_POLICY.getLongOpt());
+    }
   }
 
   /**
@@ -1213,7 +1251,7 @@ public class ExportSnapshot extends AbstractHBaseTool 
implements Tool {
     // by the HFileArchiver, since they have no references.
     try {
       runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, 
verifyChecksum, filesUser,
-        filesGroup, filesMode, mappers, bandwidthMB);
+        filesGroup, filesMode, mappers, bandwidthMB, storagePolicy);
 
       LOG.info("Finalize the Snapshot Export");
       if (!skipTmp) {

Reply via email to