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

xincheng pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 13dfa859b5 [Improvement-14371][Hivecli] Add support for hivevar 
setting in hivecli task (#14423)
13dfa859b5 is described below

commit 13dfa859b59ae90b93a8ed29920c31b5aa05f30e
Author: Rick Cheng <[email protected]>
AuthorDate: Tue Jul 4 14:02:23 2023 +0800

    [Improvement-14371][Hivecli] Add support for hivevar setting in hivecli 
task (#14423)
---
 .../plugin/task/hivecli/HiveCliTask.java           | 71 +++++++++++++++++++---
 .../plugin/task/hivecli/HiveCliTaskTest.java       | 25 +++++++-
 2 files changed, 85 insertions(+), 11 deletions(-)

diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-hivecli/src/main/java/org/apache/dolphinscheduler/plugin/task/hivecli/HiveCliTask.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-hivecli/src/main/java/org/apache/dolphinscheduler/plugin/task/hivecli/HiveCliTask.java
index 0aaf5f70b2..8ba8409567 100644
--- 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-hivecli/src/main/java/org/apache/dolphinscheduler/plugin/task/hivecli/HiveCliTask.java
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-hivecli/src/main/java/org/apache/dolphinscheduler/plugin/task/hivecli/HiveCliTask.java
@@ -18,8 +18,10 @@
 package org.apache.dolphinscheduler.plugin.task.hivecli;
 
 import static 
org.apache.dolphinscheduler.plugin.task.api.TaskConstants.EXIT_CODE_FAILURE;
+import static 
org.apache.dolphinscheduler.plugin.task.api.TaskConstants.RWXR_XR_X;
 
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
+import org.apache.dolphinscheduler.common.utils.OSUtils;
 import org.apache.dolphinscheduler.plugin.task.api.AbstractRemoteTask;
 import org.apache.dolphinscheduler.plugin.task.api.ShellCommandExecutor;
 import org.apache.dolphinscheduler.plugin.task.api.TaskCallBack;
@@ -31,12 +33,23 @@ import 
org.apache.dolphinscheduler.plugin.task.api.model.TaskResponse;
 import 
org.apache.dolphinscheduler.plugin.task.api.parameters.AbstractParameters;
 import org.apache.dolphinscheduler.plugin.task.api.utils.ParameterUtils;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.nio.file.attribute.FileAttribute;
+import java.nio.file.attribute.PosixFilePermission;
+import java.nio.file.attribute.PosixFilePermissions;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public class HiveCliTask extends AbstractRemoteTask {
 
@@ -108,29 +121,41 @@ public class HiveCliTask extends AbstractRemoteTask {
 
         final String type = hiveCliParameters.getHiveCliTaskExecutionType();
 
+        String sqlContent = "";
+        String resourceFileName = "";
         // TODO: make sure type is not unknown
         if (HiveCliConstants.TYPE_FILE.equals(type)) {
-            args.add(HiveCliConstants.HIVE_CLI_EXECUTE_FILE);
             final List<ResourceInfo> resourceInfos = 
hiveCliParameters.getResourceList();
             if (resourceInfos.size() > 1) {
                 log.warn("more than 1 files detected, use the first one by 
default");
             }
 
-            
args.add(StringUtils.stripStart(resourceInfos.get(0).getResourceName(), "/"));
+            try {
+                resourceFileName = resourceInfos.get(0).getResourceName();
+                sqlContent = FileUtils.readFileToString(
+                        new File(String.format("%s/%s", 
taskExecutionContext.getExecutePath(), resourceFileName)),
+                        StandardCharsets.UTF_8);
+            } catch (IOException e) {
+                log.error("read hive sql content from file {} error ", 
resourceFileName, e);
+                throw new TaskException("read hive sql content error", e);
+            }
         } else {
-            final String script = hiveCliParameters.getHiveSqlScript();
-            args.add(String.format(HiveCliConstants.HIVE_CLI_EXECUTE_SCRIPT, 
script));
+            sqlContent = hiveCliParameters.getHiveSqlScript();
         }
 
+        final Map<String, Property> paramsMap = 
taskExecutionContext.getPrepareParamsMap();
+        sqlContent = ParameterUtils.convertParameterPlaceholders(sqlContent, 
ParameterUtils.convert(paramsMap));
+        log.info("HiveCli sql content: {}", sqlContent);
+        String sqlFilePath = generateSqlScriptFile(sqlContent);
+
+        args.add(HiveCliConstants.HIVE_CLI_EXECUTE_FILE);
+        args.add(new File(sqlFilePath).getName());
         final String hiveCliOptions = hiveCliParameters.getHiveCliOptions();
         if (StringUtils.isNotEmpty(hiveCliOptions)) {
             args.add(hiveCliOptions);
         }
 
-        final Map<String, Property> paramsMap = 
taskExecutionContext.getPrepareParamsMap();
-        final String command =
-                ParameterUtils.convertParameterPlaceholders(String.join(" ", 
args), ParameterUtils.convert(paramsMap));
-
+        String command = String.join(" ", args);
         log.info("hiveCli task command: {}", command);
 
         return command;
@@ -151,4 +176,34 @@ public class HiveCliTask extends AbstractRemoteTask {
         }
     }
 
+    protected String generateSqlScriptFile(String rawScript) {
+        String scriptFileName = String.format("%s/%s_node.sql", 
taskExecutionContext.getExecutePath(),
+                taskExecutionContext.getTaskAppId());
+
+        File file = new File(scriptFileName);
+        Path path = file.toPath();
+
+        if (!Files.exists(path)) {
+            String script = rawScript.replaceAll("\\r\\n", "\n");
+
+            Set<PosixFilePermission> perms = 
PosixFilePermissions.fromString(RWXR_XR_X);
+            FileAttribute<Set<PosixFilePermission>> attr = 
PosixFilePermissions.asFileAttribute(perms);
+            try {
+                if (OSUtils.isWindows()) {
+                    Files.createFile(path);
+                } else {
+                    if (!file.getParentFile().exists()) {
+                        file.getParentFile().mkdirs();
+                    }
+                    Files.createFile(path, attr);
+                }
+                Files.write(path, script.getBytes(), 
StandardOpenOption.APPEND);
+            } catch (IOException e) {
+                log.error("generate hivecli sql script error", e);
+                throw new TaskException("generate hivecli sql script error", 
e);
+            }
+        }
+        return scriptFileName;
+    }
+
 }
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-hivecli/src/test/java/org/apache/dolphinscheduler/plugin/task/hivecli/HiveCliTaskTest.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-hivecli/src/test/java/org/apache/dolphinscheduler/plugin/task/hivecli/HiveCliTaskTest.java
index 7064c23233..506651208b 100644
--- 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-hivecli/src/test/java/org/apache/dolphinscheduler/plugin/task/hivecli/HiveCliTaskTest.java
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-hivecli/src/test/java/org/apache/dolphinscheduler/plugin/task/hivecli/HiveCliTaskTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.dolphinscheduler.plugin.task.hivecli;
 
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
@@ -24,12 +25,17 @@ import org.apache.dolphinscheduler.common.utils.JSONUtils;
 import org.apache.dolphinscheduler.plugin.task.api.TaskExecutionContext;
 import org.apache.dolphinscheduler.plugin.task.api.model.ResourceInfo;
 
+import org.apache.commons.io.FileUtils;
+
 import java.util.ArrayList;
 import java.util.List;
 
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 import org.mockito.junit.jupiter.MockitoExtension;
 
@@ -37,13 +43,25 @@ import org.mockito.junit.jupiter.MockitoExtension;
 public class HiveCliTaskTest {
 
     public static final String 
EXPECTED_HIVE_CLI_TASK_EXECUTE_FROM_SCRIPT_COMMAND =
-            "hive -e \"SHOW DATABASES;\"";
+            "hive -f 123_node.sql";
 
     public static final String 
EXPECTED_HIVE_CLI_TASK_EXECUTE_FROM_FILE_COMMAND =
-            "hive -f sql_tasks/hive_task.sql";
+            "hive -f 123_node.sql";
 
     public static final String EXPECTED_HIVE_CLI_TASK_EXECUTE_WITH_OPTIONS =
-            "hive -e \"SHOW DATABASES;\" --verbose";
+            "hive -f 123_node.sql --verbose";
+
+    private MockedStatic<FileUtils> mockedStaticFileUtils;
+
+    @BeforeEach
+    public void setUp() {
+        mockedStaticFileUtils = Mockito.mockStatic(FileUtils.class);
+    }
+
+    @AfterEach
+    public void after() {
+        mockedStaticFileUtils.close();
+    }
 
     @Test
     public void hiveCliTaskExecuteSqlFromScript() throws Exception {
@@ -73,6 +91,7 @@ public class HiveCliTaskTest {
         TaskExecutionContext taskExecutionContext = 
Mockito.mock(TaskExecutionContext.class);
         
when(taskExecutionContext.getTaskParams()).thenReturn(hiveCliTaskParameters);
         HiveCliTask hiveCliTask = spy(new HiveCliTask(taskExecutionContext));
+        
doReturn("123_node.sql").when(hiveCliTask).generateSqlScriptFile(Mockito.any());
         return hiveCliTask;
     }
 

Reply via email to