springboot项目集成大数据第三方dolphinscheduler调度器 执行/停止任务

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: springboot项目集成大数据第三方dolphinscheduler调度器 执行/停止任务

image.png
dolphinscheduler调度器接入注意事项等信息可参考我的上一篇博客进行了解,地址在这里 ->
@[TOC]

一、功能清单

image.png

二、执行/停止任务

说明:
大数据平台执行可拖拽spark任务实际实行的是dolphinscheduler调度器中项目下工作流下的某一节点而已,不是执行整个工作流。

共用的依赖

<!--httpclient-->
<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>

共用配置文件

dolphinscheduler.token=xxx
dolphinscheduler.address=http://IP:12345

共用代码

@Autowired
private RestTemplate restTemplate;
@Value("${dolphinscheduler.token}")
String token;
@Value("${dolphinscheduler.address}")
String address;
public static final int ZERO = 0;
public static final int SUCCESS = 200;
@Autowired
private DragSparkTaskService dragSparkTaskService;
@Value("${spark.main.class}")
String mainClass;
public static final String CREATE = "create";
public static final String UPDATE = "update";
public static final String ADD = "add";
public static final String DELETE = "delete";
public static final String ONLINE = "ONLINE";
public static final String OFFLINE = "OFFLINE";
public static final int ONE_THOUSAND_AND_FIVE_HUNDRED = 1500;
public static final int SIX = 6;
public static final int EIGHTY = 80;
public static final int THREE = 3;
@Autowired
private StringRedisTemplate redisTemplate;
@Value("${drag.task.state}")
String dragTaskState;
@Autowired
private DragSparkTaskMapper dragSparkTaskMapper;

1.执行任务

image.png

代码:

/**
     * 运行流程实例
     * @param projectName 项目名称
     * @param request request
     * @param dragSparkTaskId 任务ID
     * @author liudz
     * @date 2021/5/7
     * @return 执行结果
     **/
    @GetMapping("/project/process/start")
    public DolphinschedulerResponse startProcessInstance(
            @RequestParam("projectName") String projectName, @RequestParam("dragSparkTaskId") Integer dragSparkTaskId,
            HttpServletRequest request) {
   
        try {
   
            Long userId = Long.valueOf(request.getUserPrincipal().getName());
            DolphinschedulerResponse processInfoList = getUserProcess(projectName);
            if (processInfoList.getCode() != ZERO) {
   
                return processInfoList;
            }
            JSONObject processJson = new JSONObject();
            log.info("--(1)getUserProcess--success:{}", processInfoList);
            List<Map<String, Object>> list = (List<Map<String, Object>>) processInfoList.getData();
            for (Map<String, Object> map : list) {
   
                if (map.get("name").equals(userId + "-dragSparkTask")) {
   
                    processJson.fluentPutAll(map);
                }
            }
            if (processJson.getString(DictionaryEnum.RELEASE_STATE.getFiledString()).equals(OFFLINE)) {
   
                releaseProcessDefinition(projectName, userId + "-dragSparkTask",
                        processJson.getInteger("id"), 1);
                log.info("--(2)releaseProcessDefinition--ONLINE--success");
            }
            String postURL = address + "/dolphinscheduler/projects/" + URLEncoder.encode(projectName, "utf-8")
                   + "/executors/start-process-instance";
            PostMethod postMethod = new PostMethod(postURL);
            postMethod.setRequestHeader("Content-Type",
                    "application/x-www-form-urlencoded;charset=utf-8");
            postMethod.setRequestHeader("token", token);
            // 参数设置,需要注意的就是里边不能传NULL,要传空字符串
            NameValuePair[] data = packageNameValuePair(processJson, dragSparkTaskId);
            postMethod.setRequestBody(data);
            org.apache.commons.httpclient.HttpClient httpClient = new org.apache.commons.httpclient.HttpClient();
            httpClient.executeMethod(postMethod);
            JSONObject result = JSONObject.parseObject(postMethod.getResponseBodyAsString());
            log.info("--(2)startProcessInstance--result:{}", result);
            if (!result.get(DictionaryEnum.CODE.getFiledString()).equals(ZERO)) {
   
                return DolphinschedulerResponse.error(result.getInteger("code"), result.getString("msg"));
            }
            redisTemplate.opsForValue().set(dragTaskState + dragSparkTaskId, "1", 1, TimeUnit.HOURS);
            DragSparkTask drag = new DragSparkTask();
            drag.setId(Long.valueOf(dragSparkTaskId));
            drag.setState("1");
            drag.setCreateId(userId);
            dragSparkTaskMapper.updateDragSparkTask(drag);
            log.info("--(3)----updateDragSparkTask--success!");
        } catch (Exception e) {
   
            log.info("请求异常:{}", e);
        }
        return DolphinschedulerResponse.success();
    }
