在数据中台建设中,把数据从业务系统同步到目标库,通常只是数据处理链路的第一步。
数据进入数仓或分析系统前,往往还需要经过字段筛选、格式调整、异常值处理、去重、值映射等加工。
与此同时,一条长期运行的 ETL 任务还要回答:
什么时候执行?用什么执行引擎?任务是否正常完成?异常后如何查看?
所以,一条完整的 ETL 任务不只是:
"
输入 → 转换 → 输出
"
而是:
"
任务创建 → 运行配置 → ETL流程编排 → 调度执行 → 运行结果查看
"
的完整过程。
本文以 qData 开源版为例,结合"水位异常值处理"任务,拆解一条 ETL 流程如何从创建到运行。

第一步:先创建一条数据集成任务
在 qData 中,ETL 流程首先以数据集成任务的形式进行管理。
创建任务时,除了任务名称、任务类目、责任人等基本信息,还需要确定任务后续采用什么方式执行。

qData 当前可根据任务场景选择不同的执行引擎。
对于相对轻量的数据读取、写入和同步任务,可以选择 DataX,并进一步设置:
-
JVM 初始内存、最大内存;
-
Channel 并发数;
-
字节限速;
-
记录限速;
-
脏数据上限。
这些参数并不决定"数据怎么处理",而是控制任务运行时如何使用相关资源。

对于规模更大的离线数据处理场景,则可以选择 Spark,并配置 Driver 核心数、Driver 内存、Executor 数量、Executor 核心数、Executor 内存以及 Yarn 队列等参数。
当前页面同时预留了 Flink 执行引擎入口,但文档所示版本中状态为"暂未上线",因此现阶段仍以已经可用的执行方式为主。

确定执行引擎之后,还要解决第二个问题:任务什么时候执行?
因此,创建任务时还可以配置调度系统及相应的调度方式。
可以简单理解为:
-
执行引擎解决"怎么执行";
-
调度配置解决"什么时候执行";
-
ETL流程解决"执行过程中具体做什么"。
完成这些基础设置后,通过"保存并配置流程",再进入真正的数据处理链路设计。

第二步:进入可视化画布,把 ETL 流程搭起来
进入流程配置页面后,左侧提供可使用的数据处理组件,中间则是可视化流程画布。
用户可以根据数据处理逻辑,将不同组件拖入画布,再通过连线确定数据流转顺序。
以"水位异常值处理"为例,最基础的流程由三个核心节点构成:
"
表输入组件 → 转换组件 → 表输出组件
"
三个节点分别承担不同职责:
-
表输入:数据从哪里进入;
-
转换:进入之后做哪些加工和清洗;
-
表输出:处理完成后写到哪里。
这种方式的意义并不只是将脚本变成几个图形组件。
对于后续维护而言,打开任务就能够先从流程结构上判断数据从哪里进入、经过哪些节点、最终流向哪里。
当业务规则需要调整时,也可以先定位对应处理节点,再修改具体配置,而不必首先从大量脚本中寻找相关处理逻辑。

第三步:配置输入------明确数据从哪里来
一条 ETL 流程首先需要解决:
"
要处理的数据在哪里?
"
打开表输入组件后,可以配置当前节点的数据来源。
在本次案例中,水位数据来自:
水资源管理系统(第三方库)
选择对应的数据连接后,再指定其中的 WATER_LEVEL 表,就确定了本次 ETL 任务的数据来源。
系统随后会读取并展示数据表字段结构,例如:
ID、STATION_CODE、OBS_TIME、WATER_LEVEL
这些字段将继续向后传递,供转换节点和输出节点使用。
除了直接选择数据库表之外,当前表输入组件还提供 SQL、数据连接、资产表等接入方式。
对于本次案例,由于只是读取已有业务系统数据库中的水位数据,因此直接选择数据连接及对应数据表即可。
"
完成这一步,ETL 链路中的第一个问题就明确了:数据从哪里来,以及接下来需要处理哪些数据。
"

