编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Dolphin Scheduler:从 Shell 工作流说到代码解析任务间的依赖关系

wxchong 2024-09-12 22:01:54 开源技术 7 ℃ 0 评论

Apache Dolphin Scheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。

我们在 《手把手教你源码安装 Dolphin Scheduler 作业调度系统》一文中已经介绍了如何通过源码编译,搭建一个 DS 环境。本文通过创建一个有任务依赖的工作流,介绍 DS 的基本使用方法;在文章的最后,通过一段调试好的 Java 代码,介绍如何通过代码调用,解析工作流的依赖关系,为 Dolphin Scheduler 集成到其它系统(如:数据资产管理平台)作准备。本文的目录结构如下:

  1. Dolphin Scheduler 预热工作
  2. 工作流介绍
  3. Shell 任务介绍
  4. 任务依赖说明
  5. 运行工作流
  6. 调用 Java 代码,解析任务依赖关系


Dolphin Scheduler 预热工作

在浏览器中,输入 http://localhost:12345/dolphinscheduler/ui/home ,登录到 DS 首页。


1.创建租户

依次点击 安全中心 -> 租户管理 -> 创建租户,创建一个名为 dolphin 的租户。

注意:这个租户名要与操作系统上的用户名一致,是执行 DS 任务的代理。




2.创建 token

依次点击 安全中心 -> 令牌管理 -> 创建令牌,为 admin 的用户创建一个 token,该 token 在代码调用的时候用作认证,在本文第 6 部分会介绍如何使用。

注意:如果创建了其他用户,可以为其他用户分别创建 token,通过 token 可以识别通过代码调用的用户身份。




3.创建项目

依次点击 项目管理 -> 创建项目 ,创建一个名为 ds-demo-proj 的项目。





工作流介绍

点击进入 ds-demo-proj 这个项目,选择 工作流定义 -> 创建工作流





这里已经创建了一个名为 shell-process 的工作流,点击进入该工作流界面。 shell-process 包含了 4 个 shell 任务。其中,shell-3 依赖于 shell-1 shell-2shell-4 依赖于 shell-2






Shell 任务介绍

下面通过介绍 4 个 shell 任务来介绍 shell 任务以及 DS 参数的使用方法。

1.shell-1:Shell 任务的基本使用

从左侧任务模板中,选择 SHELL 类型的任务,拖动到工作流定义主界面中,点击打开 SHELL 任务的定义界面。




将“节点名称”设置为 shell-1。将界面往下拉,在“脚本”中,输入 shell 代码:

echo "dt = ${dt}"
echo "param_key = ${param_key}"

其中,dt 是工作流的全局变量,作用于当前工作流的全部任务,在工作流启动前进行设置,在本文第 5 部分还会提到。param_key 是当前 shell 任务的参数,在“自定义参数”部分进行设置。

“自定义参数”有 INOUT 两种类型,其中 IN 类型的参数给当前 SHELL 任务使用,OUT 类型的参数传递给下游任务使用。这里我们设置一个名为 param_key,类型为 IN,参数值类型为 VARCHAR 的参数,参数值为:I am param value ;设置一个名为 shell-1-ret,类型为 OUT 的参数,参数值类型为 INTEGER 的参数,参数值为:1





2.shell-2:DS 内置日期时间参数使用

定义好 shell-1 之后,紧接着定义 shell-2,来试用 DS 内置时间参数,这些参数可以让用户能够在 ETL 任务中,指定数据时间。DS 内置的日期时间参数包括:

echo "后 N 周:" $[yyyyMMdd+7*7]

echo "前 N 周:" $[yyyyMMdd-7*7]

echo "后 N 天:" $[yyyyMMdd+7]

echo "前 N 天:" $[yyyyMMdd-7*7]

echo "后 N 小时:" $[HHmmss+7/24]

echo "前 N 小时:" $[HHmmss-7/24]

echo "后 N 分钟:" $[HHmmss+7/24/60]

echo "前 N 分钟:" $[HHmmss-7/24/60]

注意:DS 的内置日期时间参数不局限于 Shell 任务使用,其它任务也可以使用。

参照 shell-1 ,为 shell-2 设置一个名为 shell-2-ret,类型为 OUT 的参数,参数值类型为 INTEGER 的参数,参数值为:2





3.shell-3:Shell 任务之间传参

在前面的 shell-1shell-2 任务中,我们都定义了类型为 OUT 的参数,现在通过 shell-3,来说明如何使用前置任务传递的参数。

我们在 shell-1shell-2 中分别定义了名为 shell-1-retshell-2-ret 的参数,在 shell-3 中,通过 ${shell-1-ret}${shell-2-ret} 直接使用,代码如下:

echo "dt = ${dt}"

echo "${shell-1-ret} + ${shell-2-ret}"

let "ret = ${shell-1-ret} + ${shell-2-ret}"

echo "ret = ${ret}"

echo "Finish calculating."


4.shell-4:依赖于 shell-2


任务依赖说明