/**
     *  packageNameValuePair封装参数
     * @param processJson 工作流json
     * @param dragSparkTaskId 任务ID
     * @author liudz
     * @date 2021/5/14
     * @return NameValuePair
     **/
    public NameValuePair[] packageNameValuePair(JSONObject processJson, Integer dragSparkTaskId) {
   
        NameValuePair[] data = {
   
                new NameValuePair("failureStrategy", "CONTINUE"),
                new NameValuePair("processDefinitionId", processJson.getString("id")),
                new NameValuePair("processInstancePriority", "MEDIUM"),
                new NameValuePair("warningGroupId", "0"),
                new NameValuePair("warningType", "NONE"),
                new NameValuePair("runMode", "RUN_MODE_SERIAL"),
                new NameValuePair("startNodeList", "spark-" + dragSparkTaskId),
                new NameValuePair("taskDependType", "TASK_POST"),
                new NameValuePair("workerGroup", "default")};
        return data;
    }
/**
     *  解析节点和线,拼接nodesArray
     * @param jsonObject 模型task
     * @author liudz
     * @date 2020/12/10
     * @return 填充后的nodesArray
     **/
    public JSONArray parseLineAndNode(JSONObject jsonObject) {
   
        JSONArray edgesArray = jsonObject.getJSONArray("edges");
        JSONArray nodesArray = jsonObject.getJSONArray("nodes");
        for (int i = 0; i < edgesArray.size(); i++) {
   
            JSONObject edgeJson = edgesArray.getJSONObject(i);
            for (int j = 0; j < nodesArray.size(); j++) {
   
                JSONObject nodeJson = nodesArray.getJSONObject(j);
                String nodeSourceId = edgeJson.getString("source");
                String nodeTargetId = edgeJson.getString("target");
if ("breakUp".equals(nodeJson.getString("modelType")) && nodeSourceId.equals(nodeJson.getString("id"))) {
   
                    double fraction = edgeJson.getJSONObject("config").getDoubleValue("fraction");
                    if (fraction > Double.parseDouble("0.5")) {
   
                        nodeJson.getJSONObject("config").put("fraction", fraction);
                    }
                    if (nodeJson.getJSONArray("firstOutputs").size() == 0) {
   
                        String[] outputsArr = JavaTools.arrayInsert(nodeJson.getJSONArray("firstOutputs").
                                toArray(new String[nodeJson.getJSONArray("firstOutputs").size()]), nodeTargetId);
                        nodeJson.put("firstOutputs", outputsArr);
                        continue;
                    } else {
   
                        String[] outputsArr = JavaTools.arrayInsert(nodeJson.getJSONArray("secondOutputs").
                                toArray(new String[nodeJson.getJSONArray("secondOutputs").size()]), nodeTargetId);
                        nodeJson.put("secondOutputs", outputsArr);
                        continue;
                    }
                } else {
   
                    if (nodeSourceId.equals(nodeJson.getString("id"))) {
   
                        String[] outputsArr = JavaTools.arrayInsert(nodeJson.getJSONArray("outputs").
                                toArray(new String[nodeJson.getJSONArray("outputs").size()]), nodeTargetId);
                        nodeJson.put("outputs", outputsArr);
                        continue;
                    }
                    if (nodeTargetId.equals(nodeJson.getString("id"))) {
   
                        String[] inputsArr = JavaTools.arrayInsert(nodeJson.getJSONArray("inputs").
                                toArray(new String[nodeJson.getJSONArray("inputs").size()]), nodeSourceId);
                        nodeJson.put("inputs", inputsArr);
                        continue;
                    }
                }
            }
        }
        for (int j = 0; j < nodesArray.size(); j++) {
   
            JSONObject nodeJson = nodesArray.getJSONObject(j);
            String label = nodeJson.getString("modelType") + "_" + nodeJson.getString("id");
            String name = nodeJson.getString("label") + "_" + nodeJson.getString("id");
            nodeJson.put("name", name);
            nodeJson.put("label", label);
        }
        return nodesArray;
    }

