kettle基本操作1:使用kettle实现分页分批次数据同步

0.前言

以下是使用kettle对大表进行分页分批次全量同步的基础例子,并尽量减少job与trans的嵌套,在此基础上继续添加细节。
此工作流的源与目标均是mysql数据库,主要的设计思路是:

  • 开始
  • truncate目标表
  • 设置全局变量(batch_size、total_pages、current_page、offset)
  • 获取total_page
  • 按page循环同步数据,并依据current_page的值判断是否需要结束

1.主工作流

image

以下按节点展开详细说明。

(1)truncate目标表

先清空目标表的全部数据,具体配置如下:
image

(2)设置变量

以下为工作流所使用到的变量,具体配置如下:
image

(3)获取total_page

这是一个转换,具体转换的内容如下:
image

每个节点的具体内容如下:

  • 表输入:依据batch_size计算源总的page数
    image
select ceil(count(1)/${batch_size}) as total_pages from dcs_user;
  • 字段选择:获取查询的结果字段
    image

  • 设置变量:将查询结果的total_pages赋值至工作流的变量中
    image

(4)current_page循环判断

这里设置的是,如果current_page如果小于total_pages则跳出循环并结束工作流
image

(5)写日志

这个没什么好说明的,写日志的组件用来辅助高调试还是很有用的。
image

(6)数据分批次同步

这是一个转换,是简单的数据读入并输出,如下:
image

  • 表输入:按分页读取本页内的数据,配置如下:
    image
select username,real_name,last_login_time 
from tmp.dcs_user 
limit ${offset} ,${batch_size};
  • 表输出:如果是实际的大表时,提交记录数量要上调大一些,使用批量插入也必须勾选上。
    image

(7)更新offset变量

这是一个关键的步骤,主要操作是current_page递增,offset也要随current_page的值变化而重新计算,使用js比较容易实现,js的代码如下:

// 获取当前变量值(注意:若变量未定义,需先初始化)
var currentPage = parseInt(parent_job.getVariable("current_page"));

var batchSize = parseInt(parent_job.getVariable("batch_size"));

// 变量自增
currentPage = currentPage + 1;
// 更新offset
offset = currentPage * batchSize;

// 更新变量
parent_job.setVariable("current_page", currentPage.toString()); 
parent_job.setVariable("offset", offset.toString()); 

// 必须返回true,否则无法流转至下一个节点
true;

2.执行结果

