This is an automated email from the ASF dual-hosted git repository.
zihaoxiang 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 9778652f17 [Improvement-14136][task] Support submitting spark-sql task
with the sql file in resource center (#14527)
9778652f17 is described below
commit 9778652f171d71266c47468be5bf478ded9cad42
Author: Rick Cheng <[email protected]>
AuthorDate: Wed Jul 19 10:09:30 2023 +0800
[Improvement-14136][task] Support submitting spark-sql task with the sql
file in resource center (#14527)
Co-authored-by: xiangzihao <[email protected]>
---
.../plugin/task/hivecli/HiveCliConstants.java | 2 -
.../plugin/task/spark/SparkConstants.java | 4 +
.../plugin/task/spark/SparkParameters.java | 133 +--------------------
.../plugin/task/spark/SparkTask.java | 34 +++++-
dolphinscheduler-ui/src/locales/en_US/project.ts | 3 +
dolphinscheduler-ui/src/locales/zh_CN/project.ts | 3 +
.../task/components/node/fields/use-hive-cli.ts | 30 ++---
.../task/components/node/fields/use-spark.ts | 49 +++++++-
.../projects/task/components/node/format-data.ts | 5 +-
.../task/components/node/tasks/use-spark.ts | 3 +-
.../views/projects/task/components/node/types.ts | 2 +
11 files changed, 111 insertions(+), 157 deletions(-)
diff --git
a/dolphinscheduler-task-plugin/dolphinscheduler-task-hivecli/src/main/java/org/apache/dolphinscheduler/plugin/task/hivecli/HiveCliConstants.java
b/dolphinscheduler-task-plugin/dolphinscheduler-task-hivecli/src/main/java/org/apache/dolphinscheduler/plugin/task/hivecli/HiveCliConstants.java
index 8b92999241..848e4af427 100644
---
a/dolphinscheduler-task-plugin/dolphinscheduler-task-hivecli/src/main/java/org/apache/dolphinscheduler/plugin/task/hivecli/HiveCliConstants.java
+++
b/dolphinscheduler-task-plugin/dolphinscheduler-task-hivecli/src/main/java/org/apache/dolphinscheduler/plugin/task/hivecli/HiveCliConstants.java
@@ -28,6 +28,4 @@ public class HiveCliConstants {
public static final String HIVE_CLI_EXECUTE_FILE = "hive -f";
- public static final String HIVE_CLI_EXECUTE_SCRIPT = "hive -e \"%s\"";
-
}
diff --git
a/dolphinscheduler-task-plugin/dolphinscheduler-task-spark/src/main/java/org/apache/dolphinscheduler/plugin/task/spark/SparkConstants.java
b/dolphinscheduler-task-plugin/dolphinscheduler-task-spark/src/main/java/org/apache/dolphinscheduler/plugin/task/spark/SparkConstants.java
index d4230c9d8c..c76436766e 100644
---
a/dolphinscheduler-task-plugin/dolphinscheduler-task-spark/src/main/java/org/apache/dolphinscheduler/plugin/task/spark/SparkConstants.java
+++
b/dolphinscheduler-task-plugin/dolphinscheduler-task-spark/src/main/java/org/apache/dolphinscheduler/plugin/task/spark/SparkConstants.java
@@ -101,4 +101,8 @@ public class SparkConstants {
*/
public static final String SPARK_SUBMIT_COMMAND =
"${SPARK_HOME}/bin/spark-submit";
+ public static final String TYPE_SCRIPT = "SCRIPT";
+
+ public static final String TYPE_FILE = "FILE";
+
}
diff --git
a/dolphinscheduler-task-plugin/dolphinscheduler-task-spark/src/main/java/org/apache/dolphinscheduler/plugin/task/spark/SparkParameters.java
b/dolphinscheduler-task-plugin/dolphinscheduler-task-spark/src/main/java/org/apache/dolphinscheduler/plugin/task/spark/SparkParameters.java
index 0bb40e7324..c5fcb5b76b 100644
---
a/dolphinscheduler-task-plugin/dolphinscheduler-task-spark/src/main/java/org/apache/dolphinscheduler/plugin/task/spark/SparkParameters.java
+++
b/dolphinscheduler-task-plugin/dolphinscheduler-task-spark/src/main/java/org/apache/dolphinscheduler/plugin/task/spark/SparkParameters.java
@@ -23,9 +23,9 @@ import
org.apache.dolphinscheduler.plugin.task.api.parameters.AbstractParameters
import java.util.ArrayList;
import java.util.List;
-/**
- * spark parameters
- */
+import lombok.Data;
+
+@Data
public class SparkParameters extends AbstractParameters {
/**
@@ -109,134 +109,9 @@ public class SparkParameters extends AbstractParameters {
return namespace;
}
- public void setNamespace(String namespace) {
- this.namespace = namespace;
- }
-
- /**
- * resource list
- */
private List<ResourceInfo> resourceList = new ArrayList<>();
- public ResourceInfo getMainJar() {
- return mainJar;
- }
-
- public void setMainJar(ResourceInfo mainJar) {
- this.mainJar = mainJar;
- }
-
- public String getMainClass() {
- return mainClass;
- }
-
- public void setMainClass(String mainClass) {
- this.mainClass = mainClass;
- }
-
- public String getDeployMode() {
- return deployMode;
- }
-
- public void setDeployMode(String deployMode) {
- this.deployMode = deployMode;
- }
-
- public String getMainArgs() {
- return mainArgs;
- }
-
- public void setMainArgs(String mainArgs) {
- this.mainArgs = mainArgs;
- }
-
- public int getDriverCores() {
- return driverCores;
- }
-
- public void setDriverCores(int driverCores) {
- this.driverCores = driverCores;
- }
-
- public String getDriverMemory() {
- return driverMemory;
- }
-
- public void setDriverMemory(String driverMemory) {
- this.driverMemory = driverMemory;
- }
-
- public int getNumExecutors() {
- return numExecutors;
- }
-
- public void setNumExecutors(int numExecutors) {
- this.numExecutors = numExecutors;
- }
-
- public int getExecutorCores() {
- return executorCores;
- }
-
- public void setExecutorCores(int executorCores) {
- this.executorCores = executorCores;
- }
-
- public String getExecutorMemory() {
- return executorMemory;
- }
-
- public void setExecutorMemory(String executorMemory) {
- this.executorMemory = executorMemory;
- }
-
- public String getAppName() {
- return appName;
- }
-
- public void setAppName(String appName) {
- this.appName = appName;
- }
-
- public String getYarnQueue() {
- return yarnQueue;
- }
-
- public void setYarnQueue(String yarnQueue) {
- this.yarnQueue = yarnQueue;
- }
-
- public String getOthers() {
- return others;
- }
-
- public void setOthers(String others) {
- this.others = others;
- }
-
- public List<ResourceInfo> getResourceList() {
- return resourceList;
- }
-
- public void setResourceList(List<ResourceInfo> resourceList) {
- this.resourceList = resourceList;
- }
-
- public ProgramType getProgramType() {
- return programType;
- }
-
- public void setProgramType(ProgramType programType) {
- this.programType = programType;
- }
-
- public String getRawScript() {
- return rawScript;
- }
-
- public void setRawScript(String rawScript) {
- this.rawScript = rawScript;
- }
+ private String sqlExecutionType;
@Override
public boolean checkParameters() {
diff --git
a/dolphinscheduler-task-plugin/dolphinscheduler-task-spark/src/main/java/org/apache/dolphinscheduler/plugin/task/spark/SparkTask.java
b/dolphinscheduler-task-plugin/dolphinscheduler-task-spark/src/main/java/org/apache/dolphinscheduler/plugin/task/spark/SparkTask.java
index 0a27d9011e..675320d49f 100644
---
a/dolphinscheduler-task-plugin/dolphinscheduler-task-spark/src/main/java/org/apache/dolphinscheduler/plugin/task/spark/SparkTask.java
+++
b/dolphinscheduler-task-plugin/dolphinscheduler-task-spark/src/main/java/org/apache/dolphinscheduler/plugin/task/spark/SparkTask.java
@@ -26,6 +26,7 @@ import static
org.apache.dolphinscheduler.plugin.task.spark.SparkConstants.SPARK
import org.apache.dolphinscheduler.common.utils.JSONUtils;
import org.apache.dolphinscheduler.plugin.task.api.AbstractYarnTask;
+import org.apache.dolphinscheduler.plugin.task.api.TaskException;
import org.apache.dolphinscheduler.plugin.task.api.TaskExecutionContext;
import org.apache.dolphinscheduler.plugin.task.api.model.Property;
import org.apache.dolphinscheduler.plugin.task.api.model.ResourceInfo;
@@ -33,11 +34,13 @@ import
org.apache.dolphinscheduler.plugin.task.api.parameters.AbstractParameters
import org.apache.dolphinscheduler.plugin.task.api.utils.ArgsUtils;
import org.apache.dolphinscheduler.plugin.task.api.utils.ParameterUtils;
+import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
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;
@@ -196,8 +199,28 @@ public class SparkTask extends AbstractYarnTask {
// bin/spark-sql -f fileName
if (ProgramType.SQL == programType) {
+ String sqlContent = "";
+ String resourceFileName = "";
args.add(SparkConstants.SQL_FROM_FILE);
- args.add(generateScriptFile());
+ if
(SparkConstants.TYPE_FILE.equals(sparkParameters.getSqlExecutionType())) {
+ final List<ResourceInfo> resourceInfos =
sparkParameters.getResourceList();
+ if (resourceInfos.size() > 1) {
+ log.warn("more than 1 files detected, use the first one by
default");
+ }
+
+ 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 sql content from file {} error ",
resourceFileName, e);
+ throw new TaskException("read sql content error", e);
+ }
+ } else {
+ sqlContent = sparkParameters.getRawScript();
+ }
+ args.add(generateScriptFile(sqlContent));
}
return args;
}
@@ -229,7 +252,7 @@ public class SparkTask extends AbstractYarnTask {
}
}
- private String generateScriptFile() {
+ private String generateScriptFile(String sqlContent) {
String scriptFileName = String.format("%s/%s_node.sql",
taskExecutionContext.getExecutePath(),
taskExecutionContext.getTaskAppId());
@@ -237,10 +260,9 @@ public class SparkTask extends AbstractYarnTask {
Path path = file.toPath();
if (!Files.exists(path)) {
- String script = replaceParam(sparkParameters.getRawScript());
- sparkParameters.setRawScript(script);
+ String script = replaceParam(sqlContent);
- log.info("raw script : {}", sparkParameters.getRawScript());
+ log.info("raw script : {}", script);
log.info("task execute path : {}",
taskExecutionContext.getExecutePath());
Set<PosixFilePermission> perms =
PosixFilePermissions.fromString(RWXR_XR_X);
@@ -254,7 +276,7 @@ public class SparkTask extends AbstractYarnTask {
}
Files.createFile(path, attr);
}
- Files.write(path, sparkParameters.getRawScript().getBytes(),
StandardOpenOption.APPEND);
+ Files.write(path, script.getBytes(),
StandardOpenOption.APPEND);
} catch (IOException e) {
throw new RuntimeException("generate spark sql script error",
e);
}
diff --git a/dolphinscheduler-ui/src/locales/en_US/project.ts
b/dolphinscheduler-ui/src/locales/en_US/project.ts
index 436a898f60..042d4c150a 100644
--- a/dolphinscheduler-ui/src/locales/en_US/project.ts
+++ b/dolphinscheduler-ui/src/locales/en_US/project.ts
@@ -718,6 +718,9 @@ export default {
zeppelin_username_tips: 'Please enter the zeppelin server username',
zeppelin_password: 'zeppelinPassword',
zeppelin_password_tips: 'Please enter the zeppelin server password',
+ sql_execution_type: 'SQL Input',
+ sql_execution_type_from_file: 'FROM_FILE',
+ sql_execution_type_from_script: 'FROM_SCRIPT',
hive_cli_task_execution_type: 'Hive Cli Task Execution Type',
hive_sql_script: 'Hive SQL Script',
hive_cli_options: 'Hive Cli Options',
diff --git a/dolphinscheduler-ui/src/locales/zh_CN/project.ts
b/dolphinscheduler-ui/src/locales/zh_CN/project.ts
index 02699aa149..9d6d38690e 100644
--- a/dolphinscheduler-ui/src/locales/zh_CN/project.ts
+++ b/dolphinscheduler-ui/src/locales/zh_CN/project.ts
@@ -703,6 +703,9 @@ export default {
zeppelin_username_tips: '请输入zeppelin server的登陆用户名',
zeppelin_password: 'zeppelinPassword',
zeppelin_password_tips: '请输入zeppelin server的登陆密码',
+ sql_execution_type: 'SQL来源',
+ sql_execution_type_from_file: '选择资源中心文件',
+ sql_execution_type_from_script: '脚本输入',
hive_cli_task_execution_type: 'Hive Cli 任务类型',
hive_sql_script: 'Hive SQL 脚本',
hive_cli_options: 'Hive Cli 选项',
diff --git
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-hive-cli.ts
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-hive-cli.ts
index d67a3ffaa8..4a7ae3da14 100644
---
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-hive-cli.ts
+++
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-hive-cli.ts
@@ -25,18 +25,29 @@ export function useHiveCli(model: { [field: string]: any
}): IJsonItem[] {
model.hiveCliTaskExecutionType === 'SCRIPT' ? 24 : 0
)
const resourcesRequired = ref(
- model.hiveCliTaskExecutionType === 'SCRIPT' ? false : true
+ model.hiveCliTaskExecutionType !== 'SCRIPT'
)
const resourcesLimit = computed(() =>
model.hiveCliTaskExecutionType === 'SCRIPT' ? -1 : 1
)
+ const SQL_EXECUTION_TYPES = [
+ {
+ label: t('project.node.sql_execution_type_from_script'),
+ value: 'SCRIPT'
+ },
+ {
+ label: t('project.node.sql_execution_type_from_file'),
+ value: 'FILE'
+ }
+ ]
+
watch(
() => model.hiveCliTaskExecutionType,
() => {
resourcesRequired.value =
- model.hiveCliTaskExecutionType === 'SCRIPT' ? false : true
+ model.hiveCliTaskExecutionType !== 'SCRIPT'
}
)
@@ -45,8 +56,8 @@ export function useHiveCli(model: { [field: string]: any }):
IJsonItem[] {
type: 'select',
field: 'hiveCliTaskExecutionType',
span: 12,
- name: t('project.node.hive_cli_task_execution_type'),
- options: HIVE_CLI_TASK_EXECUTION_TYPES,
+ name: t('project.node.sql_execution_type'),
+ options: SQL_EXECUTION_TYPES,
validate: {
trigger: ['input', 'blur'],
required: true
@@ -77,14 +88,3 @@ export function useHiveCli(model: { [field: string]: any }):
IJsonItem[] {
...useCustomParams({ model, field: 'localParams', isSimple: false })
]
}
-
-export const HIVE_CLI_TASK_EXECUTION_TYPES = [
- {
- label: 'FROM_SCRIPT',
- value: 'SCRIPT'
- },
- {
- label: 'FROM_FILE',
- value: 'FILE'
- }
-]
diff --git
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-spark.ts
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-spark.ts
index 72e442f9fc..f43f68b218 100644
---
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-spark.ts
+++
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-spark.ts
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import { computed, ref } from 'vue'
+import { computed, ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import {
useCustomParams,
@@ -39,10 +39,39 @@ export function useSpark(model: { [field: string]: any }):
IJsonItem[] {
const mainArgsSpan = computed(() => (model.programType === 'SQL' ? 0 : 24))
- const rawScriptSpan = computed(() => (model.programType === 'SQL' ? 24 : 0))
+ const rawScriptSpan = computed(() => (model.programType === 'SQL' &&
model.sqlExecutionType === 'SCRIPT' ? 24 : 0))
const showCluster = computed(() => model.programType !== 'SQL')
+ const resourcesRequired = ref(
+ model.programType === 'SQL' && model.sqlExecutionType === 'FILE'
+ )
+
+ const resourcesLimit = computed(() =>
+ model.programType === 'SQL' && model.sqlExecutionType === 'FILE' ? 1 : -1
+ )
+
+ const sqlExecutionTypeSpan = computed(() => (model.programType === 'SQL' ?
12 : 0))
+
+ const SQL_EXECUTION_TYPES = [
+ {
+ label: t('project.node.sql_execution_type_from_script'),
+ value: 'SCRIPT'
+ },
+ {
+ label: t('project.node.sql_execution_type_from_file'),
+ value: 'FILE'
+ }
+ ]
+
+ watch(
+ () => [model.sqlExecutionType, model.programType],
+ () => {
+ resourcesRequired.value =
+ model.programType === 'SQL' && model.sqlExecutionType === 'FILE'
+ }
+ )
+
return [
{
type: 'select',
@@ -57,6 +86,17 @@ export function useSpark(model: { [field: string]: any }):
IJsonItem[] {
}
}
},
+ {
+ type: 'select',
+ field: 'sqlExecutionType',
+ span: sqlExecutionTypeSpan,
+ name: t('project.node.sql_execution_type'),
+ options: SQL_EXECUTION_TYPES,
+ validate: {
+ trigger: ['input', 'blur'],
+ required: true
+ }
+ },
{
type: 'input',
field: 'mainClass',
@@ -85,6 +125,9 @@ export function useSpark(model: { [field: string]: any }):
IJsonItem[] {
field: 'rawScript',
span: rawScriptSpan,
name: t('project.node.script'),
+ props: {
+ language: 'sql'
+ },
validate: {
trigger: ['input', 'trigger'],
required: true,
@@ -126,7 +169,7 @@ export function useSpark(model: { [field: string]: any }):
IJsonItem[] {
placeholder: t('project.node.option_parameters_tips')
}
},
- useResources(),
+ useResources(24, resourcesRequired, resourcesLimit),
...useCustomParams({ model, field: 'localParams', isSimple: false })
]
}
diff --git
a/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
b/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
index dd3b4ce1d4..760a2139b9 100644
--- a/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
@@ -71,6 +71,7 @@ export function formatParams(data: INodeData): {
taskParams.numExecutors = data.numExecutors
taskParams.executorMemory = data.executorMemory
taskParams.executorCores = data.executorCores
+ taskParams.sqlExecutionType = data.sqlExecutionType
}
if (data.taskType === 'FLINK' || data.taskType === 'FLINK_STREAM') {
@@ -325,7 +326,8 @@ export function formatParams(data: INodeData): {
executorMemory: data.executorMemory,
numExecutors: data.numExecutors,
others: data.others,
- yarnQueue: data.yarnQueue
+ yarnQueue: data.yarnQueue,
+ sqlExecutionType: data.sqlExecutionType
}
}
@@ -726,6 +728,7 @@ export function formatModel(data: ITaskData) {
params.executorMemory = data.taskParams.sparkParameters.executorMemory
params.numExecutors = data.taskParams.sparkParameters.numExecutors
params.others = data.taskParams.sparkParameters.others
+ params.sqlExecutionType = data.taskParams.sparkParameters.sqlExecutionType
}
if (data.taskParams?.conditionResult?.successNode?.length) {
diff --git
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-spark.ts
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-spark.ts
index 0fc42445c4..15f7ec508f 100644
---
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-spark.ts
+++
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-spark.ts
@@ -52,7 +52,8 @@ export function useSpark({
executorMemory: '2G',
executorCores: 2,
yarnQueue: '',
- timeoutNotifyStrategy: ['WARN']
+ timeoutNotifyStrategy: ['WARN'],
+ sqlExecutionType: 'SCRIPT'
} as INodeData)
return {
diff --git
a/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
b/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
index 67d97a5b19..84b6375a01 100644
--- a/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
@@ -224,6 +224,7 @@ interface ISparkParameters {
numExecutors?: number
others?: string
yarnQueue?: string
+ sqlExecutionType?: string
}
interface IRuleParameters {
@@ -348,6 +349,7 @@ interface ITaskParams {
hiveCliOptions?: string
hiveSqlScript?: string
hiveCliTaskExecutionType?: string
+ sqlExecutionType?: string
noteId?: string
paragraphId?: string
condaEnvName?: string