You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@kylin.apache.org by GitBox <gi...@apache.org> on 2021/04/09 14:46:49 UTC

[GitHub] [kylin] zhengshengjun commented on a change in pull request #1611: KYLIN-4923 CubeMigration Tools support migrate meta from 2.x/3.x cluster to 4.0 cluster

zhengshengjun commented on a change in pull request #1611:
URL: https://github.com/apache/kylin/pull/1611#discussion_r610686888



##########
File path: tool/src/main/java/org/apache/kylin/tool/CubeMigrationCLI.java
##########
@@ -86,82 +98,113 @@
     protected String dstProject;
     protected String srcHdfsWorkDir;
     protected String dstHdfsWorkDir;
+    private boolean migrateSegment;
+    private boolean realExecute;
+    private boolean purgeAndDisable;
+    private OptionsHelper optHelper;
 
     private static final String ACL_PREFIX = "/acl/";
     private static final String GLOBAL_DICT_PREFIX = "/dict/global_dict/";
 
-    public static void main(String[] args) throws IOException, InterruptedException {
+    private static final Option OPTION_SRC_CONFIG = OptionBuilder.isRequired(true).hasArg().withDescription("The KylinConfig of the cube’s source").create("srcConfig");
+    private static final Option OPTION_DST_CONFIG = OptionBuilder.isRequired(true).hasArg().withDescription("The KylinConfig of the cube’s new home").create("dstConfig");
+    private static final Option OPTION_ALL_CUBES = OptionBuilder.isRequired(false).withDescription("migrate all cubes meta from source cluster").create("allCubes");
+    private static final Option OPTION_CUBE = OptionBuilder.isRequired(false).hasArg().withDescription("Cube name to migrate").create("cube");
+    private static final Option OPTION_DST_PROJECT = OptionBuilder.isRequired(false).hasArg().withDescription("cube's new project home, if not set, keep the same as source cluster").create("dstProject");
+    private static final Option OPTION_SRC_PROJECT = OptionBuilder.isRequired(false).hasArg().withDescription("source project to migrate").create("srcProject");
+    private static final Option OPTION_COPY_ACL = OptionBuilder.isRequired(false).hasArg().withDescription("copy ACL").create("copyAcl");
+    private static final Option OPTION_PURGE_AND_DISABLE = OptionBuilder.isRequired(false).withDescription("purge source cluster data").create("purgeAndDisable");
+    private static final Option OPTION_OVERWRITE = OptionBuilder.isRequired(false).withDescription("overwrite target cluster's meta if exists").create("overwriteIfExists");
+    private static final Option OPTION_EXECUTE = OptionBuilder.isRequired(false).withDescription("execute migration").create("execute");
+    private static final Option OPTION_MIGRATE_SEGMENTS = OptionBuilder.isRequired(false).withDescription("migrate segment data").create("migrateSegment");
+
+    public static void main(String[] args) throws Exception {
+        CubeMigrationCLI cli = new CubeMigrationCLI();
+        cli.init(args);
+        cli.moveCube();
+    }
 
+    public void init(String[] args) {
+        optHelper = new OptionsHelper();
         CubeMigrationCLI cli = new CubeMigrationCLI();
-        if (args.length != 8 && args.length != 9) {
-            cli.usage();
+        try {
+            optHelper.parseOptions(cli.getOptions(), args);
+        } catch (Exception e) {
+            logger.error("failed to parse arguments", e);
+            optHelper.printUsage("CubeMigrationCLI", cli.getOptions());
             System.exit(1);
         }
-        if (args.length == 8) {
-            cli.moveCube(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
-        } else if (args.length == 9) {
-            cli.moveCube(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);
-        }
+        doAclCopy = optHelper.hasOption(OPTION_COPY_ACL);
+        doOverwrite = optHelper.hasOption(OPTION_OVERWRITE);
+        doMigrateSegment = optHelper.hasOption(OPTION_MIGRATE_SEGMENTS);
+        purgeAndDisable = optHelper.hasOption(OPTION_PURGE_AND_DISABLE);
+        srcConfig = KylinConfig.createInstanceFromUri(optHelper.getOptionValue(OPTION_SRC_CONFIG));
+        srcStore = ResourceStore.getStore(srcConfig);
+        dstConfig = KylinConfig.createInstanceFromUri(optHelper.getOptionValue(OPTION_DST_CONFIG));
+        dstStore = ResourceStore.getStore(dstConfig);
+        migrateSegment = optHelper.hasOption(OPTION_MIGRATE_SEGMENTS);
+        realExecute = optHelper.hasOption(OPTION_EXECUTE);
+        dstProject = optHelper.getOptionValue(OPTION_DST_PROJECT);
+        conf = HadoopUtil.getCurrentConfiguration();
     }
 
-    protected void usage() {
-        System.out.println(
-                "Usage: CubeMigrationCLI srcKylinConfigUri dstKylinConfigUri cubeName projectName copyAclOrNot purgeOrNot overwriteIfExists realExecute migrateSegmentOrNot");
-        System.out.println("srcKylinConfigUri: The KylinConfig of the cube’s source \n"
-                + "dstKylinConfigUri: The KylinConfig of the cube’s new home \n"
-                + "cubeName: the name of cube to be migrated. \n"
-                + "projectName: The target project in the target environment.(Make sure it exist) \n"
-                + "copyAclOrNot: true or false: whether copy cube ACL to target environment. \n"
-                + "purgeOrNot: true or false: whether purge the cube from src server after the migration. \n"
-                + "overwriteIfExists: overwrite cube if it already exists in the target environment. \n"
-                + "realExecute: if false, just print the operations to take, if true, do the real migration. \n"
-                + "migrateSegmentOrNot:(optional) true or false: whether copy segment data to target environment. \n");
-
-    }
+    public void moveCube() throws Exception {
+        conf = HadoopUtil.getCurrentConfiguration();
 
-    public void moveCube(String srcCfgUri, String dstCfgUri, String cubeName, String projectName, String copyAcl,
-                         String purgeAndDisable, String overwriteIfExists, String realExecute)
-            throws IOException, InterruptedException {
+        if (optHelper.hasOption(OPTION_CUBE)) {
+            CubeManager cubeManager = CubeManager.getInstance(srcConfig);
+            moveSingleCube(optHelper.getOptionValue(OPTION_CUBE), dstProject, cubeManager);

Review comment:
       You are right. Maybe try to create it automatically?
       If the specified destProject exists in source cluster, the project's owner keep unchanged. 
       If the specified destProject does not exists in source cluster, set the to be created project's owner to ADMIN ? 




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org