2025-09-09 15:02:17.652 - Spoon - 正在开始任务...
2025-09-09 15:02:17.653 - main_job - 开始执行任务
2025-09-09 15:02:17.655 - main_job - 开始项[truncate目标表]
2025-09-09 15:02:17.697 - main_job - 开始项[设置变量]
2025-09-09 15:02:17.698 - main_job - 开始项[获取total_page]
2025-09-09 15:02:17.713 - 获取total_page - Using run configuration [Pentaho local]
2025-09-09 15:02:17.715 - 转换 1 - 为了转换解除补丁开始  [转换 1]
2025-09-09 15:02:17.738 - 表输入.0 - Finished reading query, closing connection
2025-09-09 15:02:17.738 - 设置变量.0 - Setting environment variables...
2025-09-09 15:02:17.739 - 设置变量.0 - Set variable total_pages to value [8.0]
2025-09-09 15:02:17.740 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2025-09-09 15:02:17.757 - 字段选择.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2025-09-09 15:02:17.772 - 设置变量.0 - Finished after 1 rows.
2025-09-09 15:02:17.772 - 设置变量.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2025-09-09 15:02:18.719 - main_job - 开始项[current_page循环判断]
2025-09-09 15:02:18.719 - main_job - 开始项[写日志]
2025-09-09 15:02:18.720 -  - ## current_page = 0, offset = 0
2025-09-09 15:02:18.721 - main_job - 开始项[数据分批次同步]
2025-09-09 15:02:18.730 - 数据分批次同步 - Using run configuration [Pentaho local]
2025-09-09 15:02:18.730 - 转换 2 - 为了转换解除补丁开始  [转换 2]
2025-09-09 15:02:18.730 - 表输出.0 - Connected to database [LOCAL_MYSQL_TMP2] (commit=1000)
2025-09-09 15:02:18.747 - 表输入.0 - Finished reading query, closing connection
2025-09-09 15:02:18.747 - 表输入.0 - 完成处理 (I=10, O=0, R=0, W=10, U=0, E=0)
2025-09-09 15:02:18.772 - 表输出.0 - 完成处理 (I=0, O=10, R=10, W=10, U=0, E=0)
2025-09-09 15:02:18.773 - main_job - 开始项[更新offset变量]
2025-09-09 15:02:18.777 - main_job - 开始项[current_page循环判断]
2025-09-09 15:02:18.778 - main_job - 开始项[写日志]
2025-09-09 15:02:18.779 -  - ## current_page = 1, offset = 10
2025-09-09 15:02:18.779 - main_job - 开始项[数据分批次同步]
2025-09-09 15:02:18.790 - 数据分批次同步 - Using run configuration [Pentaho local]
2025-09-09 15:02:18.791 - 转换 2 - 为了转换解除补丁开始  [转换 2]
2025-09-09 15:02:18.792 - 表输出.0 - Connected to database [LOCAL_MYSQL_TMP2] (commit=1000)
2025-09-09 15:02:18.813 - 表输入.0 - Finished reading query, closing connection
2025-09-09 15:02:18.815 - 表输入.0 - 完成处理 (I=10, O=0, R=0, W=10, U=0, E=0)
2025-09-09 15:02:18.827 - 表输出.0 - 完成处理 (I=0, O=10, R=10, W=10, U=0, E=0)
2025-09-09 15:02:18.829 - main_job - 开始项[更新offset变量]
2025-09-09 15:02:18.832 - main_job - 开始项[current_page循环判断]
2025-09-09 15:02:18.834 - main_job - 开始项[写日志]
2025-09-09 15:02:18.834 -  - ## current_page = 2, offset = 20
2025-09-09 15:02:18.834 - main_job - 开始项[数据分批次同步]
2025-09-09 15:02:18.853 - 数据分批次同步 - Using run configuration [Pentaho local]
2025-09-09 15:02:18.854 - 转换 2 - 为了转换解除补丁开始  [转换 2]
2025-09-09 15:02:18.855 - 表输出.0 - Connected to database [LOCAL_MYSQL_TMP2] (commit=1000)
2025-09-09 15:02:18.871 - 表输入.0 - Finished reading query, closing connection
2025-09-09 15:02:18.873 - 表输入.0 - 完成处理 (I=10, O=0, R=0, W=10, U=0, E=0)
2025-09-09 15:02:18.885 - 表输出.0 - 完成处理 (I=0, O=10, R=10, W=10, U=0, E=0)
2025-09-09 15:02:18.887 - main_job - 开始项[更新offset变量]
2025-09-09 15:02:18.890 - main_job - 开始项[current_page循环判断]
2025-09-09 15:02:18.891 - main_job - 开始项[写日志]
2025-09-09 15:02:18.891 -  - ## current_page = 3, offset = 30
2025-09-09 15:02:18.892 - main_job - 开始项[数据分批次同步]
2025-09-09 15:02:18.903 - 数据分批次同步 - Using run configuration [Pentaho local]
2025-09-09 15:02:18.903 - 转换 2 - 为了转换解除补丁开始  [转换 2]
2025-09-09 15:02:18.905 - 表输出.0 - Connected to database [LOCAL_MYSQL_TMP2] (commit=1000)
2025-09-09 15:02:18.919 - 表输入.0 - Finished reading query, closing connection
2025-09-09 15:02:18.921 - 表输入.0 - 完成处理 (I=10, O=0, R=0, W=10, U=0, E=0)
2025-09-09 15:02:18.939 - 表输出.0 - 完成处理 (I=0, O=10, R=10, W=10, U=0, E=0)
2025-09-09 15:02:18.942 - main_job - 开始项[更新offset变量]
2025-09-09 15:02:18.944 - main_job - 开始项[current_page循环判断]
2025-09-09 15:02:18.945 - main_job - 开始项[写日志]
2025-09-09 15:02:18.945 -  - ## current_page = 4, offset = 40
2025-09-09 15:02:18.945 - main_job - 开始项[数据分批次同步]
2025-09-09 15:02:18.958 - 数据分批次同步 - Using run configuration [Pentaho local]
2025-09-09 15:02:18.958 - 转换 2 - 为了转换解除补丁开始  [转换 2]
2025-09-09 15:02:18.960 - 表输出.0 - Connected to database [LOCAL_MYSQL_TMP2] (commit=1000)
2025-09-09 15:02:18.973 - 表输入.0 - Finished reading query, closing connection
2025-09-09 15:02:18.974 - 表输入.0 - 完成处理 (I=10, O=0, R=0, W=10, U=0, E=0)
2025-09-09 15:02:18.985 - 表输出.0 - 完成处理 (I=0, O=10, R=10, W=10, U=0, E=0)
2025-09-09 15:02:18.988 - main_job - 开始项[更新offset变量]
2025-09-09 15:02:18.991 - main_job - 开始项[current_page循环判断]
2025-09-09 15:02:18.991 - main_job - 开始项[写日志]
2025-09-09 15:02:18.992 -  - ## current_page = 5, offset = 50
2025-09-09 15:02:18.992 - main_job - 开始项[数据分批次同步]
2025-09-09 15:02:19.003 - 数据分批次同步 - Using run configuration [Pentaho local]
2025-09-09 15:02:19.004 - 转换 2 - 为了转换解除补丁开始  [转换 2]
2025-09-09 15:02:19.006 - 表输出.0 - Connected to database [LOCAL_MYSQL_TMP2] (commit=1000)
2025-09-09 15:02:19.021 - 表输入.0 - Finished reading query, closing connection
2025-09-09 15:02:19.022 - 表输入.0 - 完成处理 (I=10, O=0, R=0, W=10, U=0, E=0)
2025-09-09 15:02:19.036 - 表输出.0 - 完成处理 (I=0, O=10, R=10, W=10, U=0, E=0)
2025-09-09 15:02:19.037 - main_job - 开始项[更新offset变量]
2025-09-09 15:02:19.039 - main_job - 开始项[current_page循环判断]
2025-09-09 15:02:19.040 - main_job - 开始项[写日志]
2025-09-09 15:02:19.040 -  - ## current_page = 6, offset = 60
2025-09-09 15:02:19.040 - main_job - 开始项[数据分批次同步]
2025-09-09 15:02:19.053 - 数据分批次同步 - Using run configuration [Pentaho local]
2025-09-09 15:02:19.053 - 转换 2 - 为了转换解除补丁开始  [转换 2]
2025-09-09 15:02:19.055 - 表输出.0 - Connected to database [LOCAL_MYSQL_TMP2] (commit=1000)
2025-09-09 15:02:19.070 - 表输入.0 - Finished reading query, closing connection
2025-09-09 15:02:19.071 - 表输入.0 - 完成处理 (I=10, O=0, R=0, W=10, U=0, E=0)
2025-09-09 15:02:19.084 - 表输出.0 - 完成处理 (I=0, O=10, R=10, W=10, U=0, E=0)
2025-09-09 15:02:19.086 - main_job - 开始项[更新offset变量]
2025-09-09 15:02:19.088 - main_job - 开始项[current_page循环判断]
2025-09-09 15:02:19.090 - main_job - 开始项[写日志]
2025-09-09 15:02:19.090 -  - ## current_page = 7, offset = 70
2025-09-09 15:02:19.090 - main_job - 开始项[数据分批次同步]
2025-09-09 15:02:19.101 - 数据分批次同步 - Using run configuration [Pentaho local]
2025-09-09 15:02:19.102 - 转换 2 - 为了转换解除补丁开始  [转换 2]
2025-09-09 15:02:19.103 - 表输出.0 - Connected to database [LOCAL_MYSQL_TMP2] (commit=1000)
2025-09-09 15:02:19.117 - 表输入.0 - Finished reading query, closing connection
2025-09-09 15:02:19.118 - 表输入.0 - 完成处理 (I=5, O=0, R=0, W=5, U=0, E=0)
2025-09-09 15:02:19.142 - 表输出.0 - 完成处理 (I=0, O=5, R=5, W=5, U=0, E=0)
2025-09-09 15:02:19.144 - main_job - 开始项[更新offset变量]
2025-09-09 15:02:19.146 - main_job - 开始项[current_page循环判断]
2025-09-09 15:02:19.147 - main_job - 开始项[成功]
2025-09-09 15:02:19.148 - main_job - 完成作业项[成功] (结果=[true])
2025-09-09 15:02:19.148 - main_job - 完成作业项[current_page循环判断] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[更新offset变量] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[数据分批次同步] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[写日志] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[current_page循环判断] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[更新offset变量] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[数据分批次同步] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[写日志] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[current_page循环判断] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[更新offset变量] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[数据分批次同步] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[写日志] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[current_page循环判断] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[更新offset变量] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[数据分批次同步] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[写日志] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[current_page循环判断] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[更新offset变量] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[数据分批次同步] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[写日志] (结果=[true])
2025-09-09 15:02:19.149 - main_job - 完成作业项[current_page循环判断] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[更新offset变量] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[数据分批次同步] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[写日志] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[current_page循环判断] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[更新offset变量] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[数据分批次同步] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[写日志] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[current_page循环判断] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[更新offset变量] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[数据分批次同步] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[写日志] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[current_page循环判断] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[获取total_page] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[设置变量] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 完成作业项[truncate目标表] (结果=[true])
2025-09-09 15:02:19.150 - main_job - 任务执行完毕
2025-09-09 15:02:19.151 - Spoon - 任务已经结束.
posted @ 2025-09-09 15:06  潇雨锁清秋  阅读(757)  评论(2)    收藏  举报