网站首页 > 开源技术 正文
Apache Dolphin Scheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。
我们在 《手把手教你源码安装 Dolphin Scheduler 作业调度系统》一文中已经介绍了如何通过源码编译,搭建一个 DS 环境。本文通过创建一个有任务依赖的工作流,介绍 DS 的基本使用方法;在文章的最后,通过一段调试好的 Java 代码,介绍如何通过代码调用,解析工作流的依赖关系,为 Dolphin Scheduler 集成到其它系统(如:数据资产管理平台)作准备。本文的目录结构如下:
- Dolphin Scheduler 预热工作
- 工作流介绍
- Shell 任务介绍
- 任务依赖说明
- 运行工作流
- 调用 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-2,shell-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 任务的参数,在“自定义参数”部分进行设置。
“自定义参数”有 IN 和 OUT 两种类型,其中 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-1 和 shell-2 任务中,我们都定义了类型为 OUT 的参数,现在通过 shell-3,来说明如何使用前置任务传递的参数。
我们在 shell-1 和 shell-2 中分别定义了名为 shell-1-ret 和 shell-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-2;shell-4 依赖于 shell-2 。除了在 Shell 任务的定义时,通过“前置任务”的设置任务之间的依赖关系,也可以在工作流定义界面中,通过拖拉连线的方式,设置任务之间的依赖关系。
运行工作流
我们已经定义好了工作流,接下来就可以执行这个工作流了。在“工作流定义”界面中,选择要执行的工作流,先上线,后运行,如下图所示。
点击 运行 之后,会弹出一个“启动前请先设置参数”的界面,用于设置本次工作流运行的参数。其中,“启动参数”中,设置名为:dt,值为:$[yyyy-MM-dd-1] 的参数,作为当前工作流的全局变量(在 shell-1 中用到了这个变量)。$[yyyy-MM-dd-1] 是一个 DS 内置参数,表示作业运行时间的前一天。有了这个全局变量,工作流中的所有任务可以直接使用,不需要在每个任务中重复定义了。
点击“确定”,工作流运行之后,就能在“工作流实例”中看到本次运行的实例。
注意:工作流每次运行,都会生成一个新的工作流实例,该实例保存着当时运行任务代码和依赖关系,工作流变更之后,重跑实例,使用的还是当时运行的任务代码和依赖关系,而不是变更后的任务代码和依赖关系。
任务执行完成之后,可以在“任务实例”中看到本次执行的结果和日志信息。
以 shell-3 的任务日志为例,可以看到:shell-3 中,来自 shell-1 和 shell-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
猜你喜欢
- 2024-09-12 盘点 12 月份爆火的 GitHub 项目(github排行榜)
- 2024-09-12 DolphinScheduler海豚调度器删除历史日志问题
- 2024-09-12 数据质量管理(数据质量管理平台目前支持通过扫描)
- 2024-09-12 dolphin scheduler多数据库存储(hibernate多数据库支持)
- 2024-09-12 海豚DolphinScheduler系统调度操作分析
- 2024-09-12 源码解析-- 如何做到不同Task的日志输出到不同的日志文件
- 2024-09-12 运维实战:DolphinScheduler 生产环境升级
- 2024-09-12 任务调度工具(任务调度工具怎么用)
- 2024-09-12 dolphinscheduler集成数据质量任务
- 2024-09-12 源码解析--海豚调度MasterServer流程执行过程分析
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)