Kettle (二)实战案例 (1) 关系型数据库之间的数据同步

Posted on 2021-06-16 17:33  MissRong  阅读(533)  评论(0)    收藏  举报

Kettle (二)实战案例 (1) 关系型数据库之间的数据同步 

操作前的准备:建库建表

auto_increment=1 这个是修饰主键primary key,自动增长1

--================================
-- 日志库
--================================
create database etl;
use etl;
alter table control_table auto_increment = 1;

drop table control_table;
create table control_table
(id int primary key auto_increment,
task_name varchar(255),
run_flag int,
created_at datetime,
updated_at datetime
)
;

drop table task_log;
create table task_log
(id int  primary key  auto_increment,
task_name varchar(50),
status varchar(50),
log_time datetime
)
;
--================================
-- 测试数据 
--================================

use test;
drop table order_detail;
create table order_detail
(
id bigint,
user_id bigint,
product_id bigint,
status  varchar(50),
amount  double,
created_at datetime,
updated_at datetime
)
;

insert into order_detail
select 1,
       123,
       10001,
       'new',
       100.2,
       now(),
       now();
commit;
  
--step2 
insert into order_detail
select 2,
       222,
       10001,
       'new',
       200,
       now(),
       now();

update order_detail
set status = 'success'
where id = 1;
commit;

select * from order_detail;

create database ods;
create table order_detail
(
id bigint,
user_id bigint,
product_id bigint,
status  varchar(50),
amount  double,
created_at datetime,
updated_at datetime
)
;
use etl;
insert into control_table(task_name,run_flag,created_at,updated_at)
select  'order_detail',1,now(),now()
from dual;

insert into control_table(task_name,run_flag,created_at,updated_at)
select 'customer',0,now(),now()
from dual;
commit; select * from control_table; commit; select task_name from control_table where run_flag = 1 ;
--=====================================
-- mysql 表
--=====================================
use test;
drop table customer;
create table customer
(
user_id bigint,
user_name varchar(50),
created_at datetime,
updated_at datetime
)
;

drop table product;
create table product
(
id         bigint,
product_id bigint,
product_name varchar(50),
created_at datetime,
updated_at datetime
)
;
insert into product
select 1,1,'name1',now(),now();
commit;

drop table product_info;
create table product_info
(
product_id bigint,
product_name varchar(50),
created_at datetime,
updated_at datetime
)
;

--===================================
delete from etl.control_table where  task_name = 'customer';
insert into etl.control_table(task_name,run_flag,created_at,updated_at)
select  'customer',1,now(),now()
from dual;

delete from etl.control_table where  task_name = 'product';
insert into etl.control_table(task_name,run_flag,created_at,updated_at)
select  'product',1,now(),now()
from dual;

delete from etl.control_table where  task_name = 'product_info';
insert into etl.control_table(task_name,run_flag,created_at,updated_at)
select  'product_info',1,now(),now()
from dual;
commit ;

select * from etl.control_table;

关系型数据库间的同步

开始-->初始化变量-->写日志--加载数据到关系型数据库中(数据的转换和同步),

如果转换同步失败就会重试(先判断重试次数,然后等待15秒再继续尝试执行),

如果转换同步成功,就会写日志然后更新元数据信息,最后同步转换数据成功。

该过程实现的是SQL数据库表  test.order_detail  到SQL数据库表 ods.order_detail 之间的转换。

详细解释:

1、转换: INIT_PARAMETERS (初始化参数)                                           

查看 test.order_detail 表结构和原始数据:

(1) Table input

SQL语句:

TABLE_NAME 列值为'order_detail',  IN_STST_DATE列值为当前时间再减去400个小时

(-400是因为后面从test.order_detail表中抽取的时间需要满足:updated_at >= '${IN_STAT_DATE}',

   也就是说新获取的时间数据要小些)

这个时候还没用上MySQL的表. 仅是一个查询,

因为配置文件 D:\Kettle7.1\data-integration\simple-jndi\jdbc.properties 中默认连接的是test数据库:

  MYSQL_RW/url=jdbc:mysql://192.168.212.50:3306/test

TABLE_NAME变量在这里被初始化值为: test.order_detail

IN_STAT_DATE变量也会被赋予初始值de

SELECT 'order_detail' AS TABLE_NAME,
              date_add(now(), interval -400 hour) AS IN_STAT_DATE
FROM DUAL

预览得到数据样例:

(2) Set Variables--设置环境变量

2、LogStart                                                                                              

按照原始表结构创建SQL脚本,目的是将新的数据插入到 etl.task_log 表中,用来记录转换过程

查看 原始表结构和表数据:

INSERT INTO etl.task_log
(TASK_NAME,
STATUS,
LOG_TIME
)
SELECT '${TABLE_NAME}',
              '${STATUS}',
              NOW()
FROM DUAL

设置命名参数:TABLE_NAME、STATUS

这里的TABLE_NAME的值就是之前参数初始化的值 test.order_detail 

3、执行数据的转换和同步 Load Increament Data To Mysql                        

(1) Table input

SELECT  *
FROM  ${TABLE_NAME}
WHERE updated_at >= '${IN_STAT_DATE}'

注意: 要选上下面框中的两项

(2) Table output

将数据同步到 ods.order_detail 表中.

这里的ods是目标数据库的名称

 4、Simple evaluation                                                                              

如果加载失败,检验变量-RETRY_TIMES(默认值为0), 判断值是否小于1.

如果是,就走左侧的等待15秒

然后再设置环境变量 RETRY_TIMES为1

DUMY:没有实际意义,就是为了排版好看

如果失败,就走右侧的结束日志-LogEnd2

它的SQL和LogStart相同,命名参数SUCCESS则变成Fail

最后终止作业(Abort job)

5、如果加载成功                                                                              

走DUMMY(没有实际的意义,只是排版美观考虑)、LogEnd(SQl和LogStart一样, 参数STATUS变为SUCCESS)、update metadata(更新元数据).

更新成功的话就返回success,失败的话就终止作业.

6、查看三个表变化后的数据                                                             

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3