DolphinScheduler运维-页面加载缓慢

本文档介绍了DolphinScheduler UI页面加载缓慢的问题及其原因,主要原因是任务实例过多。为了解决这个问题,文章提出了通过设置API访问令牌,并编写Shell或Python脚本来定期清理工作流实例的解决方案,从而提高DolphinScheduler平台的UI加载速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

DolphinScheduler调度平台的UI界面加载缓慢,项目中的任务实例加载时间过长,需要解决这个问题,提高DolphinScheduler平台UI页面的加载速度。


二、原因分析

经过分析发现,任务实例过多是导致UI加载缓慢的主要原因。由于任务实例无法直接删除,根据文档了解到需要删除相应的工作流实例。删除工作流实例后,相关的任务实例和日志会自动被删除。然而,手动删除工作流实例耗时较长,因此不是一个有效的解决方案。为了提高效率,可以利用DolphinScheduler提供的API接口来实现删除操作,然后在DolphinScheduler平台上设置一个定时任务,定期清理工作流实例。可以编写Shell脚本或Python脚本来实现清理逻辑。

根据DolphinScheduler的API文档,进程实例(Process Instance)对应着UI页面中的工作流实例。因此,通过定时清理过期的进程实例,可以有效优化DolphinScheduler平台的UI加载速度。


三、解决方案

1. 设置API访问令牌

创建令牌步骤如下:

在这里插入图片描述

2. 逻辑分析

2.1 查找用于删除的API

查看DolphinScheduler的API文档,文档地址:http://localhost:12345/dolphinscheduler/swagger-ui/index.html。
找到进程实例相关操作的API,可以看到有两个进行删除操作的API,选择批量删除的接口/dolphinscheduler/projects/{projectCode}/process-instances/batch-delete来执行删除操作。
需要两个参数。

  • processInstanceIds:进程实例id的数组,用逗号分隔
  • projectCode:项目代码

在这里插入图片描述

2.2 获取进程实例id的数组

可以从/dolphinscheduler/projects/{projectCode}/process-instances接口获取进程实例的相关信息。
需要三个参数。

  • pageNo:当前页
  • pageSize:每页多少条数据
  • projectCode:项目代码
    在这里插入图片描述

2.3 获取项目代码

找到项目相关操作的API,可以使用/dolphinscheduler/projects/list获取所有项目的一个列表信息,可以根据其中的项目名获得项目代码。

3. 代码实现

此代码将会清理所有项目4个月前1号到3个月前1号的工作流实例。

3.1 shell代码实现

#!/bin/bash

# 认证令牌
token='5c7437968f5d4492dc694902d6e6847f'
# 链接
url='http://localhost:12345/dolphinscheduler'
# 每页多少条
page_size=10

# 三个月前日期时间
three_month_ago_datetime=$(date -d "-3 months" '+%Y-%m-01')
# 四个月前日期时间
four_month_ago_datetime=$(date -d "-4 months" '+%Y-%m-01')

# 获取所有项目名称
project_names=($(curl -X GET -H "token: ${token}" "${url}/projects/list" | jq -r '.data[] | "\(.name)"'))

