使用Kettle定时从数据库A刷新数据到数据库B

一、需求背景

由于项目场景原因,需要将A库(MySQL)中的表a、表b、表c中的数据定时T+1 增量的同步到B库(MySQL)。这里说明一下,不是数据库的主从备份,就是普通的数据同步。经过技术调研,发现Kettle挺合适的,原因如下:

  1. Kettle (数据抽取、清洗、转换、装载)是由java 编写,可以在 Window、Linux、Unix 上运行。支持多数据源, 多种中间件的专业ETL 工具;
  2. 可视化界面支持图形化GUI设计界面,组件多样性,支持组件拖拉拽,不用写额外的代码;
  3. Kettle的流程图本质上都是配置文件,如.ktr/.kjb文件。这种设计的好处就是,当我们把转换流程图画完之后,可以直接复制到另外一个环境中运行,如:在Windows电脑上画好流程图,复制到Liunx系统上运行
  4. 免费、组件多、支持开源,一般处理T+1的数据同步是没有问题的。如果并发高、实时性高、数据量大就建议使用Flink了。

二、使用方式

1. 安装包下载

官网地址:http://sourceforge.net/projects/pentaho/files/Data%20Integration/

2. 启动方式

Windows点击Spoon.bat启动

出现以下图片表示正在启动,如果一直没有反应,使用管理员身份运行

主界面如下:

三、连接MySQL数据库

1. 准备MySQL连接驱动jar包

由于Kettle自身是不带任何数据库驱动包的,所以这里我们需要先自己准备好驱动包,版本最好选择5.1.49。下载好jar包后,拷贝到lib目录下(Windows和Linux同理)。如果已经启动了Kettle,则需要关掉重新启动,否则驱动包不会被加载。

2. 创建数据源

依次点击:转换——>主对象树——>DB连接——>点击新建——>测试

同上操作,创建好两个数据源:源数据库、目标库;目标就是将源数据库中的表数据同步到目标库中去

3. 配置转换流程

① 加入输入节点:转换——>输入——>表输入

② 双击输入节点打开配置页,输入一下信息

这里因为我是定时T+1 增量同步数据,所以我加了个同步条件WHERE gmt_create >= CURDATE()表示该数据创建时间大于当天才会进行查询。

点击预览,正好有一条数据

③加入转换节点:转换——>插入/更新——>按住shift建立连接

④ 双击插入/更新节点,打开配置页

⑤ 点击运行测试

四、复制ktr文件到Liunx上定时运行

在Linux上,ktr文件使用Kettle的pan.sh脚本运行,命令大致如下:sh /home/admin/kettle/data-integration/pan.sh -file=/home/admin/kettle/ktr/table_transfer.ktr -norep。同时为了实现定时执行这个脚本,我打算用Linux自带的corntab功能设置定时。

首先我编写了一个shell脚本,命名为cornSql.sh,用于保存ktr的执行命令,内容如下:

#!/bin/bash 
export KETTLE_HOME=/home/admin/kettle/data-integration
export JAVA_HOME=/usr/java/jdk1.8.0_131
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin:${KETTLE_HOME}
export JRE_HOME=${JAVA_HOME}/jre

TIME=$(date "+%Y%m%d")
sh /home/admin/kettle/data-integration/pan.sh -file=/home/admin/kettle/ktr/table_transfer.ktr -norep >>/home/admin/kettle/log/transfer-"$TIME".log

其次,将ktr脚本拷贝到指定目录下,也就是/home/admin/kettle/ktr目录下,输入 crontab -e,再输入0 1 * * * /home/admin/kettle/cornSql.sh,这句话的意思是每天凌晨1点定时执行cornSql.sh脚本
为了检查定时配置是否生效,这里可以使用 crontab -l -u root命令,如果刚才的定时指令有打印出来,则证明配置生效。

最后,第二天检查一下执行日志文件有没有生成,在/home/admin/kettle/log目录下,这里我把每天执行的日期打印出来了,如下图:

