You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by ca...@apache.org on 2022/01/09 08:10:12 UTC
[dolphinscheduler] branch 2.0.3-prepare updated: [Cherry-pick-2.0.3] 20220107 (#7871)
This is an automated email from the ASF dual-hosted git repository.
caishunfeng pushed a commit to branch 2.0.3-prepare
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/2.0.3-prepare by this push:
new be86eaf [Cherry-pick-2.0.3] 20220107 (#7871)
be86eaf is described below
commit be86eaf357d9da20a0eac3822ae73873bbfc87d9
Author: xiangzihao <46...@qq.com>
AuthorDate: Sun Jan 9 16:10:06 2022 +0800
[Cherry-pick-2.0.3] 20220107 (#7871)
* cherry-pick
* fix bug_7629 (#7630)
* fix bug_7564 (#7625)
* fix bug_7512 (#7716)
* [Fix-7459][Sqoop] running error in parallel (#7752)
* fix bug_7459
* fix bug_7459
* fix bug_7459
* fix bug_7459
* fix bug_7459
Co-authored-by: SbloodyS <sb...@qq.com>
* [Feature-7576][Master] Optimize complement task's date (#7585)
* feature_7576
* feature_7576
* feature 7576
* feature 7576
* [Fix-7767]Task instance is not deleted while deleting the process instance (#7768)
* fix bug_7767
* fix bug_7767
* fix bug_7767
* fix bug_7767
* fix bug_7767
* [Feature-5951][Improvement][UI] When creating an alarm instance, the alarm instance name input box prompts optimization (#7770)
* cherry-pick
* [Fix-7773][Api] malform batchDeleteProcessInstanceByIds log output (#7774)
* bug_7773
* bug_7773
* bug_7773
* bug_7773
* bug_7773
* [Feature-7777][UI] process definition page add create username (#7778)
* feature_7777
* fix bug_7499 (#7739)
Co-authored-by: SbloodyS <sb...@qq.com>
* fix conflict
* fix conflict
* fix mapState never used error
* fix bug_7789 (#7790)
Co-authored-by: SbloodyS <sb...@qq.com>
Co-authored-by: SbloodyS <sb...@qq.com>
Co-authored-by: wangyizhi <wa...@cmss.chinamobile.com>
---
.../api/controller/ExecutorController.java | 104 ++++++++++++++++++++-
.../apache/dolphinscheduler/api/enums/Status.java | 3 +-
.../api/service/impl/ExecutorServiceImpl.java | 43 +++++++--
.../service/impl/ProcessDefinitionServiceImpl.java | 2 +-
.../service/impl/ProcessInstanceServiceImpl.java | 5 +-
.../src/main/resources/i18n/messages.properties | 5 +-
.../main/resources/i18n/messages_en_US.properties | 4 +-
.../main/resources/i18n/messages_zh_CN.properties | 1 +
.../api/service/ExecutorServiceTest.java | 37 ++++++--
.../dolphinscheduler/dao/upgrade/ResourceDao.java | 3 +-
.../service/process/ProcessService.java | 19 ++++
.../service/quartz/cron/CronUtils.java | 4 +-
.../generator/targets/HiveTargetGenerator.java | 6 ++
.../parameter/targets/TargetHiveParameter.java | 12 +++
.../src/js/conf/home/pages/dag/_source/dag.vue | 2 +-
.../_source/formModel/_source/dependentTimeout.vue | 83 ++++++++++------
.../dag/_source/formModel/_source/selectInput.vue | 4 +-
.../formModel/tasks/_source/dependItemList.vue | 36 +++++--
.../dag/_source/formModel/tasks/dependent.vue | 41 +++++++-
.../pages/dag/_source/formModel/tasks/sqoop.vue | 13 +++
.../pages/list/_source/createDataSource.vue | 2 +-
.../pages/definition/pages/list/_source/list.vue | 1 +
.../_source/createWarningInstance.vue | 4 +-
.../src/js/module/i18n/locale/en_US.js | 2 +
.../src/js/module/i18n/locale/zh_CN.js | 2 +
script/dolphinscheduler-daemon.sh | 2 +-
26 files changed, 364 insertions(+), 76 deletions(-)
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ExecutorController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ExecutorController.java
index b131909..4df65a9 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ExecutorController.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ExecutorController.java
@@ -23,6 +23,7 @@ import static org.apache.dolphinscheduler.api.enums.Status.START_PROCESS_INSTANC
import org.apache.dolphinscheduler.api.aspect.AccessLogAnnotation;
import org.apache.dolphinscheduler.api.enums.ExecuteType;
+import org.apache.dolphinscheduler.api.enums.Status;
import org.apache.dolphinscheduler.api.exceptions.ApiException;
import org.apache.dolphinscheduler.api.service.ExecutorService;
import org.apache.dolphinscheduler.api.utils.Result;
@@ -36,8 +37,6 @@ import org.apache.dolphinscheduler.common.enums.WarningType;
import org.apache.dolphinscheduler.common.utils.JSONUtils;
import org.apache.dolphinscheduler.dao.entity.User;
-import java.util.Map;
-
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PathVariable;
@@ -55,6 +54,13 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import springfox.documentation.annotations.ApiIgnore;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
/**
* executor controller
*/
@@ -139,6 +145,100 @@ public class ExecutorController extends BaseController {
}
/**
+ * batch execute process instance
+ * If any processDefinitionCode cannot be found, the failure information is returned and the status is set to
+ * failed. The successful task will run normally and will not stop
+ *
+ * @param loginUser login user
+ * @param projectCode project code
+ * @param processDefinitionCodes process definition codes
+ * @param scheduleTime schedule time
+ * @param failureStrategy failure strategy
+ * @param startNodeList start nodes list
+ * @param taskDependType task depend type
+ * @param execType execute type
+ * @param warningType warning type
+ * @param warningGroupId warning group id
+ * @param runMode run mode
+ * @param processInstancePriority process instance priority
+ * @param workerGroup worker group
+ * @param timeout timeout
+ * @param expectedParallelismNumber the expected parallelism number when execute complement in parallel mode
+ * @return start process result code
+ */
+ @ApiOperation(value = "batchStartProcessInstance", notes = "BATCH_RUN_PROCESS_INSTANCE_NOTES")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "processDefinitionCodes", value = "PROCESS_DEFINITION_CODES", required = true, dataType = "String", example = "1,2,3"),
+ @ApiImplicitParam(name = "scheduleTime", value = "SCHEDULE_TIME", required = true, dataType = "String"),
+ @ApiImplicitParam(name = "failureStrategy", value = "FAILURE_STRATEGY", required = true, dataType = "FailureStrategy"),
+ @ApiImplicitParam(name = "startNodeList", value = "START_NODE_LIST", dataType = "String"),
+ @ApiImplicitParam(name = "taskDependType", value = "TASK_DEPEND_TYPE", dataType = "TaskDependType"),
+ @ApiImplicitParam(name = "execType", value = "COMMAND_TYPE", dataType = "CommandType"),
+ @ApiImplicitParam(name = "warningType", value = "WARNING_TYPE", required = true, dataType = "WarningType"),
+ @ApiImplicitParam(name = "warningGroupId", value = "WARNING_GROUP_ID", required = true, dataType = "Int", example = "100"),
+ @ApiImplicitParam(name = "runMode", value = "RUN_MODE", dataType = "RunMode"),
+ @ApiImplicitParam(name = "processInstancePriority", value = "PROCESS_INSTANCE_PRIORITY", required = true, dataType = "Priority"),
+ @ApiImplicitParam(name = "workerGroup", value = "WORKER_GROUP", dataType = "String", example = "default"),
+ @ApiImplicitParam(name = "environmentCode", value = "ENVIRONMENT_CODE", dataType = "Long", example = "-1"),
+ @ApiImplicitParam(name = "timeout", value = "TIMEOUT", dataType = "Int", example = "100"),
+ @ApiImplicitParam(name = "expectedParallelismNumber", value = "EXPECTED_PARALLELISM_NUMBER", dataType = "Int", example = "8")
+ })
+ @PostMapping(value = "batch-start-process-instance")
+ @ResponseStatus(HttpStatus.OK)
+ @ApiException(START_PROCESS_INSTANCE_ERROR)
+ @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
+ public Result batchStartProcessInstance(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+ @ApiParam(name = "projectCode", value = "PROJECT_CODE", required = true) @PathVariable long projectCode,
+ @RequestParam(value = "processDefinitionCodes") String processDefinitionCodes,
+ @RequestParam(value = "scheduleTime", required = false) String scheduleTime,
+ @RequestParam(value = "failureStrategy", required = true) FailureStrategy failureStrategy,
+ @RequestParam(value = "startNodeList", required = false) String startNodeList,
+ @RequestParam(value = "taskDependType", required = false) TaskDependType taskDependType,
+ @RequestParam(value = "execType", required = false) CommandType execType,
+ @RequestParam(value = "warningType", required = true) WarningType warningType,
+ @RequestParam(value = "warningGroupId", required = false) int warningGroupId,
+ @RequestParam(value = "runMode", required = false) RunMode runMode,
+ @RequestParam(value = "processInstancePriority", required = false) Priority processInstancePriority,
+ @RequestParam(value = "workerGroup", required = false, defaultValue = "default") String workerGroup,
+ @RequestParam(value = "environmentCode", required = false, defaultValue = "-1") Long environmentCode,
+ @RequestParam(value = "timeout", required = false) Integer timeout,
+ @RequestParam(value = "startParams", required = false) String startParams,
+ @RequestParam(value = "expectedParallelismNumber", required = false) Integer expectedParallelismNumber,
+ @RequestParam(value = "dryRun", defaultValue = "0", required = false) int dryRun) {
+
+ if (timeout == null) {
+ timeout = Constants.MAX_TASK_TIMEOUT;
+ }
+
+ Map<String, String> startParamMap = null;
+ if (startParams != null) {
+ startParamMap = JSONUtils.toMap(startParams);
+ }
+
+ Map<String, Object> result = new HashMap<>();
+ List<String> processDefinitionCodeArray = Arrays.asList(processDefinitionCodes.split(Constants.COMMA));
+ List<String> startFailedProcessDefinitionCodeList = new ArrayList<>();
+
+ processDefinitionCodeArray = processDefinitionCodeArray.stream().distinct().collect(Collectors.toList());
+
+ for (String strProcessDefinitionCode : processDefinitionCodeArray) {
+ long processDefinitionCode = Long.parseLong(strProcessDefinitionCode);
+ result = execService.execProcessInstance(loginUser, projectCode, processDefinitionCode, scheduleTime, execType, failureStrategy,
+ startNodeList, taskDependType, warningType, warningGroupId, runMode, processInstancePriority, workerGroup, environmentCode, timeout, startParamMap, expectedParallelismNumber, dryRun);
+
+ if (!Status.SUCCESS.equals(result.get(Constants.STATUS))) {
+ startFailedProcessDefinitionCodeList.add(String.valueOf(processDefinitionCode));
+ }
+ }
+
+ if (!startFailedProcessDefinitionCodeList.isEmpty()) {
+ putMsg(result, Status.BATCH_START_PROCESS_INSTANCE_ERROR, String.join(Constants.COMMA, startFailedProcessDefinitionCodeList));
+ }
+
+ return returnDataList(result);
+ }
+
+ /**
* do action to process instance:pause, stop, repeat, recover from pause, recover from stop
*
* @param loginUser login user
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
index 413a328..824d0d8 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
@@ -166,7 +166,7 @@ public enum Status {
NAME_EXIST(10135, "name {0} already exists", "名称[{0}]已存在"),
SAVE_ERROR(10136, "save error", "保存错误"),
DELETE_PROJECT_ERROR_DEFINES_NOT_NULL(10137, "please delete the process definitions in project first!", "请先删除全部工作流定义"),
- BATCH_DELETE_PROCESS_INSTANCE_BY_IDS_ERROR(10117, "batch delete process instance by ids {0} error", "批量删除工作流实例错误"),
+ BATCH_DELETE_PROCESS_INSTANCE_BY_IDS_ERROR(10117, "batch delete process instance by ids {0} error", "批量删除工作流实例错误: {0}"),
PREVIEW_SCHEDULE_ERROR(10139, "preview schedule error", "预览调度配置错误"),
PARSE_TO_CRON_EXPRESSION_ERROR(10140, "parse cron to cron expression error", "解析调度表达式错误"),
SCHEDULE_START_TIME_END_TIME_SAME(10141, "The start time must not be the same as the end", "开始时间不能和结束时间一样"),
@@ -250,6 +250,7 @@ public enum Status {
COUNT_PROCESS_INSTANCE_STATE_ERROR(50012, "count process instance state error", "查询各状态流程实例数错误"),
COUNT_PROCESS_DEFINITION_USER_ERROR(50013, "count process definition user error", "查询各用户流程定义数错误"),
START_PROCESS_INSTANCE_ERROR(50014, "start process instance error", "运行工作流实例错误"),
+ BATCH_START_PROCESS_INSTANCE_ERROR(50014, "batch start process instance error: {0}", "批量运行工作流实例错误: {0}"),
EXECUTE_PROCESS_INSTANCE_ERROR(50015, "execute process instance error", "操作工作流实例错误"),
CHECK_PROCESS_DEFINITION_ERROR(50016, "check process definition error", "工作流定义错误"),
QUERY_RECIPIENTS_AND_COPYERS_BY_PROCESS_DEFINITION_ERROR(50017, "query recipients and copyers by process definition error", "查询收件人和抄送人错误"),
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
index 18eba02..1b4cee8 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
@@ -571,6 +571,10 @@ public class ExecutorServiceImpl extends BaseServiceImpl implements ExecutorServ
Map<String, String> cmdParam = JSONUtils.toMap(command.getCommandParam());
switch (runMode) {
case RUN_MODE_SERIAL: {
+ if (start.after(end)) {
+ logger.warn("The startDate {} is later than the endDate {}", start, end);
+ break;
+ }
cmdParam.put(CMDPARAM_COMPLEMENT_DATA_START_DATE, DateUtils.dateToString(start));
cmdParam.put(CMDPARAM_COMPLEMENT_DATA_END_DATE, DateUtils.dateToString(end));
command.setCommandParam(JSONUtils.toJsonString(cmdParam));
@@ -578,26 +582,45 @@ public class ExecutorServiceImpl extends BaseServiceImpl implements ExecutorServ
break;
}
case RUN_MODE_PARALLEL: {
+ if (start.after(end)) {
+ logger.warn("The startDate {} is later than the endDate {}", start, end);
+ break;
+ }
+
LinkedList<Date> listDate = new LinkedList<>();
List<Schedule> schedules = processService.queryReleaseSchedulerListByProcessDefinitionCode(command.getProcessDefinitionCode());
listDate.addAll(CronUtils.getSelfFireDateList(start, end, schedules));
+ int listDateSize = listDate.size();
createCount = listDate.size();
if (!CollectionUtils.isEmpty(listDate)) {
if (expectedParallelismNumber != null && expectedParallelismNumber != 0) {
createCount = Math.min(listDate.size(), expectedParallelismNumber);
+ if (listDateSize < createCount) {
+ createCount = listDateSize;
+ }
}
logger.info("In parallel mode, current expectedParallelismNumber:{}", createCount);
- listDate.addLast(end);
- int chunkSize = listDate.size() / createCount;
-
- for (int i = 0; i < createCount; i++) {
- int rangeStart = i == 0 ? i : (i * chunkSize);
- int rangeEnd = i == createCount - 1 ? listDate.size() - 1
- : rangeStart + chunkSize;
-
- cmdParam.put(CMDPARAM_COMPLEMENT_DATA_START_DATE, DateUtils.dateToString(listDate.get(rangeStart)));
- cmdParam.put(CMDPARAM_COMPLEMENT_DATA_END_DATE, DateUtils.dateToString(listDate.get(rangeEnd)));
+ // Distribute the number of tasks equally to each command.
+ // The last command with insufficient quantity will be assigned to the remaining tasks.
+ int itemsPerCommand = (listDateSize / createCount);
+ int remainingItems = (listDateSize % createCount);
+ int startDateIndex = 0;
+ int endDateIndex = 0;
+
+ for (int i = 1; i <= createCount; i++) {
+ int extra = (i <= remainingItems) ? 1 : 0;
+ int singleCommandItems = (itemsPerCommand + extra);
+
+ if (i == 1) {
+ endDateIndex += singleCommandItems - 1;
+ } else {
+ startDateIndex = endDateIndex + 1;
+ endDateIndex += singleCommandItems;
+ }
+
+ cmdParam.put(CMDPARAM_COMPLEMENT_DATA_START_DATE, DateUtils.dateToString(listDate.get(startDateIndex)));
+ cmdParam.put(CMDPARAM_COMPLEMENT_DATA_END_DATE, DateUtils.dateToString(listDate.get(endDateIndex)));
command.setCommandParam(JSONUtils.toJsonString(cmdParam));
processService.createCommand(command);
}
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
index 9cfb9f9..ee53c16 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
@@ -377,7 +377,7 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
processDefinitionNode.put("id", processDefinition.getId());
processDefinitionNode.put("code", processDefinition.getCode());
processDefinitionNode.put("name", processDefinition.getName());
- processDefinitionNode.put("projectCode", processDefinition.getCode());
+ processDefinitionNode.put("projectCode", processDefinition.getProjectCode());
arrayNode.add(processDefinitionNode);
}
result.put(Constants.DATA_LIST, arrayNode);
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessInstanceServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessInstanceServiceImpl.java
index 2b98e14..bec9fd8 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessInstanceServiceImpl.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessInstanceServiceImpl.java
@@ -629,13 +629,13 @@ public class ProcessInstanceServiceImpl extends BaseServiceImpl implements Proce
}
ProcessInstance processInstance = processService.findProcessInstanceDetailById(processInstanceId);
if (null == processInstance) {
- putMsg(result, Status.PROCESS_INSTANCE_NOT_EXIST, processInstanceId);
+ putMsg(result, Status.PROCESS_INSTANCE_NOT_EXIST, String.valueOf(processInstanceId));
return result;
}
ProcessDefinition processDefinition = processDefineMapper.queryByCode(processInstance.getProcessDefinitionCode());
if (processDefinition != null && projectCode != processDefinition.getProjectCode()) {
- putMsg(result, Status.PROCESS_INSTANCE_NOT_EXIST, processInstanceId);
+ putMsg(result, Status.PROCESS_INSTANCE_NOT_EXIST, String.valueOf(processInstanceId));
return result;
}
@@ -649,6 +649,7 @@ public class ProcessInstanceServiceImpl extends BaseServiceImpl implements Proce
processService.deleteAllSubWorkProcessByParentId(processInstanceId);
processService.deleteWorkProcessMapByParentId(processInstanceId);
+ processService.deleteWorkTaskInstanceByProcessInstanceId(processInstanceId);
if (delete > 0) {
putMsg(result, Status.SUCCESS);
diff --git a/dolphinscheduler-api/src/main/resources/i18n/messages.properties b/dolphinscheduler-api/src/main/resources/i18n/messages.properties
index 7a4282a..928e608 100644
--- a/dolphinscheduler-api/src/main/resources/i18n/messages.properties
+++ b/dolphinscheduler-api/src/main/resources/i18n/messages.properties
@@ -18,13 +18,14 @@
QUERY_SCHEDULE_LIST_NOTES=query schedule list
EXECUTE_PROCESS_TAG=execute process related operation
PROCESS_INSTANCE_EXECUTOR_TAG=process instance executor related operation
-RUN_PROCESS_INSTANCE_NOTES=run process instance
+RUN_PROCESS_INSTANCE_NOTES=run process instance
+BATCH_RUN_PROCESS_INSTANCE_NOTES=batch run process instance
START_NODE_LIST=start node list(node name)
TASK_DEPEND_TYPE=task depend type
COMMAND_TYPE=command type
RUN_MODE=run mode
TIMEOUT=timeout
-EXECUTE_ACTION_TO_PROCESS_INSTANCE_NOTES=execute action to process instance
+EXECUTE_ACTION_TO_PROCESS_INSTANCE_NOTES=execute action to process instance
EXECUTE_TYPE=execute type
START_CHECK_PROCESS_DEFINITION_NOTES=start check process definition
GET_RECEIVER_CC_NOTES=query receiver cc
diff --git a/dolphinscheduler-api/src/main/resources/i18n/messages_en_US.properties b/dolphinscheduler-api/src/main/resources/i18n/messages_en_US.properties
index 19dc343..7e9a7e6 100644
--- a/dolphinscheduler-api/src/main/resources/i18n/messages_en_US.properties
+++ b/dolphinscheduler-api/src/main/resources/i18n/messages_en_US.properties
@@ -17,7 +17,9 @@
QUERY_SCHEDULE_LIST_NOTES=query schedule list
EXECUTE_PROCESS_TAG=execute process related operation
PROCESS_INSTANCE_EXECUTOR_TAG=process instance executor related operation
-RUN_PROCESS_INSTANCE_NOTES=run process instance
+RUN_PROCESS_INSTANCE_NOTES=run process instance
+BATCH_RUN_PROCESS_INSTANCE_NOTES=batch run process instance(If any processDefinitionCode cannot be found, the failure\
+ \ information is returned and the status is set to failed. The successful task will run normally and will not stop)
START_NODE_LIST=start node list(node name)
TASK_DEPEND_TYPE=task depend type
COMMAND_TYPE=command type
diff --git a/dolphinscheduler-api/src/main/resources/i18n/messages_zh_CN.properties b/dolphinscheduler-api/src/main/resources/i18n/messages_zh_CN.properties
index a0f1b8d..d5df6cd 100644
--- a/dolphinscheduler-api/src/main/resources/i18n/messages_zh_CN.properties
+++ b/dolphinscheduler-api/src/main/resources/i18n/messages_zh_CN.properties
@@ -19,6 +19,7 @@ PROCESS_INSTANCE_EXECUTOR_TAG=流程实例执行相关操作
UI_PLUGINS_TAG=UI插件相关操作
WORK_FLOW_LINEAGE_TAG=工作流血缘相关操作
RUN_PROCESS_INSTANCE_NOTES=运行流程实例
+BATCH_RUN_PROCESS_INSTANCE_NOTES=批量运行流程实例(其中有任意一个processDefinitionCode找不到,则返回失败信息并且状态置为失败,成功的任务会正常运行,不会停止)
START_NODE_LIST=开始节点列表(节点name)
TASK_DEPEND_TYPE=任务依赖类型
COMMAND_TYPE=指令类型
diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ExecutorServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ExecutorServiceTest.java
index da942fb..90fb173 100644
--- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ExecutorServiceTest.java
+++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ExecutorServiceTest.java
@@ -17,6 +17,8 @@
package org.apache.dolphinscheduler.api.service;
+import static org.apache.dolphinscheduler.common.Constants.CMDPARAM_COMPLEMENT_DATA_END_DATE;
+import static org.apache.dolphinscheduler.common.Constants.CMDPARAM_COMPLEMENT_DATA_START_DATE;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -32,6 +34,8 @@ import org.apache.dolphinscheduler.common.enums.Priority;
import org.apache.dolphinscheduler.common.enums.ReleaseState;
import org.apache.dolphinscheduler.common.enums.RunMode;
import org.apache.dolphinscheduler.common.model.Server;
+import org.apache.dolphinscheduler.common.utils.DateUtils;
+import org.apache.dolphinscheduler.common.utils.JSONUtils;
import org.apache.dolphinscheduler.dao.entity.Command;
import org.apache.dolphinscheduler.dao.entity.ProcessDefinition;
import org.apache.dolphinscheduler.dao.entity.ProcessInstance;
@@ -340,22 +344,35 @@ public class ExecutorServiceTest {
listDate.add(1);
listDate.add(2);
listDate.add(3);
+ listDate.add(4);
+ int listDateSize = listDate.size();
int createCount = Math.min(listDate.size(), expectedParallelismNumber);
logger.info("In parallel mode, current expectedParallelismNumber:{}", createCount);
- listDate.addLast(4);
- int chunkSize = listDate.size() / createCount;
- for (int i = 0; i < createCount; i++) {
- int rangeStart = i == 0 ? i : (i * chunkSize);
- int rangeEnd = i == createCount - 1 ? listDate.size() - 1 : rangeStart + chunkSize;
- logger.info("rangeStart:{}, rangeEnd:{}",rangeStart, rangeEnd);
- result.add(listDate.get(rangeStart) + "," + listDate.get(rangeEnd));
+ int itemsPerCommand = (listDateSize / createCount);
+ int remainingItems = (listDateSize % createCount);
+ int startDateIndex = 0;
+ int endDateIndex = 0;
+
+ for (int i = 1; i <= createCount; i++) {
+ int extra = (i <= remainingItems) ? 1 : 0;
+ int singleCommandItems = (itemsPerCommand + extra);
+
+ if (i == 1) {
+ endDateIndex += singleCommandItems - 1;
+ } else {
+ startDateIndex = endDateIndex + 1;
+ endDateIndex += singleCommandItems;
+ }
+
+ logger.info("startDate:{}, endDate:{}", listDate.get(startDateIndex), listDate.get(endDateIndex));
+ result.add(listDate.get(startDateIndex) + "," + listDate.get(endDateIndex));
}
Assert.assertEquals("0,1", result.get(0));
- Assert.assertEquals("1,2", result.get(1));
- Assert.assertEquals("2,4", result.get(2));
-
+ Assert.assertEquals("2,3", result.get(1));
+ Assert.assertEquals("4,4", result.get(2));
}
+
}
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/upgrade/ResourceDao.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/upgrade/ResourceDao.java
index c9ff149..49c0e80 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/upgrade/ResourceDao.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/upgrade/ResourceDao.java
@@ -18,7 +18,6 @@
package org.apache.dolphinscheduler.dao.upgrade;
import org.apache.dolphinscheduler.common.utils.ConnectionUtils;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -32,7 +31,7 @@ import java.util.Map;
* resource dao
*/
public class ResourceDao {
- public static final Logger logger = LoggerFactory.getLogger(ProcessDefinitionDao.class);
+ public static final Logger logger = LoggerFactory.getLogger(ResourceDao.class);
/**
* list all resources
diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
index 72abed7..8215ed3 100644
--- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
+++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
@@ -452,6 +452,25 @@ public class ProcessService {
}
/**
+ * recursive delete all task instance by process instance id
+ * @param processInstanceId
+ */
+ public void deleteWorkTaskInstanceByProcessInstanceId(int processInstanceId) {
+ List<TaskInstance> taskInstanceList = findValidTaskListByProcessId(processInstanceId);
+ if (CollectionUtils.isEmpty(taskInstanceList)) {
+ return;
+ }
+
+ List<Integer> taskInstanceIdList = new ArrayList<>();
+
+ for (TaskInstance taskInstance : taskInstanceList) {
+ taskInstanceIdList.add(taskInstance.getId());
+ }
+
+ taskInstanceMapper.deleteBatchIds(taskInstanceIdList);
+ }
+
+ /**
* recursive query sub process definition id by parent id.
*
* @param parentCode parentCode
diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtils.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtils.java
index 3e7007a..d784722 100644
--- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtils.java
+++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtils.java
@@ -191,9 +191,9 @@ public class CronUtils {
return result;
}
- // support left closed and right open time interval (startDate <= N < endDate)
+ // support left closed and right closed time interval (startDate <= N <= endDate)
Date from = new Date(startTime.getTime() - Constants.SECOND_TIME_MILLIS);
- Date to = new Date(endTime.getTime() - Constants.SECOND_TIME_MILLIS);
+ Date to = new Date(endTime.getTime() + Constants.SECOND_TIME_MILLIS);
List<Schedule> listSchedule = new ArrayList<>();
listSchedule.addAll(schedules);
diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/generator/targets/HiveTargetGenerator.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/generator/targets/HiveTargetGenerator.java
index 05ba68f..5e768f3 100644
--- a/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/generator/targets/HiveTargetGenerator.java
+++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/generator/targets/HiveTargetGenerator.java
@@ -27,6 +27,7 @@ import static org.apache.dolphinscheduler.plugin.task.sqoop.SqoopConstants.HIVE_
import static org.apache.dolphinscheduler.plugin.task.sqoop.SqoopConstants.HIVE_PARTITION_KEY;
import static org.apache.dolphinscheduler.plugin.task.sqoop.SqoopConstants.HIVE_PARTITION_VALUE;
import static org.apache.dolphinscheduler.plugin.task.sqoop.SqoopConstants.HIVE_TABLE;
+import static org.apache.dolphinscheduler.plugin.task.sqoop.SqoopConstants.TARGET_DIR;
import static org.apache.dolphinscheduler.spi.task.TaskConstants.SPACE;
import org.apache.dolphinscheduler.plugin.task.sqoop.generator.ITargetGenerator;
@@ -91,6 +92,11 @@ public class HiveTargetGenerator implements ITargetGenerator {
.append(SPACE).append(targetHiveParameter.getHivePartitionValue());
}
+ if (StringUtils.isNotEmpty(targetHiveParameter.getHiveTargetDir())) {
+ hiveTargetSb.append(SPACE).append(TARGET_DIR)
+ .append(SPACE).append(targetHiveParameter.getHiveTargetDir());
+ }
+
}
} catch (Exception e) {
logger.error(String.format("Sqoop hive target params build failed: [%s]", e.getMessage()));
diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/parameter/targets/TargetHiveParameter.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/parameter/targets/TargetHiveParameter.java
index 7358de7..9f2579f 100644
--- a/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/parameter/targets/TargetHiveParameter.java
+++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/parameter/targets/TargetHiveParameter.java
@@ -54,6 +54,10 @@ public class TargetHiveParameter {
* hive partition value
*/
private String hivePartitionValue;
+ /**
+ * hive target dir
+ */
+ private String hiveTargetDir;
public String getHiveDatabase() {
return hiveDatabase;
@@ -118,4 +122,12 @@ public class TargetHiveParameter {
public void setHivePartitionValue(String hivePartitionValue) {
this.hivePartitionValue = hivePartitionValue;
}
+
+ public String getHiveTargetDir() {
+ return hiveTargetDir;
+ }
+
+ public void setHiveTargetDir(String hiveTargetDir) {
+ this.hiveTargetDir = hiveTargetDir;
+ }
}
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue
index 1489020..6072908 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue
@@ -529,7 +529,7 @@
this.$router.push({
name: 'task-instance',
query: {
- processInstanceId: this.$route.params.code,
+ processInstanceId: this.instanceId,
taskName: taskName
}
})
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/dependentTimeout.vue b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/dependentTimeout.vue
index 8d8f13c..d4cd8ef 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/dependentTimeout.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/dependentTimeout.vue
@@ -28,6 +28,7 @@
</label>
</div>
</div>
+
<div class="clearfix list" v-if="enable">
<div class="text-box">
<span>{{$t('Waiting Dependent start')}}</span>
@@ -40,25 +41,44 @@
</label>
</div>
</div>
+
+ <div class="clearfix list" v-if="enable && waitStartTimeout.enable">
+ <div class="text-box">
+ <span>{{$t('Timeout period')}}</span>
+ </div>
+ <div class="cont-box">
+ <label class="label-box">
+ <div style="padding-top: 2px;">
+ <el-input v-model="waitStartTimeout.interval" size="small" style="width: 100px;" :disabled="isDetails" maxlength="9">
+ <span slot="append">{{$t('Minute')}}</span>
+ </el-input>
+ </div>
+ </label>
+ </div>
+ </div>
+
+ <div class="clearfix list" v-if="enable && waitStartTimeout.enable">
+ <div class="text-box">
+ <span>{{$t('Check interval')}}</span>
+ </div>
+ <div class="cont-box">
+ <label class="label-box">
+ <div style="padding-top: 2px;">
+ <el-input v-model="waitStartTimeout.checkInterval" size="small" style="width: 100px;" :disabled="isDetails" maxlength="9">
+ <span slot="append">{{$t('Minute')}}</span>
+ </el-input>
+ </div>
+ </label>
+ </div>
+ </div>
+
<div class="clearfix list" v-if="enable && waitStartTimeout.enable">
+ <div class="text-box">
+ <span>{{$t('Timeout strategy')}}</span>
+ </div>
<div class="cont-box">
<label class="label-box">
- <span class="text-box">
- <span>{{$t('Timeout period')}}</span>
- </span>
- <el-input v-model="waitStartTimeout.interval" size="small" style="width: 100px;" :disabled="isDetails" maxlength="9">
- <span slot="append">{{$t('Minute')}}</span>
- </el-input>
- <span class="text-box">
- <span>{{$t('Check interval')}}</span>
- </span>
- <el-input v-model="waitStartTimeout.checkInterval" size="small" style="width: 100px;" :disabled="isDetails" maxlength="9">
- <span slot="append">{{$t('Minute')}}</span>
- </el-input>
- <span class="text-box">
- <span>{{$t('Timeout strategy')}}</span>
- </span>
- <div style="padding-top: 6px;">
+ <div style="padding-top: 5px;">
<el-checkbox-group size="small" v-model="waitStartTimeout.strategy">
<el-checkbox label="FAILED" :disabled="true">{{$t('Timeout failure')}}</el-checkbox>
</el-checkbox-group>
@@ -66,6 +86,7 @@
</label>
</div>
</div>
+
<div class="clearfix list" v-if="enable">
<div class="text-box">
<span>{{$t('Waiting Dependent complete')}}</span>
@@ -78,19 +99,29 @@
</label>
</div>
</div>
+
+ <div class="clearfix list" v-if="enable && waitCompleteTimeout.enable">
+ <div class="text-box">
+ <span>{{$t('Timeout period')}}</span>
+ </div>
+ <div class="cont-box">
+ <label class="label-box">
+ <div style="padding-top: 2px;">
+ <el-input v-model="waitCompleteTimeout.interval" size="small" style="width: 100px;" :disabled="isDetails" maxlength="9">
+ <span slot="append">{{$t('Minute')}}</span>
+ </el-input>
+ </div>
+ </label>
+ </div>
+ </div>
+
<div class="clearfix list" v-if="enable && waitCompleteTimeout.enable">
+ <div class="text-box">
+ <span>{{$t('Timeout strategy')}}</span>
+ </div>
<div class="cont-box">
<label class="label-box">
- <span class="text-box">
- <span>{{$t('Timeout period')}}</span>
- </span>
- <el-input v-model="waitCompleteTimeout.interval" size="small" style="width: 100px;" :disabled="isDetails" maxlength="9">
- <span slot="append">{{$t('Minute')}}</span>
- </el-input>
- <span class="text-box">
- <span>{{$t('Timeout strategy')}}</span>
- </span>
- <div style="padding-top: 6px;">
+ <div style="padding-top: 5px;">
<el-checkbox-group size="small" v-model="waitCompleteTimeout.strategy">
<el-checkbox label="WARN" :disabled="isDetails">{{$t('Timeout alarm')}}</el-checkbox>
<el-checkbox label="FAILED" :disabled="isDetails">{{$t('Timeout failure')}}</el-checkbox>
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/selectInput.vue b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/selectInput.vue
index 160db6e..ae8d18e 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/selectInput.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/selectInput.vue
@@ -20,7 +20,9 @@
:disabled="isDetails"
size="small"
@change="_onChange"
- v-model="selectedValue">
+ v-model="selectedValue"
+ filterable
+ allow-create>
<el-input
ref="input"
slot="trigger"
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/dependItemList.vue b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/dependItemList.vue
index 883b13a..643bac8 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/dependItemList.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/dependItemList.vue
@@ -76,7 +76,8 @@
props: {
dependItemList: Array,
index: Number,
- dependTaskList: Array
+ dependTaskList: Array,
+ projectDefinitionsCache: Object
},
model: {
prop: 'dependItemList',
@@ -136,6 +137,9 @@
})
},
_getProcessByProjectCode (code) {
+ if (this.projectDefinitionsCache[code]) {
+ return Promise.resolve(this.projectDefinitionsCache[code])
+ }
return new Promise((resolve, reject) => {
this.store.dispatch('dag/getProcessByProjectCode', code).then(res => {
let definitionList = _.map(_.cloneDeep(res), v => {
@@ -144,6 +148,10 @@
label: v.processDefinition.name
}
})
+ this.$emit('addProjectDefinitionsCache', {
+ projectCode: code,
+ definitionList
+ })
resolve(definitionList)
})
})
@@ -281,16 +289,26 @@
}
})
} else {
- // get definitionCode codes
- let codes = _.map(this.dependItemList, v => v.definitionCode).join(',')
- // get item list
- this._getDependItemList(codes, false).then(res => {
- _.map(this.dependItemList, (v, i) => {
- this._getProcessByProjectCode(v.projectCode).then(definitionList => {
- this.$set(this.dependItemList, i, this._rtOldParams(v.definitionCode, definitionList, [_.cloneDeep(DEP_ALL_TASK)].concat(_.map(res[v.definitionCode] || [], v => ({ code: v.code, name: v.name }))), v))
+ // Get uniq definitionCodes and projectCodes
+ const definitionCodes = _.uniq(this.dependItemList.map(dep => dep.definitionCode)).join(',')
+
+ // Query all tasks by definitionCodes, definitionCodes can cross projects
+ this._getDependItemList(definitionCodes, false)
+ .then(definitionTasks => {
+ _.map(this.dependItemList, (dep, i) => {
+ const definitionList = this.projectDefinitionsCache[dep.projectCode]
+ const depTasksList = (definitionTasks[dep.definitionCode] || [])
+ .map(task => ({ code: task.code, name: task.name }))
+ .concat(_.cloneDeep(DEP_ALL_TASK))
+
+ this.$set(this.dependItemList, i, this._rtOldParams(
+ dep.definitionCode,
+ definitionList,
+ depTasksList,
+ dep
+ ))
})
})
- })
}
})
},
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/dependent.vue b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/dependent.vue
index b69568b..1e52a55 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/dependent.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/dependent.vue
@@ -27,7 +27,7 @@
<em v-if="isLoading" class="el-icon-loading as as-spin" data-toggle="tooltip" :title="$t('Add')"></em>
</a>
</div>
- <div class="dep-box">
+ <div class="dep-box" v-if="cacheReady">
<span
class="dep-relation"
@click="!isDetails && _setGlobalRelation()"
@@ -49,9 +49,11 @@
</em>
<m-depend-item-list
:dependTaskList='dependTaskList'
+ :projectDefinitionsCache='projectDefinitionsCache'
v-model="el.dependItemList"
@on-delete-all="_onDeleteAll"
@getDependTaskList="getDependTaskList"
+ @addProjectDefinitionsCache="addProjectDefinitionsCache"
:index="$index">
</m-depend-item-list>
</div>
@@ -65,6 +67,7 @@
import mListBox from './_source/listBox'
import mDependItemList from './_source/dependItemList'
import disabledState from '@/module/mixin/disabledState'
+ import { mapActions } from 'vuex'
export default {
name: 'dependent',
@@ -72,7 +75,10 @@
return {
relation: 'AND',
dependTaskList: [],
- isLoading: false
+ isLoading: false,
+ // Reduce repeated requests
+ projectDefinitionsCache: {},
+ cacheReady: false
}
},
mixins: [disabledState],
@@ -80,6 +86,7 @@
backfillItem: Object
},
methods: {
+ ...mapActions('dag', ['getProcessByProjectCode']),
_addDep () {
if (!this.isLoading) {
this.isLoading = true
@@ -124,6 +131,25 @@
})
})
return true
+ },
+ _getProcessByProjectCode (code) {
+ return new Promise((resolve, reject) => {
+ this.getProcessByProjectCode(code).then(res => {
+ let definitionList = _.map(_.cloneDeep(res), v => {
+ return {
+ value: v.processDefinition.code,
+ label: v.processDefinition.name
+ }
+ })
+ resolve({
+ definitionList,
+ projectCode: code
+ })
+ })
+ })
+ },
+ addProjectDefinitionsCache ({ projectCode, definitionList }) {
+ this.projectDefinitionsCache[projectCode] = definitionList
}
},
watch: {
@@ -150,6 +176,17 @@
_.map(this.dependTaskList, v => _.map(v.dependItemList, v1 => {
v1.state = dependentResult[`${v1.definitionId}-${v1.depTaskCode}-${v1.cycle}-${v1.dateValue}`] || defaultState
}))
+ // cache project definitions
+ const projectCodes = _.uniq(_.flatten(this.dependTaskList.map(dep => dep.dependItemList.map(item => item.projectCode))))
+ Promise.all(projectCodes.map(projectCode => this._getProcessByProjectCode(projectCode))).then((arr) => {
+ arr.forEach((item) => {
+ const { projectCode, definitionList } = item
+ this.projectDefinitionsCache[projectCode] = definitionList
+ })
+ this.cacheReady = true
+ })
+ } else {
+ this.cacheReady = true
}
},
mounted () {
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sqoop.vue b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sqoop.vue
index 60cd5ec..8b2fe21 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sqoop.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sqoop.vue
@@ -326,6 +326,18 @@
</div>
</m-list-box>
<m-list-box>
+ <div slot="text">{{$t('Hive Target Dir')}}</div>
+ <div slot="content">
+ <el-input
+ :disabled="isDetails"
+ type="text"
+ size="small"
+ v-model="targetHiveParams.hiveTargetDir"
+ :placeholder="$t('Please enter hive target dir')">
+ </el-input>
+ </div>
+ </m-list-box>
+ <m-list-box>
<div slot="text">{{$t('ReplaceDelimiter')}}</div>
<div slot="content">
<el-input
@@ -691,6 +703,7 @@
dropDelimiter: false,
hiveOverWrite: true,
replaceDelimiter: '',
+ hiveTargetDir: '',
hivePartitionKey: '',
hivePartitionValue: ''
},
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/datasource/pages/list/_source/createDataSource.vue b/dolphinscheduler-ui/src/js/conf/home/pages/datasource/pages/list/_source/createDataSource.vue
index 603db39..a725474 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/datasource/pages/list/_source/createDataSource.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/datasource/pages/list/_source/createDataSource.vue
@@ -56,7 +56,7 @@
<el-input
type="input"
v-model="host"
- maxlength="60"
+ maxlength="255"
size="small"
:placeholder="$t('Please enter IP')">
</el-input>
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/list.vue b/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/list.vue
index 4c9980f..2887adb 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/list.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/list.vue
@@ -52,6 +52,7 @@
<span>{{scope.row.description | filterNull}}</span>
</template>
</el-table-column>
+ <el-table-column prop="userName" :label="$t('Create User')"></el-table-column>
<el-table-column prop="modifyBy" :label="$t('Modify User')"></el-table-column>
<el-table-column :label="$t('Timing state')">
<template slot-scope="scope">
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/security/pages/warningInstance/_source/createWarningInstance.vue b/dolphinscheduler-ui/src/js/conf/home/pages/security/pages/warningInstance/_source/createWarningInstance.vue
index 101b5ad..0d6a882 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/security/pages/warningInstance/_source/createWarningInstance.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/security/pages/warningInstance/_source/createWarningInstance.vue
@@ -30,7 +30,7 @@
v-model="instanceName"
maxlength="60"
size="small"
- :placeholder="$t('Please enter group name')">
+ :placeholder="$t('Please enter alarm plugin instance name')">
</el-input>
</template>
</m-list-box-f>
@@ -108,7 +108,7 @@
_verification () {
// group name
if (!this.instanceName.replace(/\s*/g, '')) {
- this.$message.warning(`${i18n.$t('Please enter group name')}`)
+ this.$message.warning(`${i18n.$t('Please enter alarm plugin instance name')}`)
return false
}
if (!this.pluginDefineId) {
diff --git a/dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js b/dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js
index 7f3c654..e7abaf6 100755
--- a/dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js
+++ b/dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js
@@ -238,6 +238,7 @@ export default {
'Instance parameter exception': 'Instance parameter exception',
'Group Type': 'Group Type',
'Alarm plugin instance': 'Alarm plugin instance',
+ 'Please enter alarm plugin instance name': 'Please enter alarm plugin instance name',
'Select Alarm plugin instance': 'Please select an Alarm plugin instance',
Remarks: 'Remarks',
SMS: 'SMS',
@@ -606,6 +607,7 @@ export default {
'Please enter Export Dir(required)': 'Please enter Export Dir(required)',
'Please enter Hive Database(required)': 'Please enter Hive Databasec(required)',
'Please enter Hive Table(required)': 'Please enter Hive Table(required)',
+ 'Please enter hive target dir': 'Please enter hive target dir',
'Please enter Hive Partition Keys': 'Please enter Hive Partition Key',
'Please enter Hive Partition Values': 'Please enter Partition Value',
'Please enter Replace Delimiter': 'Please enter Replace Delimiter',
diff --git a/dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js b/dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js
index eabcb64..70a71f1 100644
--- a/dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js
+++ b/dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js
@@ -237,6 +237,7 @@ export default {
'Instance parameter exception': '实例参数异常',
'Group Type': '组类型',
'Alarm plugin instance': '告警插件实例',
+ 'Please enter alarm plugin instance name': '请输入告警实例名称',
'Select Alarm plugin instance': '请选择告警插件实例',
Remarks: '备注',
SMS: '短信',
@@ -605,6 +606,7 @@ export default {
'Please enter Export Dir(required)': '请输入数据源路径(必填)',
'Please enter Hive Database(required)': '请输入Hive数据库(必填)',
'Please enter Hive Table(required)': '请输入Hive表名(必填)',
+ 'Please enter hive target dir': '请输入Hive临时目录',
'Please enter Hive Partition Keys': '请输入分区键',
'Please enter Hive Partition Values': '请输入分区值',
'Please enter Replace Delimiter': '请输入替换分隔符',
diff --git a/script/dolphinscheduler-daemon.sh b/script/dolphinscheduler-daemon.sh
index b8a1c16..c4db5e9 100755
--- a/script/dolphinscheduler-daemon.sh
+++ b/script/dolphinscheduler-daemon.sh
@@ -152,7 +152,7 @@ case $startStop in
(status)
# more details about the status can be added later
- serverCount=`ps -ef |grep "$CLASS" |grep -v "grep" |wc -l`
+ serverCount=`ps -ef | grep "$DOLPHINSCHEDULER_HOME" | grep "$CLASS" | grep -v "grep" | wc -l`
state="STOP"
# font color - red
state="[ \033[1;31m $state \033[0m ]"