第四步:数据转换------数据接进来之后,怎么处理?
如果只是把一张表原样复制到另一张表,整个过程更接近于数据同步。
ETL 更重要的部分,在于:
数据读取以后,需要进行什么加工。
因此,可以在表输入和表输出之间增加转换节点。
qData 当前提供了多种转换组件,包括:
"
排序记录、字段派生器、去除重复记录、增加常量、字段选择修改、值映射等。
"
这些组件分别适用于不同的数据处理场景。
例如:
-
源数据存在后续不需要的字段,可以通过字段选择进行处理;
-
同一批数据存在重复记录,可以进行去重;
-
不同业务系统中的字段值口径不一致,可以通过值映射进行转换;
-
需要根据已有字段计算新字段,则可以使用字段派生。
"
而在当前水位数据案例中,需要重点处理的是:异常水位值。
"

为什么水位数据不能直接写入后续数仓?
假设源系统中的 WATER_LEVEL 字段存在明显超出正常业务范围的数据。
如果不经过处理直接进入后续数仓,这些异常数据还可能继续参与统计、分析以及指标计算,最终影响数据使用结果。
因此,可以在转换节点中针对 WATER_LEVEL 字段增加异常值处理规则,并选择相应的数据清洗方式。
这里配置的不再只是:
"
"这一步需要做数据转换。"
"
而是进一步明确:
"
处理哪个字段,以及按照什么规则处理。
"
这使数据清洗逻辑能够进一步落实到具体字段和具体规则。
第五步:把常见清洗逻辑沉淀为可配置规则
在企业数据治理过程中,很多数据质量问题其实会反复出现。
如果每遇到一个问题都重新开发一套处理逻辑,随着任务规模增长,维护成本也会随之增加。
因此,在 qData 的转换组件中,可以进一步使用已经维护的数据清洗规则。

例如:
- 日期格式统一:将不同来源的日期转换为指定格式;

- 小数位统一:规范不同来源数据的小数精度;

- 去除字段空格:处理字符串前后的多余内容;

- 枚举值映射标准化:将不同系统中的字段值转换成统一表达;

- 数值边界调整:针对指定范围之外的数据进行处理。

回到水位异常值处理案例,就可以针对 WATER_LEVEL 字段,根据实际业务要求配置相应的数值处理规则。
这样,源数据不会直接写入目标表,而是:
"
先读取 → 再清洗 → 最后输出。
"
ETL 的作用也由单纯的"数据搬运",进一步延伸到在数据流转过程中完成必要的数据加工和标准化。
第六步:配置输出------处理好的数据最终写到哪里?
完成数据转换之后,还需要确定整个链路的终点:
"
处理后的数据写到哪里?
"
这由表输出组件负责。
如果说表输入解决的是"从哪里读",那么表输出解决的就是"往哪里写"。
在本次案例中,处理后的水位数据最终写入目标表:
"
DWD_WATER_LEVEL_CLEAN_OUTLIER
"

但选择目标表只是第一步。
源数据字段与目标表字段之间还需要建立映射关系,例如:
"
ID → ID
STATION_CODE → STATION_CODE
OBS_TIME → OBS_TIME
WATER_LEVEL → WATER_LEVEL
"
通过字段映射,可以直接查看每一个来源字段最终写入目标表中的哪个位置。
如果源表和目标表的结构并不完全一致,也可以先通过转换节点完成字段选择、修改或者加工,再进行最终字段映射。
到这里,一条 ETL 流程最核心的数据处理链路已经形成:
"
数据读取 → 数据转换与清洗 → 字段映射 → 数据输出
"
第七步:流程搭好了,怎么让它真正持续运行?
完成可视化流程配置,并不意味着数据已经自动开始处理。
前面解决的是:
"
"这条任务应该怎么处理数据?"
"
接下来需要进入实际运行阶段。
由于任务创建时已经设置好执行引擎和调度方式,因此当设定的调度时间到达后,调度系统会触发当前数据集成任务,再由已经配置好的 DataX 或 Spark 执行对应的数据处理流程。
三者之间的职责比较清晰:
-
调度系统:什么时候执行;
-
DataX / Spark:以什么方式执行;
-
ETL 编排流程:执行过程中具体处理什么。
以水位任务为例,到达调度时间后,系统读取新的 WATER_LEVEL 数据,按照已经配置的异常值规则完成处理,再将清洗结果写入目标表。
同一条 ETL 流程不需要每次重新配置,而可以按照既定规则持续执行。