2.停止任务

image.png
image.png

代码:

/**
     * stopProcessSparkTask
     * @param id id
     * @param executeType executeType
     * @param projectName 项目名称
     * @return Response
     * @author: liudz
     * @author: lty update 2020/5/27
     * @date: 2020/4/28 10:31
     */
    @GetMapping(value = "/project/execute/{projectName}/{id}/{executeType}")
    public Response<String> stopProcessSparkTask(@PathVariable("projectName") String projectName,
                                 @PathVariable("id") Long id, @PathVariable("executeType") String executeType) {
   
        log.info("--(1)stopProcessSparkTask--begin--projectName:{},id:{},executeType:{}", projectName, id, executeType);
        try {
   
            HttpHeaders headers = new HttpHeaders();
            headers.set("token", token);
            headers.set("Content-Type", "application/json");
            HttpEntity requestEntity = new HttpEntity(headers);
            ResponseEntity<JSONObject> response = restTemplate.exchange(address + "/"
   + "dolphinscheduler/projects/" + projectName + "/task-instance/list-paging?"
   + "pageNo=1&pageSize=100&taskName=spark-" + id, HttpMethod.GET, requestEntity, JSONObject.class);
List<Map<String, Object>> list = (List<Map<String, Object>>) response.getBody().getJSONObject("data").get("totalList");
            Integer processInstanceId = null;
            for (Map<String, Object> map : list) {
   
                if (map.get("state").equals("RUNNING_EXEUTION")) {
   
                    processInstanceId = Integer.valueOf(map.get("processInstanceId").toString());
                }
            }
            log.info("--(2)getProcessInstanceId--success--:{}", processInstanceId);
            String postURL = address + "/dolphinscheduler/projects/"
                    + URLEncoder.encode(projectName, "utf-8") + "/executors/execute";
            PostMethod postMethod = new PostMethod(postURL);
            postMethod.setRequestHeader("Content-Type",
                    "application/x-www-form-urlencoded;charset=utf-8");
            postMethod.setRequestHeader("token", token);
            NameValuePair[] data = {
   new NameValuePair("executeType", executeType),
                    new NameValuePair("processInstanceId", processInstanceId.toString())};
            postMethod.setRequestBody(data);
            org.apache.commons.httpclient.HttpClient httpClient = new org.apache.commons.httpclient.HttpClient();
            httpClient.executeMethod(postMethod);
            JSONObject result = JSONObject.parseObject(postMethod.getResponseBodyAsString());
            if (!result.get(DictionaryEnum.CODE.getFiledString()).equals(ZERO)) {
   
                return Response.error(result.getInteger("code"), result.getString("msg"));
            }
            log.info("--(3)stopProcessSparkTask--success--:{}", result);
            redisTemplate.opsForValue().set(dragTaskState + id, "0", 1, TimeUnit.HOURS);
            DragSparkTaskVo dragSparkTaskVo = new DragSparkTaskVo();
            dragSparkTaskVo.setId(id);
            dragSparkTaskVo.setState("0");
            dragSparkTaskService.updateDragSparkTask(dragSparkTaskVo);
            log.info("--(4)updateDragSparkTask--success");
        } catch (UnsupportedEncodingException e) {
   
            log.info("UnsupportedEncodingException:{}", e);
        } catch (HttpException e) {
   
            log.info("HttpException:{}", e);
        } catch (IOException e) {
   
            log.info("IOException:{}", e);
        }
        return Response.success();
    }

