xuhhui
2 years ago
committed by
GitHub
30 changed files with 1194 additions and 2 deletions
@ -0,0 +1,73 @@
|
||||
# ChunJun |
||||
|
||||
## Overview |
||||
|
||||
ChunJun task type for executing ChunJun programs. For ChunJun nodes, the worker will execute `${CHUNJUN_HOME}/bin/start-chunjun` to analyze the input json file. |
||||
|
||||
## Create Task |
||||
|
||||
- Click `Project Management -> Project Name -> Workflow Definition`, and click the `Create Workflow` button to enter the DAG editing page. |
||||
- Drag the <img src="../../../../img/tasks/icons/chunjun.png" width="15"/> from the toolbar to the drawing board. |
||||
|
||||
## Task Parameters |
||||
|
||||
| **Parameter** | **Description** | |
||||
| ------- | ---------- | |
||||
| Node name | The node name in a workflow definition is unique. | |
||||
| Run flag | Identifies whether this node schedules normally, if it does not need to execute, select the prohibition execution. | |
||||
| Task priority | When the number of worker threads is insufficient, execute in the order of priority from high to low, and tasks with the same priority will execute in a first-in first-out order. | |
||||
| Description | Describe the function of the node. | |
||||
| Worker group | Assign tasks to the machines of the worker group to execute. If `Default` is selected, randomly select a worker machine for execution. | |
||||
| Environment Name | Configure the environment name in which run the script. | |
||||
| Number of failed retries | The number of times the task failed to resubmit. | |
||||
| Failed retry interval | The time interval (unit minute) for resubmitting the task after a failed task. | |
||||
| Task group name | The task group name. | |
||||
| Priority | The task priority. | |
||||
| Delayed execution time | The time, in minutes, that a task is delayed in execution. | |
||||
| Timeout alarm | Check the timeout alarm and timeout failure. When the task exceeds the "timeout period", an alarm email will be sent and the task execution will fail. | |
||||
| Custom template | Custom the content of the ChunJun node's json profile. | |
||||
| json | json configuration file for ChunJun synchronization. | |
||||
| Custom parameters | It is a user-defined parameter, and will replace the content with `${variable}` in the script. |
||||
| Deploy mode | Execute chunjun task mode, eg local standalone. | |
||||
| Option Parameters | Support such as `-confProp "{\"flink.checkpoint.interval\":60000}"` | |
||||
| Predecessor task | Selecting a predecessor task for the current task will set the selected predecessor task as upstream of the current task. | |
||||
|
||||
## Task Example |
||||
|
||||
This example demonstrates importing data from Hive into MySQL. |
||||
|
||||
### Configuring the ChunJun environment in DolphinScheduler |
||||
|
||||
If you are using the ChunJun task type in a production environment, it is necessary to configure the required environment first. The configuration file is as follows: `/dolphinscheduler/conf/env/dolphinscheduler_env.sh`. |
||||
|
||||
![chunjun_task01](../../../../img/tasks/demo/chunjun_task01.png) |
||||
|
||||
After the environment has been configured, DolphinScheduler needs to be restarted. |
||||
|
||||
### Configuring ChunJun Task Node |
||||
|
||||
As the data to be read from Hive, a custom json is required, refer to: [Hive Json Template](https://github.com/DTStack/chunjun/blob/master/chunjun-examples/json/hive/binlog_hive.json). |
||||
|
||||
After writing the required json file, you can configure the node content by following the steps in the diagram below. |
||||
|
||||
![chunjun_task02](../../../../img/tasks/demo/chunjun_task02.png) |
||||
|
||||
### View run results |
||||
|
||||
![chunjun_task03](../../../../img/tasks/demo/chunjun_task03.png) |
||||
|
||||
### Note |
||||
|
||||
Before execute ${CHUNJUN_HOME}/bin/start-chunjun, need to change the shell ${CHUNJUN_HOME}/bin/start-chunjun, remove '&' in order to run in front. |
||||
|
||||
such as: |
||||
|
||||
```shell |
||||
nohup $JAVA_RUN -cp $JAR_DIR $CLASS_NAME $@ & |
||||
``` |
||||
|
||||
update to following: |
||||
|
||||
```shell |
||||
nohup $JAVA_RUN -cp $JAR_DIR $CLASS_NAME $@ |
||||
``` |
@ -0,0 +1,47 @@
|
||||
# ChunJun节点 |
||||
|
||||
## 综述 |
||||
|
||||
ChunJun 任务类型,用于执行 ChunJun 程序。对于 ChunJun 节点,worker 会通过执行 `${CHUNJUN_HOME}/bin/start-chunjun` 来解析传入的 json 文件。 |
||||
|
||||
## 创建任务 |
||||
|
||||
- 点击项目管理 -> 项目名称 -> 工作流定义,点击“创建工作流”按钮,进入 DAG 编辑页面; |
||||
- 拖动工具栏的<img src="../../../../img/tasks/icons/chunjun.png" width="15"/> 任务节点到画板中。 |
||||
|
||||
## 任务参数 |
||||
|
||||
- 节点名称:设置任务节点的名称。一个工作流定义中的节点名称是唯一的。 |
||||
- 运行标志:标识这个结点是否能正常调度,如果不需要执行,可以打开禁止执行开关。 |
||||
- 描述:描述该节点的功能。 |
||||
- 任务优先级:worker 线程数不足时,根据优先级从高到低依次执行,优先级一样时根据先进先出原则执行。 |
||||
- Worker 分组:任务分配给 worker 组的机器执行,选择 Default ,会随机选择一台 worker 机执行。 |
||||
- 环境名称:配置运行脚本的环境。 |
||||
- 任务组名称:任务组的名称。 |
||||
- 组内优先级:一个任务组内此任务的优先级。 |
||||
- 失败重试次数:任务失败重新提交的次数。 |
||||
- 失败重试间隔:任务失败重新提交任务的时间间隔,以分为单位。 |
||||
- 延时执行时间:任务延迟执行的时间,以分为单位。 |
||||
- 超时警告:勾选超时警告、超时失败,当任务超过“超时时长”后,会发送告警邮件并且任务执行失败。 |
||||
- 自定义模板:自定义 ChunJun 节点的 json 配置文件内容,当前支持此种方式。 |
||||
- json:ChunJun 同步的 json 配置文件。 |
||||
- 自定义参数:用户自定义参数,会替换脚本中以 ${变量} 的内容。 |
||||
- 部署方式: 执行ChunJun任务的方式,比如local,standalone等。 |
||||
- 选项参数: 支持 `-confProp "{\"flink.checkpoint.interval\":60000}"` 格式。 |
||||
- 前置任务:选择当前任务的前置任务,会将被选择的前置任务设置为当前任务的上游。 |
||||
|
||||
## 任务样例 |
||||
|
||||
该样例演示为从 Hive 数据导入到 MySQL 中。 |
||||
|
||||
### 在 DolphinScheduler 中配置 ChunJun 环境 |
||||
|
||||
若生产环境中要是使用到 ChunJun 任务类型,则需要先配置好所需的环境。配置文件如下:`/dolphinscheduler/conf/env/dolphinscheduler_env.sh`。 |
||||
|
||||
![chunjun_task01](../../../../img/tasks/demo/chunjun_task01.png) |
||||
|
||||
当环境配置完成之后,需要重启 DolphinScheduler。 |
||||
|
||||
### 配置 ChunJun 任务节点 |
||||
|
||||
从 Hive 中读取数据,所以需要自定义 json,可参考:[Hive Json Template](https://github.com/DTStack/chunjun/blob/master/chunjun-examples/json/hive/binlog_hive.json) |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 176 KiB |
@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!-- |
||||
~ 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. |
||||
--> |
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
<parent> |
||||
<artifactId>dolphinscheduler-task-plugin</artifactId> |
||||
<groupId>org.apache.dolphinscheduler</groupId> |
||||
<version>dev-SNAPSHOT</version> |
||||
</parent> |
||||
<modelVersion>4.0.0</modelVersion> |
||||
|
||||
<artifactId>dolphinscheduler-task-chunjun</artifactId> |
||||
<packaging>jar</packaging> |
||||
|
||||
<dependencies> |
||||
<dependency> |
||||
<groupId>org.apache.dolphinscheduler</groupId> |
||||
<artifactId>dolphinscheduler-datasource-all</artifactId> |
||||
</dependency> |
||||
|
||||
<dependency> |
||||
<groupId>org.apache.dolphinscheduler</groupId> |
||||
<artifactId>dolphinscheduler-spi</artifactId> |
||||
<scope>provided</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.apache.dolphinscheduler</groupId> |
||||
<artifactId>dolphinscheduler-task-api</artifactId> |
||||
<version>${project.version}</version> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.apache.dolphinscheduler</groupId> |
||||
<artifactId>dolphinscheduler-datasource-api</artifactId> |
||||
<version>${project.version}</version> |
||||
</dependency> |
||||
|
||||
</dependencies> |
||||
</project> |
@ -0,0 +1,31 @@
|
||||
/* |
||||
* 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.dolphinscheduler.plugin.task.chunjun; |
||||
|
||||
/** |
||||
* ChunJun constants |
||||
*/ |
||||
public class ChunJunConstants { |
||||
|
||||
public static final String FLINK_CONF_DIR = "${FLINK_HOME}/conf"; |
||||
|
||||
public static final String FLINK_LIB_DIR = "${FLINK_HOME}/lib"; |
||||
|
||||
public static final String HADOOP_CONF_DIR = "${HADOOP_HOME}/etc/hadoop"; |
||||
|
||||
} |
@ -0,0 +1,139 @@
|
||||
/* |
||||
* 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.dolphinscheduler.plugin.task.chunjun; |
||||
|
||||
import org.apache.dolphinscheduler.plugin.task.api.enums.ResourceType; |
||||
import org.apache.dolphinscheduler.plugin.task.api.model.ResourceInfo; |
||||
import org.apache.dolphinscheduler.plugin.task.api.parameters.AbstractParameters; |
||||
import org.apache.dolphinscheduler.plugin.task.api.parameters.resource.ResourceParametersHelper; |
||||
import org.apache.dolphinscheduler.spi.enums.Flag; |
||||
import org.apache.dolphinscheduler.spi.utils.StringUtils; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
import lombok.Getter; |
||||
import lombok.Setter; |
||||
import lombok.ToString; |
||||
|
||||
/** |
||||
* chunjun parameters |
||||
*/ |
||||
@Setter |
||||
@Getter |
||||
@ToString |
||||
public class ChunJunParameters extends AbstractParameters { |
||||
|
||||
/** |
||||
* custom json config,default 1, support custom json |
||||
*/ |
||||
private int customConfig; |
||||
|
||||
/** |
||||
* custom config json |
||||
*/ |
||||
private String json; |
||||
|
||||
/** |
||||
* other arguments -confProp "{\"flink.checkpoint.interval\":60000}" |
||||
*/ |
||||
private String others; |
||||
|
||||
/** |
||||
* deploy mode local standlone yarn-session yarn-per-job |
||||
*/ |
||||
private String deployMode; |
||||
|
||||
/** |
||||
* customConfig value is 0, datasource type,eg mysql |
||||
*/ |
||||
private String dsType; |
||||
|
||||
/** |
||||
* customConfig value is 0, datasource id int |
||||
*/ |
||||
private int dataSource; |
||||
|
||||
/** |
||||
* customConfig value is 0, datasource targetType,eg MYSQL, POSTGRES |
||||
*/ |
||||
private String dtType; |
||||
|
||||
/** |
||||
* customConfig value is 0, data target id |
||||
*/ |
||||
private int dataTarget; |
||||
|
||||
/** |
||||
* customConfig value is 0, sql |
||||
*/ |
||||
private String sql; |
||||
|
||||
/** |
||||
* customConfig value is 0, target table |
||||
*/ |
||||
private String targetTable; |
||||
|
||||
/** |
||||
* pre statements |
||||
*/ |
||||
private List<String> preStatements; |
||||
|
||||
/** |
||||
* post statements |
||||
*/ |
||||
private List<String> postStatements; |
||||
|
||||
/** |
||||
* customConfig value is 0, job speed byte |
||||
*/ |
||||
private int jobSpeedByte; |
||||
|
||||
/** |
||||
* customConfig value is 0, job speed record count |
||||
*/ |
||||
private int jobSpeedRecord; |
||||
|
||||
@Override |
||||
public boolean checkParameters() { |
||||
if (customConfig == Flag.NO.ordinal()) { |
||||
return dataSource != 0 && dataTarget != 0 |
||||
&& StringUtils.isNotEmpty(sql) |
||||
&& StringUtils.isNotEmpty(targetTable); |
||||
} else { |
||||
return StringUtils.isNotEmpty(json); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public List<ResourceInfo> getResourceFilesList() { |
||||
return new ArrayList<>(); |
||||
} |
||||
|
||||
@Override |
||||
public ResourceParametersHelper getResources() { |
||||
ResourceParametersHelper resources = super.getResources(); |
||||
|
||||
if (customConfig == Flag.YES.ordinal()) { |
||||
return resources; |
||||
} |
||||
resources.put(ResourceType.DATASOURCE, dataSource); |
||||
resources.put(ResourceType.DATASOURCE, dataTarget); |
||||
return resources; |
||||
} |
||||
} |
@ -0,0 +1,257 @@
|
||||
/* |
||||
* 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.dolphinscheduler.plugin.task.chunjun; |
||||
|
||||
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.plugin.task.api.AbstractTaskExecutor; |
||||
import org.apache.dolphinscheduler.plugin.task.api.ShellCommandExecutor; |
||||
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.TaskResponse; |
||||
import org.apache.dolphinscheduler.plugin.task.api.parameters.AbstractParameters; |
||||
import org.apache.dolphinscheduler.plugin.task.api.parser.ParamUtils; |
||||
import org.apache.dolphinscheduler.plugin.task.api.parser.ParameterUtils; |
||||
import org.apache.dolphinscheduler.spi.enums.Flag; |
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils; |
||||
|
||||
import org.apache.commons.io.FileUtils; |
||||
import org.apache.commons.lang.SystemUtils; |
||||
|
||||
import java.io.File; |
||||
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.List; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
|
||||
/** |
||||
* chunjun task |
||||
*/ |
||||
public class ChunJunTask extends AbstractTaskExecutor { |
||||
/** |
||||
* chunjun path |
||||
*/ |
||||
private static final String CHUNJUN_PATH = "${CHUNJUN_HOME}/bin/start-chunjun"; |
||||
|
||||
/** |
||||
* chunjun dist |
||||
*/ |
||||
private static final String CHUNJUN_DIST_DIR = "${CHUNJUN_HOME}/chunjun-dist"; |
||||
|
||||
/** |
||||
* chunJun parameters |
||||
*/ |
||||
private ChunJunParameters chunJunParameters; |
||||
|
||||
/** |
||||
* shell command executor |
||||
*/ |
||||
private ShellCommandExecutor shellCommandExecutor; |
||||
|
||||
/** |
||||
* taskExecutionContext |
||||
*/ |
||||
private TaskExecutionContext taskExecutionContext; |
||||
|
||||
public ChunJunTask(TaskExecutionContext taskExecutionContext) { |
||||
super(taskExecutionContext); |
||||
this.taskExecutionContext = taskExecutionContext; |
||||
|
||||
this.shellCommandExecutor = new ShellCommandExecutor(this::logHandle, |
||||
taskExecutionContext, logger); |
||||
} |
||||
|
||||
/** |
||||
* init chunjun config |
||||
*/ |
||||
@Override |
||||
public void init() { |
||||
logger.info("chunjun task params {}", taskExecutionContext.getTaskParams()); |
||||
chunJunParameters = JSONUtils.parseObject(taskExecutionContext.getTaskParams(), ChunJunParameters.class); |
||||
|
||||
if (!chunJunParameters.checkParameters()) { |
||||
throw new RuntimeException("chunjun task params is not valid"); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* run chunjun process |
||||
* |
||||
* @throws Exception exception |
||||
*/ |
||||
@Override |
||||
public void handle() throws Exception { |
||||
try { |
||||
Map<String, Property> paramsMap = taskExecutionContext.getPrepareParamsMap(); |
||||
|
||||
String jsonFilePath = buildChunJunJsonFile(paramsMap); |
||||
String shellCommandFilePath = buildShellCommandFile(jsonFilePath, paramsMap); |
||||
TaskResponse commandExecuteResult = shellCommandExecutor.run(shellCommandFilePath); |
||||
|
||||
setExitStatusCode(commandExecuteResult.getExitStatusCode()); |
||||
setAppIds(commandExecuteResult.getAppIds()); |
||||
setProcessId(commandExecuteResult.getProcessId()); |
||||
} catch (Exception e) { |
||||
logger.error("chunjun task failed.", e); |
||||
setExitStatusCode(EXIT_CODE_FAILURE); |
||||
throw e; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* build chunjun json file |
||||
* |
||||
* @param paramsMap |
||||
* @return |
||||
* @throws Exception |
||||
*/ |
||||
private String buildChunJunJsonFile(Map<String, Property> paramsMap) |
||||
throws Exception { |
||||
// generate json
|
||||
String fileName = String.format("%s/%s_job.json", |
||||
taskExecutionContext.getExecutePath(), |
||||
taskExecutionContext.getTaskAppId()); |
||||
|
||||
String json = null; |
||||
|
||||
Path path = new File(fileName).toPath(); |
||||
if (Files.exists(path)) { |
||||
return fileName; |
||||
} |
||||
|
||||
if (chunJunParameters.getCustomConfig() == Flag.YES.ordinal()) { |
||||
json = chunJunParameters.getJson().replaceAll("\\r\\n", "\n"); |
||||
} |
||||
|
||||
// replace placeholder
|
||||
json = ParameterUtils.convertParameterPlaceholders(json, ParamUtils.convert(paramsMap)); |
||||
|
||||
logger.debug("chunjun job json : {}", json); |
||||
|
||||
// create chunjun json file
|
||||
FileUtils.writeStringToFile(new File(fileName), json, StandardCharsets.UTF_8); |
||||
return fileName; |
||||
} |
||||
|
||||
/** |
||||
* create command |
||||
* |
||||
* @return shell command file name |
||||
* @throws Exception if error throws Exception |
||||
*/ |
||||
private String buildShellCommandFile(String jobConfigFilePath, Map<String, Property> paramsMap) |
||||
throws Exception { |
||||
// generate scripts
|
||||
String fileName = String.format("%s/%s_node.%s", |
||||
taskExecutionContext.getExecutePath(), |
||||
taskExecutionContext.getTaskAppId(), |
||||
SystemUtils.IS_OS_WINDOWS ? "bat" : "sh"); |
||||
|
||||
Path path = new File(fileName).toPath(); |
||||
|
||||
if (Files.exists(path)) { |
||||
return fileName; |
||||
} |
||||
|
||||
// chunjun command
|
||||
List<String> args = new ArrayList<>(); |
||||
|
||||
args.add(CHUNJUN_PATH); |
||||
args.add("-mode"); |
||||
args.add(getExecMode(chunJunParameters)); |
||||
args.add("-jobType sync"); |
||||
args.add("-job"); |
||||
args.add(jobConfigFilePath); |
||||
args.add("-chunjunDistDir"); |
||||
args.add(CHUNJUN_DIST_DIR); |
||||
|
||||
if (!"local".equalsIgnoreCase(getExecMode(chunJunParameters))) { |
||||
args.add("-flinkConfDir"); |
||||
args.add(ChunJunConstants.FLINK_CONF_DIR); |
||||
|
||||
args.add("-flinkLibDir"); |
||||
args.add(ChunJunConstants.FLINK_LIB_DIR); |
||||
|
||||
args.add("-hadoopConfDir"); |
||||
args.add(ChunJunConstants.HADOOP_CONF_DIR); |
||||
} |
||||
|
||||
if (chunJunParameters.getOthers() != null) { |
||||
args.add(chunJunParameters.getOthers()); |
||||
} |
||||
|
||||
String command = String.join(" ", args); |
||||
|
||||
// replace placeholder
|
||||
String chunjunCommand = ParameterUtils.convertParameterPlaceholders(command, ParamUtils.convert(paramsMap)); |
||||
|
||||
logger.info("raw script : {}", chunjunCommand); |
||||
|
||||
// create shell command file
|
||||
Set<PosixFilePermission> perms = PosixFilePermissions.fromString(RWXR_XR_X); |
||||
FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms); |
||||
|
||||
if (SystemUtils.IS_OS_WINDOWS) { |
||||
Files.createFile(path); |
||||
} else { |
||||
Files.createFile(path, attr); |
||||
} |
||||
|
||||
Files.write(path, chunjunCommand.getBytes(), StandardOpenOption.APPEND); |
||||
|
||||
return fileName; |
||||
} |
||||
|
||||
public String getExecMode(ChunJunParameters chunJunParameters) { |
||||
if (chunJunParameters.getDeployMode() == null) { |
||||
return "local"; |
||||
} |
||||
return chunJunParameters.getDeployMode(); |
||||
} |
||||
|
||||
/** |
||||
* get task parameters |
||||
* |
||||
* @return AbstractParameters |
||||
*/ |
||||
@Override |
||||
public AbstractParameters getParameters() { |
||||
return chunJunParameters; |
||||
} |
||||
|
||||
/** |
||||
* cancel ChunJun process |
||||
* |
||||
* @param cancelApplication cancelApplication |
||||
* @throws Exception if error throws Exception |
||||
*/ |
||||
@Override |
||||
public void cancelApplication(boolean cancelApplication) throws Exception { |
||||
// cancel process
|
||||
shellCommandExecutor.cancelApplication(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,52 @@
|
||||
/* |
||||
* 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.dolphinscheduler.plugin.task.chunjun; |
||||
|
||||
import org.apache.dolphinscheduler.plugin.task.api.AbstractTask; |
||||
import org.apache.dolphinscheduler.plugin.task.api.TaskChannel; |
||||
import org.apache.dolphinscheduler.plugin.task.api.TaskExecutionContext; |
||||
import org.apache.dolphinscheduler.plugin.task.api.parameters.AbstractParameters; |
||||
import org.apache.dolphinscheduler.plugin.task.api.parameters.ParametersNode; |
||||
import org.apache.dolphinscheduler.plugin.task.api.parameters.resource.ResourceParametersHelper; |
||||
import org.apache.dolphinscheduler.spi.utils.JSONUtils; |
||||
|
||||
/** |
||||
* chunjun task channel |
||||
*/ |
||||
public class ChunJunTaskChannel implements TaskChannel { |
||||
|
||||
@Override |
||||
public void cancelApplication(boolean status) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public AbstractTask createTask(TaskExecutionContext taskExecutionContext) { |
||||
return new ChunJunTask(taskExecutionContext); |
||||
} |
||||
|
||||
@Override |
||||
public AbstractParameters parseParameters(ParametersNode parametersNode) { |
||||
return JSONUtils.parseObject(parametersNode.getTaskParams(), ChunJunParameters.class); |
||||
} |
||||
|
||||
@Override |
||||
public ResourceParametersHelper getResources(String parameters) { |
||||
return JSONUtils.parseObject(parameters, ChunJunParameters.class).getResources(); |
||||
} |
||||
} |
@ -0,0 +1,59 @@
|
||||
/* |
||||
* 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.dolphinscheduler.plugin.task.chunjun; |
||||
|
||||
import org.apache.dolphinscheduler.plugin.task.api.TaskChannel; |
||||
import org.apache.dolphinscheduler.plugin.task.api.TaskChannelFactory; |
||||
import org.apache.dolphinscheduler.spi.params.base.PluginParams; |
||||
|
||||
import java.util.List; |
||||
|
||||
import com.google.auto.service.AutoService; |
||||
|
||||
/** |
||||
* chunjun task channelFactory |
||||
*/ |
||||
@AutoService(TaskChannelFactory.class) |
||||
public class ChunJunTaskChannelFactory implements TaskChannelFactory { |
||||
|
||||
@Override |
||||
public TaskChannel create() { |
||||
return new ChunJunTaskChannel(); |
||||
} |
||||
|
||||
/** |
||||
* plugin name |
||||
* Must be UNIQUE . |
||||
* |
||||
* @return this task plugin name |
||||
*/ |
||||
@Override |
||||
public String getName() { |
||||
return "CHUNJUN"; |
||||
} |
||||
|
||||
/** |
||||
* Returns the configurable parameters that this plugin needs to display on the web ui |
||||
* |
||||
* @return this plugin params |
||||
*/ |
||||
@Override |
||||
public List<PluginParams> getParams() { |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,62 @@
|
||||
/* |
||||
* 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.dolphinscheduler.plugin.task.chunjun; |
||||
|
||||
import org.apache.dolphinscheduler.spi.enums.DbType; |
||||
|
||||
import java.io.Serializable; |
||||
|
||||
import lombok.Data; |
||||
|
||||
/** |
||||
* chunjun taskExecutionContext |
||||
*/ |
||||
@Data |
||||
public class ChunJunTaskExecutionContext implements Serializable { |
||||
|
||||
/** |
||||
* dataSourceId |
||||
*/ |
||||
private int dataSourceId; |
||||
|
||||
/** |
||||
* sourcetype |
||||
*/ |
||||
private DbType sourcetype; |
||||
|
||||
/** |
||||
* sourceConnectionParams |
||||
*/ |
||||
private String sourceConnectionParams; |
||||
|
||||
/** |
||||
* dataTargetId |
||||
*/ |
||||
private int dataTargetId; |
||||
|
||||
/** |
||||
* targetType |
||||
*/ |
||||
private DbType targetType; |
||||
|
||||
/** |
||||
* targetConnectionParams |
||||
*/ |
||||
private String targetConnectionParams; |
||||
|
||||
} |
@ -0,0 +1,46 @@
|
||||
/* |
||||
* 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.dolphinscheduler.plugin.task.chunjun; |
||||
|
||||
import org.junit.Assert; |
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
|
||||
public class ChunJunConstantsTest { |
||||
|
||||
private String flinkConfDir; |
||||
|
||||
private String flinkLibDir; |
||||
|
||||
private String hadoopConfDir; |
||||
|
||||
@Before |
||||
public void setUp() { |
||||
flinkConfDir = "${FLINK_HOME}/conf"; |
||||
flinkLibDir = "${FLINK_HOME}/lib"; |
||||
hadoopConfDir = "${HADOOP_HOME}/etc/hadoop"; |
||||
} |
||||
|
||||
@Test |
||||
public void testEqualsString() { |
||||
Assert.assertEquals(ChunJunConstants.FLINK_CONF_DIR, flinkConfDir); |
||||
Assert.assertEquals(ChunJunConstants.FLINK_LIB_DIR, flinkLibDir); |
||||
Assert.assertEquals(ChunJunConstants.HADOOP_CONF_DIR, hadoopConfDir); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,78 @@
|
||||
/* |
||||
* 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.dolphinscheduler.plugin.task.chunjun; |
||||
|
||||
import org.junit.Assert; |
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
|
||||
public class ChunJunParametersTest { |
||||
|
||||
private ChunJunParameters chunJunParameters = new ChunJunParameters(); |
||||
|
||||
@Before |
||||
public void setUp() { |
||||
chunJunParameters.setCustomConfig(0); |
||||
chunJunParameters.setDataSource(1); |
||||
chunJunParameters.setDataTarget(1); |
||||
chunJunParameters.setDsType("MYSQL"); |
||||
chunJunParameters.setDtType("MYSQL"); |
||||
chunJunParameters.setJobSpeedByte(1); |
||||
chunJunParameters.setJobSpeedRecord(1); |
||||
chunJunParameters.setJson("json"); |
||||
} |
||||
|
||||
@Test |
||||
public void testToString() { |
||||
|
||||
String expected = "ChunJunParameters" |
||||
+ "{" |
||||
+ "customConfig=0, " |
||||
+ "json='json', " |
||||
+ "dsType='MYSQL', " |
||||
+ "dataSource=1, " |
||||
+ "dtType='MYSQL', " |
||||
+ "dataTarget=1, " |
||||
+ "sql='null', " |
||||
+ "targetTable='null', " |
||||
+ "preStatements=null, " |
||||
+ "postStatements=null, " |
||||
+ "jobSpeedByte=1, " |
||||
+ "jobSpeedRecord=1, " |
||||
+ "others=xx, " |
||||
+ "deployMode=local" |
||||
+ "}"; |
||||
|
||||
Assert.assertNotEquals(expected, chunJunParameters.toString()); |
||||
} |
||||
|
||||
@Test |
||||
public void testCheckParameters() { |
||||
Assert.assertFalse(chunJunParameters.checkParameters()); |
||||
} |
||||
|
||||
@Test |
||||
public void testGetResourceFilesList() { |
||||
Assert.assertNotNull(chunJunParameters.getResourceFilesList()); |
||||
} |
||||
|
||||
@Test |
||||
public void testGetResources() { |
||||
Assert.assertNotNull(chunJunParameters.getResources()); |
||||
} |
||||
} |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 2.2 KiB |
@ -0,0 +1,49 @@
|
||||
/* |
||||
* 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. |
||||
*/ |
||||
import { useI18n } from 'vue-i18n' |
||||
import type { IJsonItem } from '../types' |
||||
|
||||
export function useChunjunDeployMode(span = 24): IJsonItem { |
||||
const { t } = useI18n() |
||||
|
||||
return { |
||||
type: 'radio', |
||||
field: 'deployMode', |
||||
name: t('project.node.deploy_mode'), |
||||
options: DEPLOY_MODES, |
||||
span |
||||
} |
||||
} |
||||
|
||||
export const DEPLOY_MODES = [ |
||||
{ |
||||
label: 'local', |
||||
value: 'local' |
||||
}, |
||||
{ |
||||
label: 'standlone', |
||||
value: 'standlone' |
||||
}, |
||||
{ |
||||
label: 'yarn-session', |
||||
value: 'yarn-session' |
||||
}, |
||||
{ |
||||
label: 'yarn-per-job', |
||||
value: 'yarn-per-job' |
||||
} |
||||
] |
@ -0,0 +1,124 @@
|
||||
/* |
||||
* 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. |
||||
*/ |
||||
import { ref, onMounted, watch } from 'vue' |
||||
import { useI18n } from 'vue-i18n' |
||||
import type { IJsonItem } from '../types' |
||||
import { useChunjunDeployMode } from './' |
||||
|
||||
export function useChunjun(model: { [field: string]: any }): IJsonItem[] { |
||||
const { t } = useI18n() |
||||
|
||||
const jsonEditorSpan = ref(0) |
||||
const customParameterSpan = ref(0) |
||||
|
||||
const initConstants = () => { |
||||
if (model.customConfig) { |
||||
jsonEditorSpan.value = 24 |
||||
customParameterSpan.value = 24 |
||||
} else { |
||||
jsonEditorSpan.value = 0 |
||||
customParameterSpan.value = 0 |
||||
} |
||||
} |
||||
|
||||
onMounted(() => { |
||||
initConstants() |
||||
}) |
||||
|
||||
watch( |
||||
() => model.customConfig, |
||||
() => { |
||||
initConstants() |
||||
} |
||||
) |
||||
|
||||
return [ |
||||
{ |
||||
type: 'switch', |
||||
field: 'customConfig', |
||||
value: true, |
||||
name: t('project.node.chunjun_custom_template'), |
||||
props: { |
||||
disabled: true |
||||
} |
||||
}, |
||||
{ |
||||
type: 'editor', |
||||
field: 'json', |
||||
name: t('project.node.chunjun_json_template'), |
||||
span: jsonEditorSpan, |
||||
validate: { |
||||
trigger: ['input', 'trigger'], |
||||
required: true, |
||||
message: t('project.node.sql_empty_tips') |
||||
} |
||||
}, |
||||
{ |
||||
type: 'custom-parameters', |
||||
field: 'localParams', |
||||
name: t('project.node.custom_parameters'), |
||||
span: customParameterSpan, |
||||
children: [ |
||||
{ |
||||
type: 'input', |
||||
field: 'prop', |
||||
span: 10, |
||||
props: { |
||||
placeholder: t('project.node.prop_tips'), |
||||
maxLength: 256 |
||||
}, |
||||
validate: { |
||||
trigger: ['input', 'blur'], |
||||
required: true, |
||||
validator(validate: any, value: string) { |
||||
if (!value) { |
||||
return new Error(t('project.node.prop_tips')) |
||||
} |
||||
|
||||
const sameItems = model.localParams.filter( |
||||
(item: { prop: string }) => item.prop === value |
||||
) |
||||
|
||||
if (sameItems.length > 1) { |
||||
return new Error(t('project.node.prop_repeat')) |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
{ |
||||
type: 'input', |
||||
field: 'value', |
||||
span: 10, |
||||
props: { |
||||
placeholder: t('project.node.value_tips'), |
||||
maxLength: 256 |
||||
} |
||||
} |
||||
] |
||||
}, |
||||
useChunjunDeployMode(24), |
||||
{ |
||||
type: 'input', |
||||
field: 'others', |
||||
name: t('project.node.option_parameters'), |
||||
props: { |
||||
type: 'textarea', |
||||
placeholder: t('project.node.option_parameters_tips') |
||||
} |
||||
} |
||||
] |
||||
} |
@ -0,0 +1,86 @@
|
||||
/* |
||||
* 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. |
||||
*/ |
||||
|
||||
import { reactive } from 'vue' |
||||
import * as Fields from '../fields/index' |
||||
import type { IJsonItem, INodeData } from '../types' |
||||
import { ITaskData } from '../types' |
||||
|
||||
export function useChunjun({ |
||||
projectCode, |
||||
from = 0, |
||||
readonly, |
||||
data |
||||
}: { |
||||
projectCode: number |
||||
from?: number |
||||
readonly?: boolean |
||||
data?: ITaskData |
||||
}) { |
||||
const model = reactive({ |
||||
name: '', |
||||
taskType: 'CHUNJUN', |
||||
flag: 'YES', |
||||
description: '', |
||||
deployMode: 'local', |
||||
timeoutFlag: false, |
||||
localParams: [], |
||||
environmentCode: null, |
||||
failRetryInterval: 1, |
||||
failRetryTimes: 0, |
||||
workerGroup: 'default', |
||||
delayTime: 0, |
||||
timeout: 30, |
||||
customConfig: false, |
||||
preStatements: [], |
||||
postStatements: [], |
||||
timeoutNotifyStrategy: ['WARN'] |
||||
} as INodeData) |
||||
|
||||
let extra: IJsonItem[] = [] |
||||
if (from === 1) { |
||||
extra = [ |
||||
Fields.useTaskType(model, readonly), |
||||
Fields.useProcessName({ |
||||
model, |
||||
projectCode, |
||||
isCreate: !data?.id, |
||||
from, |
||||
processName: data?.processName |
||||
}) |
||||
] |
||||
} |
||||
|
||||
return { |
||||
json: [ |
||||
Fields.useName(from), |
||||
...extra, |
||||
Fields.useRunFlag(), |
||||
Fields.useDescription(), |
||||
Fields.useTaskPriority(), |
||||
Fields.useWorkerGroup(), |
||||
Fields.useEnvironmentName(model, !model.id), |
||||
...Fields.useTaskGroup(model, projectCode), |
||||
...Fields.useFailed(), |
||||
Fields.useDelayTime(model), |
||||
...Fields.useTimeoutAlarm(model), |
||||
...Fields.useChunjun(model), |
||||
Fields.usePreTasks() |
||||
] as IJsonItem[], |
||||
model |
||||
} |
||||
} |
Loading…
Reference in new issue