第八步: 任务跑起来之后,还要知道"跑得怎么样"
对于实际的数据中台而言,任务能够执行只是基础。
长期运行过程中,还需要知道:
-
任务是否启用?
-
调度是否已经开启?
-
按照什么周期执行?
-
最近一次执行成功还是失败?
因此,执行后的数据集成任务仍然可以回到任务列表统一查看和管理。
如果最近一次任务执行成功,可以直接查看对应状态;
如果出现异常,则可以结合任务运行信息进一步定位问题。
这对于长期运行的数据任务尤其重要。
一条数据集成任务可能持续运行数月甚至更长时间,期间可能出现源数据结构变化、业务规则调整或者数据异常等情况,需要重新维护。
"
因此,从任务创建、流程配置到调度执行、运行查看,最终形成的是一条完整的数据集成任务管理链路,而不是一次性的 ETL 配置。
"

回到案例:一条水位 ETL 任务到底是怎么跑起来的?
把前面的步骤重新串联起来,"水位异常值处理"任务的完整过程就比较清晰了:
① 创建数据集成任务
配置任务名称、类目、责任人等信息,选择 DataX 或 Spark,并设置调度策略。
② 搭建可视化 ETL 流程
通过表输入、转换、表输出组件形成基础处理链路。
③ 接入源数据
连接第三方水资源管理系统,读取 WATER_LEVEL 表及 ID、STATION_CODE、OBS_TIME、WATER_LEVEL 等字段。
④ 处理异常水位
针对 WATER_LEVEL 字段应用对应的异常值处理规则。
⑤ 配置输出和字段映射
将来源字段与目标字段进行映射,把处理后的数据写入 DWD_WATER_LEVEL_CLEAN_OUTLIER。
⑥ 调度自动触发
到达设定时间后,由调度系统触发任务,DataX 或 Spark 根据已经配置的 ETL 流程完成数据处理。
⑦ 查看运行状态
回到数据集成任务列表,查看最近一次执行结果及任务运行情况。
"
至此,从第三方业务系统的一条原始水位数据,到经过异常值处理后进入目标数据表,一条完整的数据处理链路就建立起来了。
"

拖拉拽的价值,不只是"少写几行代码"
提到可视化 ETL,容易首先想到:是不是可以少写一些 SQL 或脚本?
但对于数据中台来说,可视化编排更重要的价值,在于将原本分散的数据读取、转换、清洗、字段映射、数据输出和任务运行过程组织到一条能够直接查看的数据处理链路中。
打开一条任务,可以比较直观地回答几个问题:
-
数据从哪里来?
-
中间经过了哪些处理?
-
最终写到了哪里?
-
这条流程又是按照什么方式持续运行的?
对于刚开始接触数据中台的用户,也可以先从最基础的:
"
输入 → 转换 → 输出
"
开始搭建第一条 ETL 流程,再根据实际业务逐步增加数据清洗、转换规则和调度配置。
总结
数据集成不只是把数据从一个系统同步到另一个系统。
一条能长期运行的 ETL 任务,需要同时处理数据接入、转换清洗、字段映射、数据输出、执行引擎、调度执行和运行管理。
qData 开源版通过可视化 ETL 编排,把这些环节串成一条可查看、可维护的链路:
"
先创建任务,再配置流程 → 把数据接进来、处理好、写出去 → 最后通过执行引擎和调度能力,让配置好的数据处理流程按照计划持续运行
"
在"水位异常值处理"案例中,可视化 ETL 的重点不只是减少代码量,而是让数据来源、加工过程、输出方向和运行方式更清晰。
对数据中台建设来说,这种从数据流转到任务运行的管理方式,也为后续增加清洗规则、扩展处理流程和维护长期任务提供了更直观的基础。