本文转载于网络 如有侵权请联系删除

相关文章

  • 搬瓦工VPS修改、新增SWAP分区的大小的方法

    上一篇,给大家解释了swap满了产生的原因, 这篇文章,就来详细给大家说一下修改、新增SWAP分区的大小的步骤。首先,查看swap分区的大小,使用以下命令:free -h复制或者free -m复制以上两个命令,都可以查看到centos7或者其他linux系统的swap分区大小。 下一步,是修改、新增SWAP分区的大小我们需要线删除旧的swap分区,然后再建新的swap分区 删除swap分区使用以下命令: swapoff -a复制新建swap分区使用以下命令: dd if=/dev/zero of=/opt/swap bs=1M count=1024复制这里我是在opt文件夹里面建立了一个1G大小的swap分区,大家可以在自己喜欢的地方建立自己的swap分区,也可以按照自己的喜好设置大小。前提是需要由足够的硬盘空间。 上面的命令,解释以下: 其中bs是每块的大小,count是块的数量,bs*count,就是swap文件的大小了,这里就是1M*1024=1G。大家可以自己调整count的数量。新的1G大小的swap交换分区建好了,下面需要对新的分区进行格式化,使用以下命令: mkswap 

  • Shiro集成验证码--Java学习网

    在做用户登录功能时,很多时候都需要验证码支持,验证码的目的是为了防止机器人模拟真实用户登录而恶意访问,如暴力破解用户密码/恶意评论等。目前也有一些验证码比较简单,通过一些OCR工具就可以解析出来;另外还有一些验证码比较复杂(一般通过如扭曲、加线条/噪点等干扰)防止OCR工具识别;但是在中国就是人多,机器干不了的可以交给人来完成,所以在中国就有很多打码平台,人工识别验证码;因此即使比较复杂的如填字、算数等类型的验证码还是能识别的。所以验证码也不是绝对可靠的,目前比较可靠还是手机验证码,但是对于用户来说相对于验证码还是比较麻烦的。对于验证码图片的生成,可以自己通过如Java提供的图像API自己去生成,也可以借助如JCaptcha这种开源Java类库生成验证码图片;JCaptcha提供了常见的如扭曲、加噪点等干扰支持。本章代码基于《第十六章综合实例》。一、添加JCaptcha依赖Java代码<dependency><groupId>com.octo.captcha</groupId><artifactId>jcaptcha</artifa

  • 使用android studio导入模块的两种方法(超详细)

    第一种方法1,首先自己创建一个新的android项目,选择EmptyActivity,一直选择默认项2,file-new-importmodule3.选择模块文件,点击finish4.点击file-projectStructure,5,选中Modules下的app,注意这个app就是你自己newproject的module,下面这个huyubao就是我之前添加的,再选择Dependencies6.点击+号,选中Moduledependency7,选中之前导入的模块,点击ok第二种方法1,首先自己创建一个新的android项目,选择EmptyActivity,一直选择默认项2.点击file-projectStructure,3.点击左上方的+号,选择importGradleproject,点击next4,选择模块文件5,选中Modules下的app,注意这个app就是你自己newproject的module,下面这个huyubao就是我之前添加的,再选择Dependencies6.点击+号,选中Moduledependency7,选中之前导入的模块,点击ok总结以上所述是小编给大家介绍的

  • Unity手游实战:从0开始SLG——ECS战斗(一)ECS设计思想

    ECS设计理念并不是一个新兴的事物,早在90年代就存在了。但是走入大众视野则要归功于《守望先锋》这款游戏。2017年的GDC大会上,《守望先锋》团队在大会上分享的《OverwatchGameplayArchitectureandNetcode》,但他们设计的初衷是用来解决预测和回滚的问题。编程思想的演变对于我们这代的程序员来说,接触和学习的时候就已经是面向对象(object为什么会翻译为对象。。)普及的时代。很多人只是在打基础的时候接触过C语言的过程编程。现在又出了一种面向数据的编程,所以一起分析一下这三种编程思想的不同:比如现在有一群狗和一群猪,我们要让它们的尾巴摇起来:面向过程:1、摇(所有狗的尾巴)2、摇(所有猪的尾巴)面向对象:1、所有狗.(摇尾巴)2、所有猪.(摇尾巴)面向数据:1、收集所有的尾巴2、摇(尾巴) 可以看到,面向什么,就重视什么。面向过程强调的是步骤和过程,所以它只要用过程来解决整体流程就好了。面向对象强调的是个体,所以它告诉个体,你要做什么。面向数据强调的是部件(部件是数据的容器),那么我要先收集所有的部件(尾巴),然后一起摇。面向数据的编程 从17年到现在

  • js -- img 随着鼠标滚轮的变化变化

    <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <metahttp-equiv="Content-Language"content="zh-cn"/> <metahttp-equiv="Content-Type"content="text/html;charset=gb2312"> <title>用鼠标滚轮滚动控制图片的缩小放大</title> <styletype="text/css"> </style> <scriptlanguage

  • 手机输入法多支线管理介绍

    【背景】搜狗输入法主线版本的迭代速度慢,大概1~1.5月/大版本,版本迭代速度已经跟不上项目需求,对比其他产品(抖音2个月5个版本,快手1个月4个版本等等)迭代速度确实需要改进。【问题分析】我们对整个项目流程的各个环节进行了梳理,希望能发现导致版本慢的一些原因。问题抽象汇总如下: 问题汇总为两个大的维度: ①项目流程有不规范的地方,存在内耗,导致时间和人员浪费; ②整体项目流程确实存在不灵活,不能满足需求、版本快速迭代、临时变更的痛点。【解决方案】1.【优化】对存在问题的流程进行改进优化;(这部分主要的解决方案就是推进《开发提测流程》、《产品验收流程》、《设计走查流程》等相关流程,不多做介绍,在我们的流程规范系列文章里都有。) 2.【创新】对当前的项目迭代方式进行改革,实施多支线并行开发、并行测试、多版本上线(简称多支线管理)。【多支线管理介绍】1.总的原则: ①形成需求池; ②每个需求一条支线; ③多条支线并行开发、并行测试; ④到规定上线时间点,评估多条支线状态,是否满足合并为一条支线上线的标准; ⑤合并代码,把已完成测试的需求合并到主线并发布。 用一张图来体现和之前只有一条支线

  • 理解Java并发工具类Exchanger

    Exchanger类是JDK5中的一个并发工具辅助类,这个类的主要作用是可以用于两个线程之间交换数据,以实际生活中的场景来讲,比如很多小区楼下都有自取的快递柜,如果快递员来了,就把东西直接放快递柜子就行了,然后我们直接从柜子中取走东西即可。这个柜子就起到了媒介的作用。也就说柜子可以是双向信息交换的一个媒介,比如我需要邮寄东西,我可以提前把东西放进柜子,然后快递来了把新买的东西放进去,然后把需要邮寄的东西拿走,这样就完成了交换,但大多数时候,我们可能买东西比较多,邮寄东西比较少。Exchanger在遗传算法和管道设计比较有用。下面先来看一个简单的交换例子:publicstaticvoidmain(String[]args){ Exchangerexchanger=newExchanger(); ExchangeDemo1demo1=newExchangeDemo1(); Threadt1=newThread(newWorker(exchanger,"A")); Threadt2=newThread(newWorker(exchanger,"B"

  • yarn -- 新型包管理器

    node包管理器随着nodejs的出现,另外两个东西也进入了前端大众的视野–CommonJS规范、node包管理器。说到node包管理器,就不得不提npm,毕竟是官方标配,安装了node就自带了npm。 npm+nodejs,构成了一个宏伟了前端世界。 当然,出于各种原因,市面上还存在着各种包管理器,比较著名的端资源包管理器–‘bower’; 镜像为主的cnpm、tnpm; 工具提供的rnpm、spm; 还有很多其他的(我也没用过):jamjs、component。今天,想向大家介绍的是yarn–2016.10.11Facebook正式发布的javascript包管理器,用来替代npm。 我在一次偶然的升级reactnative的时候,接触了yarn(reactnative已经将自家的yarn融入安装环境中)。 一遍文章《Yarn:AnewpackagemanagerforJavaScript》讲述了yarn的诞生历程。简介yarn是Facebook与Exponent、Google和Tilde进行合作,开源的JavaScript包管理器。 旨在针对npm使用过程中的一些问题,提供更好的

  • 【邓侃】DeepMind 机器理解文本 NLP 技术复现与解析

    【新智元导读】本文对DeepMind的让计算机读懂文本、回答问题的深度学习技术进行复现与解析。文章对DeepMind的整个技术思路进行了清晰的重构:从问题出发,到语言模型、再到基于LSTM的实现方式、LSTM的缺点及解决方案(Attention)、语料训练以及记忆网络等。在作者邓侃的解读下,整个技术变得清晰易懂,技术难点也得以一一呈现,这对读者了解基于深度学习方法的自然语言理解技术有很大的启发作用。一.要解决什么问题,难度在哪里?GoogleDeepMind团队在NIPS2015发表了一篇题为“TeachingMachinestoReadandComprehend”的论文[1]。这篇论文想解决的问题是:如何让计算机回答提问。具体来说,输入一篇文章(d)和一句提问(q),输出文章中的一个词组,作为回答(a)。譬如输入以下这段文章,TheBBCproducerallegedlystruckbyJeremyClarksonwillnotpresschargesagainstthe“TopGear”host,hislawyersaidFriday.Clarkson,whohostedoneof

  • 2016年那些看似不靠谱的云计算预测,有哪些成真了?|深度

    作者:T客汇杨丽关键词:云计算,数据,分析网站:www.tikehui.com核心提示:2016年已经过去大半,云计算市场也发展得风生水起,Tableau在今年春天曾对云计算市场做出的十大预测。本篇文章从国内视角对这些预测进行了一一复盘。1、云竞争的本质是:数据争夺。从Salesforce到AWS,云计算领域的大型厂商都希望世界上任何一个角落的数据都能迁移到自己的云生态系统之上。不仅关乎企业内部数据资产,Workday,Zendesk产生的Web数据以及各种设备产生的数据,目前都是云计算巨头的首要争抢目标。数据资产对于企业,正如石油对于国家一样重要。任何试图将自身打造成为行业第一的云服务供应商,必须得有良好运行一家公司所有数据的平台能力。构建在云端的企业数据库,这种想法已不占少数。厂商提供的云端存储十分廉价,而托管解决方案几乎是零资本开支,这样的方式十分诱人。很多企业已经逐渐将那些非传统类型,却极速膨胀的数据迁移到云上。这些数据涵盖了IOT、社交媒体等业务类型。数据迁移到云上后,可以帮助企业更好地分析公司所拥有的资源和客户情况。评论:不过,这样的预测还为时过早。目前,云竞争还处于起步的

  • 回溯法解决【电话号码的字母组合】问题

    这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战接月初算法系列,思路:滑动窗口=>BFS、DFS=>回溯法,各个经典!《温故知新——SlidingWindow》《辛辣天塞!滑动窗口之【和的最大值】&【最大值集合】》《keepmove!滑动窗口中位数与滑动魔方》《好的,BFS,又学废了!》《好的,DFS,也学废了!》《从DFS到回溯法,再看N皇后问题》本篇将继续深入回溯法!经典题目之:电话号码的字母组合题目:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。 给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。 示例1: 输入:digits="23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"] 示例2: 输入:digits="

  • Java并发编程:volatile关键字解析(转)

    本文转自:http://www.cnblogs.com/dolphin0520/p/3920373.html      volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java5之后,volatile关键字才得以重获生机。   volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。   以下是本文的目录大纲:   一.内存模型的相关概念   二.并发编程中的三个概念   三.Java内存模型   四..深入剖析volatile关键字   五.使用volatile关键字的场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:   http://www.c

  • xcode国际化工具genstrings体验总结

    genstrings是苹果推出的一个用于自动从代码的nslocalizedstring等提取生成国际化字符串的工具;xcode的国际化文件方案一直以来都不太智能,我记得很久以前.strings文件库上的修改好像是必然会引发冲突的(别人在你修改过程中提交);在代码中写完国际化的字符串还要单独打开.strings文件进行编辑,比较麻烦。鉴于此,很多开发者在这个方面也做了不少的努力:比如xcode里面对genstrings的扩展或者是改写,支持merge功能等(在github里面搜索genstrings会出现一票的仓库)。其中值得一提的是DTLocalizableStringScanner,它不是基于genstrings而是全部自己开发的开源代码,希望自己定制开发功能的朋友可以考虑基于它进行改造。还有商业化的产品:https://www.delitestudio.com/why-not-use-genstrings/愿意付费的朋友可以尝试,应该可以值回5美元的票价。还有别的思路,根据资源文件自动补全字符串(类似ksimageNamed):https://github.com/questbea

  • Golang 面试题(3) 两个协程轮流打印字母和数字

    Golang面试编程题3 实现两个协程轮流输出A1B2C3....Z26 方案1:有缓冲的chan funcChannelFunc(){ //思想:两个g,一个输出数字,一个输出字母,重点是如何控制两个g的打印顺序,让其可以轮流打印 //分别使用两个缓存为1的chan,来控制两个g的打印顺序 strChan:=make(chanint,1) numChan:=make(chanint,1) strChan<-0//先往字符chan中塞入,此时strChan再塞入会堵塞 //负责打印字母 gofunc(){ fori:=65;i<=90;i++{ <-strChan//strChan取出,因为之前先塞入了,所以此处不会堵塞,会直接打印字符A..Z fmt.Printf("%v",string(rune(i)))//打印字母 numChan<-i//numChan塞入,塞入后,另一个g的numChan取出操作才能进行 } return }() //负责打印数字 gofunc(){ fori:=1;i<

  • [翻译][erlang]cowboy handler模块的使用

    关于Cowboy Cowboy是基于Erlang实现的一个轻量级、快速、模块化的httpweb服务器。 Handlers,用于处理HTTP请求的程序处理模块。 PlainHTTPHandlers(常规Handlers) Cowboy里面的handler最基础的事情就是实现 init/2 回调函数,处理请求,发送客户端响应(可选),最后返回。Cowboy根据 routerconfiguration (路由配置)接收请求并初始化State。下面是一个不做任何处理的handler: init(Req,State)-> {ok,Req,State}复制 Cowboy为了保证每一个相应都能有客户端响应,尽管上面例子没有发送客户端返回,客户端仍然会收到一个 204NoContent 的响应。 下面是一个有返回响应的例子: init(Req0,State)-> Req=cowboy_req:reply(200,[ {<<"content-type">>,<<"text/plain"&g

  • C语言中的指针(二)

    指针指向谁,就把谁的地址赋给指针,指针变量和指针指向的内存变量是不一样的。不停的给指针赋值,相当于是不断的改变指针的指向。 在开发中要避免野指针的存在,在指针使用完毕之后,记得要给指针赋值成为NULL。 *就像一把钥匙,拿着指针变量中的地址区修改对应内存中的数值。 指针做函数参数是学习C语言中的核心内容。 间接赋值的三个条件 1,存在两个变量, 2,进行取地址赋值 3,,用*p来进行内存空间内容的修改。 指针的输入特性和输出特性。 字符串的两头堵模型。 字符串指向的内存空间如果是在常量区是不能进行修改的,如果想进行修改,就要显示的分配内存空间才可以 用const修饰指针。 每次进行递归调用的时候,都会将函数参数入栈。 关于递归有两点需要掌握: 递归参数的入栈模型 函数嵌套调用返回模型。 在进行递归调用的时候,一定要清楚哪些参数是不变的,哪些参数是变化的。 二级指针的内存模型: 二级指针做输入和输出模型 二级指针的第一种内存模型 在分配内存的时候,记得一定要free掉,同时避免野指针。将指针变量置成NULL。 指针做输出,被调用函数分配内存。 二级指针做输入的三中模型。 二级指针做输入的

  • Mssql数据库重命名方法

    进入SQLServer客户端: 一、右键数据库名,选择“属性”,然后会弹出一个页面,选择左侧的“选项”按钮,然后在右侧找到“状态”栏下的“限制访问”,将“限制访问”的值改为“SINGLE_USER”,然后点击下方的“确定”按钮 二、使用master权限执行以下SQL语句: Execsp_renamedb'dbold','dbnew'go 其中,dbold为原来的数据库名,dbnew为新的数据库名 三、1.执行以下SQL语句把数据库相关进程杀掉: USEmaster;GODECLARE@SQLVARCHAR(3000);SET@SQL='';SELECT@SQL=@SQL+';KILL'+RTRIM(SPID)FROM[sys].[sysprocesses]ASspsWHERE[sps].[dbid]=DB_ID('dbname');SET@SQL=SUBSTRING(@SQL,2,LEN(@SQL));EXEC(@SQL);GO 其中,dbname为新的数据库名,即在第二步中修改后的新数据库名 2.执行以下SQL语句,把数据库权限由单用户设置为多用户: ALTERDATABASE[db

  • P42(系列八)指数族分布4-对数配分函数与充分统计量-?连续性概率密度函数的期望

      justdoit!

  • 数字证书作用漫画

    1. 数字证书法律效力    2. 数字证书防篡改性  3. 数字证书身份真实性  4. 数字证书信息保密性  5. 数字证书防抵赖性

  • JS图片随机显示

    没什么难的,这里注意一下随机数的用法就行了 varImgList=newArray;//声明数组 ImgList[0]="https://image1.jpg"; ImgList[1]="https://image2.jpg"; ImgList[2]="https://image3.jpg"; varImgChoice=Math.floor(Math.random()*ImgList.length);//随机生成 document.getElementById('ImgContainer').css("background-image","url("+ImgList[ImgChoice]+")");//设置图片 /*$(".ImgContainer").css("background-image","url("+ImgList[ImgChoice]+")");*/复制   注:Math.floor(Math.random()*10)可以生成0~9的整数  

  • mysql笔记

    过去初学mysql的笔记,在此存一份在线文档 文章目录 一条sql的执行过程修改密码重置密码修改了权限不生效,需要刷新权限mysqld启动文件修改端口show命令my.cnfmysql服务启不来,要注意这几点:因为sock文件找不到登录不进去,解决办法$datadir目录下的文件解释mysqllogmysqladmin免密登录 一条sql的执行过程 连接数据库(如python的MySQLdb程序代码、api、客户端),创建起来通道连接,在数据库看来是一个空闲状态,创建好通道就可以向数据库服务器发送sql语句,不同的sql语句进入不同的接口(比如查询数据到一个接口,存储过程的sql就到另一个接口),然后开始解析(sql、权限),解析完了开始优化sql怎么去执行(比如是否使用索引、使用哪个索引),执行的时候会校验sql要查询的数据有没有缓存,因为mysql服务本身会占用大量的内存,会检查下内存中是否已经有数据,如果有缓存就返回来,如果没有缓存,就按引擎的规则来查询数据,查到后引擎把数据返回来。如果是做更新也是在引擎做数据结构的变更,变更后再返回结果。引擎决定数据怎么存储、怎么

相关推荐

推荐阅读