前言
ezdata 是一个基于 Vue3 前端、Python 后端及 LLM(大语言模型)开发的数据处理分析和任务调度系统。该系统旨在解决多数据源查询工具切换频繁、脚本部署杂乱以及定时任务管理困难等痛点。核心功能包括数据源管理、数据模型管理、数据集成、数据查询 API 接口、低代码自定义数据处理任务模版,以及单任务及 DAG(有向无环图)任务工作流调度。
系统集成了 LLM 模块实现 RAG(检索增强生成)知识库问答,能够链接各数据源数据进行数据对话问答,提供交互式数据分析功能。通过自然语言转 SQL 或 Python 代码的技术路径,降低数据分析门槛,提升数据利用效率。
背景与痛点
在实际业务场景中,经常需要进行数据抓取并存储到不同的数据源中,包括文件、关系型数据库、NoSQL 数据库、时序数据库、图数据库等,同时伴随大量的数据查询和分析工作。经过实践调研,发现以下主要问题:
- 工具割裂:不同数据源查询时需要使用不同的专用工具查看,对于简单的查询和分析需频繁切换可视化工具,操作繁琐且上下文丢失。
- 脚本管理混乱:Python 脚本部署杂乱,缺乏统一的监控和日志管理。定时任务的动态更新时间策略较麻烦,难以管理和监控执行状态。虽然调研了部分成熟的任务调度系统(如 DolphinScheduler、Airflow 等),但大多基于 Java 生态或需要部署较重的服务才可运行,资源消耗较大,不适合轻量级场景。
- 任务复用性差:同一脚本任务需根据不同参数部署多份,维护成本高。希望将任务固化成模版,通过表单化配置任务模版参数,稍作修改即可运行一个新的同类型的任务,提高开发效率。
基于上述问题,决定自行设计一套系统,方便进行数据的简单查询处理和脚本任务的动态配置、定时调度运行和状态监控。
技术选型
考虑到个人开发精力有限,遵循以下原则进行技术选型:
- 沿用成熟框架:尽量沿用现有的开源成熟框架和库,直接搬运相关模块代码到项目中或做少量修改,降低开发风险。
- 轻量级与可扩展:确保系统轻量级,支持单机部署在小型服务器上,后期可动态扩容到多台机器或 K8s 集群上分布式运行。
- 快速交付:前端采用成熟的低代码平台进行开发,减少页面组件和 RBAC 权限菜单模块的开发时间,暂时忽略 UI 优化,优先实现功能,后续迭代优化。
中间件层
- MySQL:作为业务数据库,存储元数据、任务配置及用户信息。
- Redis:提供任务队列和缓存相关的功能,加速高频访问数据的读取。
- 对象存储:文件存储可选择性使用本地存储或对接 MinIO、阿里云 OSS 等第三方服务,用于存储非结构化数据及日志文件。
- Elasticsearch (ES):引入 ES 作为日志中间件和大量数据时的数据存储、检索、对外服务的中间件,便于分析任务日志和提供基础的大数据量查询。
后端层
- Flask:使用 Flask 作为 API 服务框架,保持轻量灵活。
- Flask-APScheduler:引入该框架做任务调度,开放 API 接口方便前端做任务的动态配置和启停、定时触发等功能。
- Celery:使用 Celery 做分布式任务分发执行模块,借助 Celery Flower 模块开放的 API 接口实现任务队列管理、执行中任务监控等功能,确保异步任务的高可靠性。
前端层
- Vue3 + Ant Design:使用了基于 Vue3 和 Ant Design 的 Jeecg 低代码系统,省去了开发各种前端组件和 RBAC 权限菜单模块的工作,快速搭建出基础的系统前端页面。
数据模块设计
创建一个统一的数据模型概念,将各数据源类型抽象为统一数据模型。支持的数据源类型包括:文件、API、数据库表、数据库查询 SQL、Binlog 数据流、Kafka 数据流、NoSQL 文档记录等。
在统一数据模型上支持创建、删除、字段管理、查询取数、封装数据查询 API 接口等各种功能。不同数据模型具有不同的功能类型,并使用前端低代码系统快速拓展实现数据源的管理和创建新的数据模型类型和相关拓展功能。
查询与 ETL 流程
查询数据时,根据系统配置的相关连接参数,实例化对应的数据模型 Reader 对象。Reader 对象负责从源头获取原始数据,并根据前端配置的过滤条件、原生查询等表单参数对数据源进行查询和数据组装返回,实现数据对象的即时查询。