三、本人相关其他文章链接

1.springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理:
https://blog.csdn.net/a924382407/article/details/117119831

2.springboot项目集成dolphinscheduler调度器 实现datax数据同步任务:
https://blog.csdn.net/a924382407/article/details/120951230

3.springboot项目集成dolphinscheduler调度器 项目管理:
https://blog.csdn.net/a924382407/article/details/117118931

4.springboot项目集成大数据第三方dolphinscheduler调度器 执行/停止任务
https://blog.csdn.net/a924382407/article/details/117121181

5.springboot项目集成大数据第三方dolphinscheduler调度器
https://blog.csdn.net/a924382407/article/details/117113848

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
2月前
|
安全 Java 数据库
SpringSecurity认证授权及项目集成
本文介绍了基于Spring Security的权限管理框架,涵盖认证、授权与鉴权核心概念,通过快速入门示例演示集成流程,并结合数据库实现用户认证。进一步扩展实现正常登录,JWT登录及鉴权管理器,实现灵活的安全控制,适用于前后端分离项目中的权限设计与实践。
256 4
|
2月前
|
资源调度 JavaScript 前端开发
在Vue 3项目中集成Element Plus组件库的步骤
总结起来,在集成过程当中我们关注于库本身提供功能与特性、环境搭建与依赖管理、模块化编程思想以及前端工程化等方面知识点;同时也涵盖前端性能优化(比如上文提及“按需加载”)与定制化开发(例如“自定义主题”)等高级话题.
244 16
|
4月前
|
JSON 分布式计算 大数据
springboot项目集成大数据第三方dolphinscheduler调度器
springboot项目集成大数据第三方dolphinscheduler调度器
267 3
|
4月前
|
Java 测试技术 Spring
简单学Spring Boot | 博客项目的测试
本内容介绍了基于Spring Boot的博客项目测试实践,重点在于通过测试驱动开发(TDD)优化服务层代码,提升代码质量和功能可靠性。案例详细展示了如何为PostService类编写测试用例、运行测试并根据反馈优化功能代码,包括两次优化过程。通过TDD流程,确保每项功能经过严格验证,增强代码可维护性与系统稳定性。
231 0
|
4月前
|
存储 Java 数据库连接
简单学Spring Boot | 博客项目的三层架构重构
本案例通过采用三层架构(数据访问层、业务逻辑层、表现层)重构项目,解决了集中式开发导致的代码臃肿问题。各层职责清晰,结合依赖注入实现解耦,提升了系统的可维护性、可测试性和可扩展性,为后续接入真实数据库奠定基础。
404 0
|
4月前
|
数据采集 消息中间件 JSON
搞大数据集成,这些基本原理你得先清楚!
企业在进行大数据集成时,常因忽视对数据本质的统一认知,导致集成失败。本文指出,大数据集成不仅是技术问题,更需明确数据本体论,建立企业级“数据通用语言”,包括核心数据对象、唯一标识及关系定义。只有在业务语义一致的基础上,结合技术实施,才能打破数据孤岛,实现数据价值。
|
4月前
|
人工智能 安全 Java
Spring Boot 中使用 Function 和异步线程池处理列表拆分任务并汇总结果
在Java开发中,处理大规模数据时常常需要将列表拆分为多个子列表进行异步处理并汇总结果。本文介绍如何在Spring Boot中使用Function和异步线程池实现高效且可维护的代码,涵盖结果封装、线程池配置、列表拆分处理及结果汇总等关键步骤。
209 0
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
12月前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
370 0
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
1127 6

相关产品

  • 云原生大数据计算服务 MaxCompute