通过前面章节的设置,我们得到了一个任务间有依赖关系的工作流。shell-3 依赖于 shell-1 shell-2shell-4 依赖于 shell-2 。除了在 Shell 任务的定义时,通过“前置任务”的设置任务之间的依赖关系,也可以在工作流定义界面中,通过拖拉连线的方式,设置任务之间的依赖关系。






运行工作流

我们已经定义好了工作流,接下来就可以执行这个工作流了。在“工作流定义”界面中,选择要执行的工作流,先上线,后运行,如下图所示。

点击 运行 之后,会弹出一个“启动前请先设置参数”的界面,用于设置本次工作流运行的参数。其中,“启动参数”中,设置名为:dt,值为:$[yyyy-MM-dd-1] 的参数,作为当前工作流的全局变量(在 shell-1 中用到了这个变量)。$[yyyy-MM-dd-1] 是一个 DS 内置参数,表示作业运行时间的前一天。有了这个全局变量,工作流中的所有任务可以直接使用,不需要在每个任务中重复定义了。

点击“确定”,工作流运行之后,就能在“工作流实例”中看到本次运行的实例。

注意:工作流每次运行,都会生成一个新的工作流实例,该实例保存着当时运行任务代码和依赖关系,工作流变更之后,重跑实例,使用的还是当时运行的任务代码和依赖关系,而不是变更后的任务代码和依赖关系。

任务执行完成之后,可以在“任务实例”中看到本次执行的结果和日志信息。

shell-3 的任务日志为例,可以看到:shell-3 中,来自 shell-1shell-2 中传参已经接收到了,并且在 shell-3 中计算逻辑中使用。


调用 Java 代码,解析任务依赖关系

在实际工作中(如:系统集成),我们期望通过代码(而非界面)的调用方式,解析工作流中的依赖关系。Dolphin Scheduler 提供了这个 Open API。下面就通过一段代码来进行演示:如何解析工作流内部的任务之间的依赖关系。


1.准备好一个 Maven 项目,在 pom.xml 中引入 okhttp

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.14.9</version>
</dependency>


2.编写 Java 代码

调用 /dolphinscheduler/projects/{projectCode}/process-definition/{code}/view-tree 接口,传入参数如下:

  • url:http://localhost:12345/dolphinscheduler/projects/6923345731264/process-definition/6927517117632/view-tree?limit=25
  • method:GET
  • token:6dec7b185e5df8e26a5c56cb82ffa0cb

注意:token 是本文第 1 部分中创建得到的;url 中的projectCode和code 分别表示项目代码和工作流代码,将会在下一篇文章中介绍如何获取(也可以打开 Chrome 浏览器的“开发者工具”,点击工作流时,在“Network”中获取)。

package com.james.dolphinscheduler;

import okhttp3.*;
import org.json.JSONObject;

import java.io.IOException;

public class ProcessDefinitionParser {
    public static void main(String[] args) throws IOException {
        OkHttpClient client = new OkHttpClient().newBuilder()
                .build();
        MediaType mediaType = MediaType.parse("text/plain");
        RequestBody body = null;
        Request request = new Request.Builder()
                .url("http://localhost:12345/dolphinscheduler/projects/6923345731264/process-definition/6927517117632/view-tree?limit=25")
                .method("GET", body)
                .addHeader("token", "6dec7b185e5df8e26a5c56cb82ffa0cb")
                .build();
        Response response = client.newCall(request).execute();
        JSONObject jsonObject = new JSONObject(response.body().string());
        System.out.println(jsonObject.toString());
    }
}

查看工作流内部任务依赖关系的Java代码


3.运行代码,查看响应信息

上面的代码运行成功之后,得到以下响应信息:

{
  "code": 0,
  "msg": "success",
  "data": {
    "name": "DAG",
    "type": "",
    "code": 0,
    "instances": [],
    "children": [
      {
        "name": "shell-2-build-in-param-shell",
        "type": "SHELL",
        "code": 6931585814176,
        "instances": [],
        "children": [
          {
            "name": "shell-4",
            "type": "SHELL",
            "code": 6931989010976,
            "instances": [],
            "children": []
          },
          {
            "name": "shell-3-calculate-sum-of-shell-1-and-shell-2",
            "type": "SHELL",
            "code": 6931736929568,
            "instances": [],
            "children": []
          }
        ]
      },
      {
        "name": "shell-1",
        "type": "SHELL",
        "code": 6927501338176,
        "instances": [],
        "children": [
          {
            "name": "shell-3-calculate-sum-of-shell-1-and-shell-2",
            "type": "SHELL",
            "code": 6931736929568,
            "instances": [],
            "children": []
          }
        ]
      }
    ]
  },
  "success": true,
  "failed": false
}

依赖关系响应 json

通过解析这段 json,我们可以得到这样的信息:

shell-2 有 2 个子任务,分别是 shell-3 shell-4

shell-1 有 1 个子任务,是 shell-3

也就是下面这张图的依赖关系与我们在第4部分中定义的依赖关系一致。



参考文档:

https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/guide/task/shell.html

https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/guide/parameter/built-in.html

https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/guide/open-api.html

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表