# 循环获取项目名
for project_name in "${project_names[@]}"
do
  echo "************************** 项目名: ${project_name} **************************"
  # 根据项目名获取项目代码
  project_code=$(curl -X GET -H "token: ${token}" "${url}/projects/list" | jq -r '.data[] | select(.name == '\""$project_name"\"') | .code')
  # 总页数
  total_page=$(curl -X GET -H "accept: */*" -H "token: ${token}" "${url}/projects/${project_code}/process-instances?endDate=${three_month_ago_datetime}%2000:00:00&pageNo=1&pageSize=${page_size}&startDate=${four_month_ago_datetime}%2000:00:00" | jq -r '.data.totalPage')
  echo "************************** ${four_month_ago_datetime}~${three_month_ago_datetime} 时间的总页数: ${total_page} **************************"
  for ((page_no=1; page_no<="$total_page"; page_no++))
  do
    echo "************************** 当前页: ${page_no} **************************"
    # 根据项目代码、日期和页码等获取进程实例id,并用逗号分隔
    ids=$(curl -X GET -H "accept: */*" -H "token: ${token}" "${url}/projects/${project_code}/process-instances?endDate=${three_month_ago_datetime}%2000:00:00&pageNo=1&pageSize=${page_size}&startDate=${four_month_ago_datetime}%2000:00:00" | jq -r '.data.totalList[].id' | tr '\n' ',')
    echo "************************** id数组: ${ids} **************************"
    # 根据ids批量删除进程实例(工作流实例)
    curl -X POST -H "accept: */*" -H "token: ${token}" "${url}/projects/${project_code}/process-instances/batch-delete?processInstanceIds=${ids}"
    echo "************************** ${project_name} 工作流实例删除成功 **************************"
  done
done

exit 0

3.2 python代码实现

from datetime import datetime, timedelta

import requests

weeks_3_months_ago = 12
weeks_4_months_ago = 16

# 认证令牌
token = '5c7437968f5d4492dc694902d6e6847f'
# 链接
url = 'http://localhost:12345/dolphinscheduler'
# 每页多少条
page_size = 10

# 三个月前日期时间
three_month_ago_datetime = (datetime.now() - timedelta(weeks=weeks_3_months_ago)).strftime('%Y-%m-01')
# 四个月前日期时间
four_month_ago_datetime = (datetime.now() - timedelta(weeks=weeks_4_months_ago)).strftime('%Y-%m-01')

# 获取所有项目名称
response = requests.get(f"{url}/projects/list", headers={"token": token})
project_data = response.json()['data']
project_names = [project['name'] for project in project_data]

for project_name in project_names:
    print(f"************************** 项目名: {project_name} **************************")
    # 根据项目名获取项目代码
    project_code = next((project['code'] for project in project_data if project['name'] == project_name), None)
    if project_code:
        # 总页数
        response = requests.get(f"{url}/projects/{project_code}/process-instances",
                                headers={"accept": "*/*", "token": token},
                                params={"endDate": f"{three_month_ago_datetime} 00:00:00",
                                        "startDate": f"{four_month_ago_datetime} 00:00:00",
                                        "pageNo": 1,
                                        "pageSize": f"{page_size}"})
        total_page = response.json()['data']['totalPage']
        print(
            f"************************** {four_month_ago_datetime}~{three_month_ago_datetime} 时间的总页数: {total_page} **************************")
        for page_no in range(1, total_page + 1):
            print(f"************************** {project_name} : {page_no} **************************")
            # 根据项目代码、日期和页码等获取进程实例id,并用逗号分隔
            response = requests.get(f"{url}/projects/{project_code}/process-instances",
                                    headers={"accept": "*/*", "token": token},
                                    params={"endDate": f"{three_month_ago_datetime} 00:00:00",
                                            "startDate": f"{four_month_ago_datetime} 00:00:00",
                                            "pageNo": 1,
                                            "pageSize": f"{page_size}"})
            ids = ','.join([str(instance['id']) for instance in response.json()['data']['totalList']])
            print(f"************************** id数组: {ids} **************************")
            # 根据ids批量删除进程实例(工作流实例)
            requests.post(f"{url}/projects/{project_code}/process-instances/batch-delete",
                          headers={"accept": "*/*", "token": token},
                          params={"processInstanceIds": ids})
            print(f"************************** {project_name} 工作流实例删除成功 **************************")

print("All process instances deleted successfully.")
### 关于 Apache DolphinScheduler 工具文档和使用 #### 3.2.1 版本发布说明 Apache DolphinScheduler 社区已宣布 3.2.1 版本的发布。此版本专注于解决之前版本中存在的问题,并引入了一些功能增强和性能优化措施[^2]。 #### 安装与配置指南 为了安装并配置 Apache DolphinScheduler,建议遵循官方文档中的指导。通常情况下,这涉及以下几个方面: - **环境准备**:确保操作系统上已经安装了必要的依赖项,如 JDK 和数据库驱动程序。 - **下载软件包**:从官方网站获取最新稳定版的二进制文件或源码压缩包。 - **解压并部署**:将下载好的文件解压到指定目录下,按照指引完成初始化设置。 - **启动服务**:通过命令行工具启动各个组件的服务进程。 对于 Python 开发者来说,在某些特定场景下可能还需要调整 Python 的编译选项来支持 SSL 功能,但这不是直接关联到 Apache DolphinScheduler 的操作[^3]。 #### 使用教程概览 在实际应用过程中,用户可以通过以下方式充分利用该调度平台的能力: - 创建工作流定义:利用图形界面或者 YAML 文件描述任务之间的依赖关系以及执行逻辑。 - 配置资源管理器:设定集群节点的角色分配及其对应的计算能力参数。 - 编写插件扩展:基于 SDK 实现自定义的任务处理器或者其他辅助模块。 - 监控运维日志:借助内置的日志收集机制跟踪作业运行状态变化情况。 ```bash # 启动 master 节点 ./bin/dolphinscheduler-daemon.sh start master-server # 查看帮助信息 ./bin/start-all.sh -h ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMagician

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值