Kettle工具在实际中的一些应用说明
这里我就kettle工具在实际当中的一些应用做一些简单的说明,关于kettle工具的各个选项说明请参照以下文档。
一:资源库的设置
Kettle提供了两种资源库的选择方式:数据库存放、本地文件存放。
数据库
该方式是通过数据库连接直接在数据库里面创建kettle
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
,表里面记录着你所做的任何保存过的记录以及转换和任务。此方法是远程存放的方式,具有可多人共享一个资源库的优势,但是也存在资源库不稳定的缺点。
以下就数据库资源库具体怎么实现做一下介绍:
第一:
在tools选项下面有
在资源库选项里面有连接资源库选项,点击之后会出现如下界面:
刚开始的时候是没用任何连接的,需要根据自己的需要选择创建。
笔:修改资源库连接
加:添加新的资源库
叉:删除选中资源库
点那个加号图标就可以进入到新建选项页面:
在中间的显示栏中:第一行代表着写入到数据库的资源库、第二行代表着保存到本地的资源库。
点击第一行进入如下界面:
点击新建按钮将会新建数据库连接,如果已经有你需要的数据库连接也可以选择你需要的。
上面就是新建数据库页面,根据你的需要选择具体的数据库连接方式,填写好完成之后点击一下测试按钮,就可以知道数据库连接是否成功。
到这里,资源库的连接已经做了一半了。接下来介绍另一半要做的事情。
回到这个页面,填写唯一的ID、名称,然后点击创建或更新按钮,之后会出现一些SQL语句,执行这些语句,如果成功的话就创建成功了,如果失败则要检查一下数据库。最后点击确定按钮就成功了。
这个时候就可以连接资源库了。
选择你创建的资源库,admin用户的默认密码是admin ,点击OK就行了。
本地
接下来简单介绍一下本地资源库,其实是很简单的。
选择第二行。将会看到如下页面:
这个就是本地的页面,比数据库简单多了,选择一下存放路径,给它一个ID号和名称,点击OK就可以了。
资源库建好之后就会进入到主页面了:
这个就是主页面了,表面上是空空如也的。
关于资源库的设置就就讲到这里了,关于更多的介绍请参照官方说明文档!
二:实现增量更新的方法
Kettle工具并没有提供增量更新的选项,这个是要根据你的策略来实现的。基本的策略是根据时间字段来做增量更新。接下来我们就如何根据时间字段做增量更新。
要实现增量更新的前提必须是原表必须要有一个时间字段,然后目标表根据这个时间字段来做查询和更新。(具体思想请参照开源ETL工具之增量更新设计技巧文档)
如图:
我将一一解释一下各个选项的具体作用。
第一个表输入:
这个是要获取目标表要做增量更新的时间字段的最大值,这个值将会传递给下一个表输入。
此查询必须要保证只能传送一个值。
第二个表输入:
这个就是对原表的查询,要注意SQL语句里面的where子句。Where子句里面的判断字段就是做增量更新的时间字段,值就是前面一个表输入传递过来的。此时判断的值要用?来代替,这两个选项要这样设置。
表输出:
这里就是要进行更新的目标表了,也就是第一个表输入的表。里面具体的一些选项请参照kettle工具说明手册。
以上就是增量更新的实现方法。
三:JOB定时的实现方法
我们在实际应用当中往往要实现定时的功能,kettle提供了定时的功能,这个只能在任务里面实现定时的功能。
见如下图:
在JOB里面的start选项里面提供了定时机制,可以根据你的需求来选择你需要的定时类型
这里要注意一下,要定时的时候一定要把重复的按钮给勾选上。
这里是通过kettle提供的机制来进行定时的,另一种定时的机制是依靠写脚本语句来定时调用kettle脚本。(这种我们在后面会在脚本调用介绍到)
四:kettle变量的设置与获取
变量在kettle里面使用的比较频繁,这里我就做一下简单的介绍,具体的变量设置请根据实际情况来设置。我这里的案例是获取系统时间,然后分别设置四个变量,这四个变量分别代表着“年”、“月”、“日”、“时”。
如下图:
变量的相关选项在转换里面中的作业里面。
我获取的是系统信息是:系统日期(关于这个选项请参看kettle手册)
为了达到我之前的需求,我在这里运用了kettle另一个功能。
中的javascript脚本选项。
这个步骤是讲系统时间认为的分割为四个字段。这四个字段将会作为变量的值传递到下一个步骤。(关于这个选项请参看kettle手册)
接下来就是到设置变量这个环节了。
这里面可以设置多个变量,第一列是字段名称(是前面传过来的值),第二列是变量名(此后可以用变量名调用变量),第三是变量的活动类型(一般选择是作为全局变量)
第四列是给变量设置默认值。
以上就是变量设置的相关介绍,变量在使用之前必须先执行这个变量设置的转换,这样在后面才能实现对变量的调用。
关于变量的获取,这个在选项中只要有
这个标志的都是可以用变量的,变量的获取可以使用 CTRL+ALT+SPACE快捷键来选择你所需要的变量名。
五:通过shell脚本调用kettle文件
在部署有kettle工具的机器上可以通过写脚本文件来调用kettle文件,这样就能实现不打开kettle工具而后台实现kettle文件的运行。
在kettle工具的文件下有这样两个文件
一下就是我在linux系统下写的一个脚本调用的案例:
#!/bin/sh
. /etc/profile
sh /sybase/data-integration/kitchen.sh -rep=111 -user=admin -pass=admin -job=EXCL -dir="/EXCL/" -level=basic>/sybase/pdi/EXCLlog.txt
~
就关于几个参数做一下介绍。
sh /sybase/data-integration/kitchen.sh ——调用kettle文件下的kitchen.sh文件
-rep=111 ——资源库ID
-user=admin ——资源库登陆用户
-pass=admin ——登陆密码
-job=EXCL ——调用JOB的名称
-dir="/EXCL/" ——JOB的存放路径
-level=basic>/sybase/pdi/EXCLlog.txt ——kettle日志写入到文件中
相关的一些参数的详细说明如下:
Options:
-rep = Repository name
-user = Repository username
-pass = Repository password
-job = The name of the job to launch
-dir = The directory (dont forget the leading /)
-file = The filename (Job XML) to launch
-level = The logging level (Basic, Detailed, Debug, Rowlevel, Error, Nothing)
-logfile = The logging file to write to
-listdir = List the directories in the repository
-listjobs = List the jobs in the specified directory
-listrep = List the available repositories
-norep = Do not log into the repository
-version = show the version, revision and build date
-param = Set a named parameter
=. For example -param:FOO=bar
-listparam = List information concerning the defined parameters in the specified job.
-export = Exports all linked resources of the specified job. The argument is the name of a ZIP file.
-maxloglines = The maximum number of log lines that are kept internally by Kettle. Set to 0 to keep all rows (default)
-maxlogtimeout = The maximum age (in minutes) of a log line while being kept internally by Kettle. Set to 0 to keep all rows indefinitely (default)
在linux系统中可以使用crontab命令来做定时,下面就简单介绍一下这个命令。
crontab命令的功能是在一定的时间间隔调度一些命令的执行。在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。
crontab命令有三种形式的命令行结构:
crontab [-u user] [file]
crontab [-u user] [-e|-l|-r]
crontab -l -u [-e|-l|-r] 第一个命令行中,file是命令文件的名字。如果在命令行中指定了这个文件,那么执行crontab命令,则将这个文件拷贝到crontabs目录下;如果在命令行中没有制定这个文件,crontab命令将接受
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
输入(键盘)上键入的命令,并将他们也存放在crontab目录下。
命令行中-r选项的作用是从/usr/spool/cron/crontabs目录下删除用户定义的文件crontab;
命令行中-l选项的作用是显示用户crontab文件的内容。
使用命令crontab -u user -e命令编辑用户user的cron(c)作业。用户通过编辑文件来增加或修改任何作业请求。
执行命令crontab -u user -r即可删除当前用户的所有的cron作业。
作业与它们预定的时间储存在文件/usr/spool/cron/crontabs/username里。username使用户名,在相应的文件中存放着该用户所要运行的命令。命令执行的结果,无论是标准输出还是错误输出,都将以邮件形式发给用户。文件里的每一个请求必须包含以spaces和tabs分割的六个域。前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,称为命令字段,其中包括了crontab调度执行的命令。
第一道第五个字段的整数取值范围及意义是:
0~59 表示分
1~23 表示小时
1~31 表示日
1~12 表示月份
0~6 表示星期(其中0表示星期日)
/usr/lib/cron/cron.allow表示谁能使用crontab命令。如果它是一个空文件表明没有一个用户能安排作业。如果这个文件不存在,而有另外一个文件/usr/lib/cron/cron.deny,则只有不包括在这个文件中的用户才可以使用crontab命令。如果它是一个空文件表明任何用户都可安排作业。两个文件同时存在时cron.allow优先,如果都不存在,只有超级用户可以安排作业。
第1列分钟1~59
第2列小时1~23(0表示子夜)
第3列日1~31
第4列月1~12
第5列星期0~6(0表示星期天)
第6列要运行的命令
下面是crontab的格式:
分 时 日 月 星期 要运行的命令
这里有crontab文件条目的一些例子:
30 21 * * * /usr/local/apache/bin/apachectl restart
上面的例子表示每晚的21:30重启apache。
45 4 1,10,22 * * /usr/local/apache/bin/apachectl restart
上面的例子表示每月1、10、22日的4 : 45重启apache。
10 1 * * 6,0 /usr/local/apache/bin/apachectl restart
上面的例子表示每周六、周日的1 : 10重启apache。
0,30 18-23 * * * /usr/local/apache/bin/apachectl restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/apache/bin/apachectl restart
上面的例子表示每星期六的11 : 00 pm重启apache。
* */1 * * * /usr/local/apache/bin/apachectl restart
每一小时重启apache
* 23-7/1 * * * /usr/local/apache/bin/apachectl restart
晚上11点到早上7点之间,每隔一小时重启apache
0 11 4 * mon-wed /usr/local/apache/bin/apachectl restart
每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/apache/bin/apachectl restart
一月一号的4点重启apache
以上就是一些在实际应用中常用的一些技巧,接下来我们就根据具体的实例来做具体的分析和讲解。
六:实例讲解
1从FTP服务器上下载文件
这个是JOB实现的是每隔一个小时从FTP服务器上下载当前时段的一个文件。此JOB要实现的核心在于时间变量的设置,同时还需要根据你要下载的文件编写相应的正则表达式。
首先我们来看变量是如何设置的:
第一:获取使用获取系统信息选项,此选项在装换当中的输入文件夹下面。
打开此选项我们可以看到有如下一些选择:
这里根据我们的需求选择“系统日期(可变)”,这个是第一步,接下来就要使用到另一个重要的选项“javascript”。
第二:javascript选项来提取我们需要的时间格式
这里我们是要分别提取系统时间的“年”、“月”、“日”、“时”四个时段的值。这个选项提供一些相应的方法来实现这个功能,我使用的是date2str(var,var)方法,此方法的说明如下:
var dValue = new Date();
Alert(date2str(dValue));
Alert(date2str(dValue,"dd.MM.yyyy"));
Alert(date2str(dValue,"dd.MM.yyyy HH:mm:ss"));
Alert(date2str(dValue,"E.MMM.yyyy","DE"));
Alert(date2str(dValue,"dd.MM.yyyy HH:mm:ss","EN"));
Alert(date2str(dValue,"dd.MM.yyyy HH:mm:ss","EN", "EST"));
这个是选项中现成提供的一个,里面还有很多。这里不单可以使用选项本身带有的,还可以自己编写相应的javascript脚本语句。
以下就我获取不同时段的代码:
years=date2str(sysdate,"yyyy");
mons=date2str(sysdate,"MM");
days=date2str(sysdate,"dd");
hous=date2str(sysdate,"HH");
这里一共有四个字段,这意味我们在后面要分别设置四个变量。
好,接下来就让我们来看看最后一步:变量的设置
第三:变量设置
如图:
我设置了四个变量:分别是“年”、“月”、“日”、“时”,全部设置为全局变量。
好,到这里我们的定时下载FTP已经完成了第一步,这个为什么要设置四个变量呢?接下来就会知道了。
然后就是FTP选项的相关设置
如图:
第一个页面是填写相关的FTP服务的信息。填写正确之后有个“TEST CONNECTION”按钮可以测试服务器是否连接成功。在看下面有一个控制编码选项,这个选项是选择相应的文件编码格式,特别是文件在不同系统之间传输最容易导致乱码问题。这里手动指定相应的编码格式可以有效避免乱码问题。
第二个页面如下:
这里有两点需要注意一下,第一就是通配符选项。此选项是用来写相应的正则表达式来提取相应的文件。我们之前设置的变量也就是在这里使用。
我下载的是EXCL文件,文件名格式“广东电信C网拨测系统-服务质量支撑及管理系统-指标数据(2011年11月25日12点)”。我们要实现动态提取当前文件就得根据文件名当中哪些是变化的,这里明显可以看出文件名当中的时间是变化的,但是此时间不是标准的时间格式,所以我们使用了四个变量也就是如此了。
相应的正则表达式如下:
.*(${years}.*${mons}.*${days}.*${hous}.*).xls
另一个需要注意的地方就是:
此选项可以实现相应的文件操作,比如跳过、覆盖等等一些。
以上就是从FTP服务器下载的整个JOB 的流程,这个根据自己的需求还可以做很多变化,具体的有哪些变化,就交给大家去实践中体验了。
2从EXCL文件读取数据入库
上次我们讲到了从FTP下载文件,这次我们了解一下我们如何将EXCL文件导入到数据库当中。
Kettle工具提供了一个选项,此选项的功能是把excl文件的数据提取出来。
在使用这个选项的时候,必须EXCL文件格式是标准的表模式。(表模式—头一行是字段名,下面是数据行。)
我们就来看看详细的配置:
第一个页面大体就是这样一些,要注意的地方就是写文件通配符那里。这里可以写相关的正则表达式来提取你想要的特定文件以及使用变量。
第二个页面就是工作表,这里面选取excl文件中你需要的工作表。
这里可以设定你要的起始行和起始列。
第三个页面是内容:
这里可以设定相关的编码格式和一些选项。比如是否需要头部一行。
第四个页面是错误处理,这个才平常中很少使用。
第五个就是字段:
这个按钮可以实现获取头部的字段名,当然你也可以自己写字段名以及修改字段类型和大小。
以上就是EXCL选项的相关信息,这个我把数据提取出来了,就可以做相关的处理了。接下来我们就把数据入库。
数据库入库我们选用的选项就是表输入:
要注意的就是这个选项,此选项选上就可以使用页面下的这个两个功能。此功能是获取前面的步骤传入的字段,然后与数据库表里面的字段相配对。
这里还要注意一点的就是如果你要导入数据的表不存在的话,你可以点击页面下面的SQL按钮。如果表结构也有修改的话也可以点击SQL按钮来达到修改表结构的目的。当然也可以自己在那个SQL框写相应的SQL语句。
如下:
还有一点需要注意的,就是如果在导入数据之前需要把原表的数据清空的话可以勾选上
这个按钮,这样在每次导入数据之前都会清空原表数据的。
以上就是从EXCL文件读取数据入库的基本信息,中间可以添加其他的一些操作,这个根据具体的需求来做相应的处理。
3从文本文件抽取数据入库
大体步骤如图:
这里我中间加了一个字段选择步骤,此步骤也是在实际应用当中经常会用到的一个选项。
我们先来看看文本文件输入选项的相关页面。
这个跟EXCL文件输入差不多,具体要注意的地方就是第二个页面。在内容页面需要注意一下几点:分隔符、格式、编码方式。
特别是在linux下面使用的时候一定要记得选择linux相对应的格式和编码方式。我推荐使用的编码方式是GB2312。分隔符则是对要跟文本文件的分隔符一致,如果不一致的话则会导致数据无法正确的读取。格式是根据你使用的操作系统来决定使用什么格式。
我们要重点讲的是字段选择这个选项的使用。
主要页面如图:
有选择和修改、移除、元数据三个页面。
选择和删除页面主要实现对字段名的修改和选择。
移除页面主要实现对相关字段在数据流中的移除。
元数据页面则功能稍微多一些,如图:
也是实现对字段类型的修改和重命名。
表输出就不重复了,这个和之前差不多的。
以上就是从文本文件抽取数据入库的相关说明。
4从oracle数据库到sybase数据库
最基本的就是如下步骤:
从数据库到数据库最基本只要两个步骤就可以实现了。表输入与表输出。
表输入:
关于表输入的具体说明之前已经介绍过,这里就不多讲了。
从oracle数据库到sybase数据库遇到的最大的问题就是字段类型不符。
特别是特殊字符的处理,有可能在oracle数据库里面是可读的,但是在sybase数据库里面就是不可读的,此时中间就需要额外的步骤来对出问题的字段进行处理。常用到的处理主要有以下一些:
经常用到的主要有:、、、
等等一些。具体的根据具体需求选择相适应的选项。各个相关选项的具体说明请参考“智能数据比对系统ELT平台操作手册V1.0”。
5 kettle集群服务的使用。
这里就简单的介绍一下集群。相关的一些说明请参考一下两个文件:
6通过JOB调用linux shell脚本
这个JOB只有两个步骤,就是直接使用shell选项来调用linux下的shell脚本。
具体的设置如图:
如果你的shell脚本需要传入参数则在下面的参数框里面填写相应的参数,当然参数也可以有前面的步骤传入进来。如果你不调用脚本,想自己写相关的脚本则勾选上:
这样一来你就可以在页面进行脚本的编写。
7如何实现JOB里面的并发执行
JOB里面默认的是串行执行,就是先执行完一个步骤,在执行下一个步骤。此方法在某些时候是可用的,但是某些情况是需要多个步骤并发执行的,这个时候就需要设置START选项的相关配置。如图:
将那个Lanuch....那个选项给勾选上就可以实现并发执行了。
8将转换或JOB日志写入数据库
Kettle工具提供了日志功能,此功能可以将转换或JOB的相关信息记入到数据库表中。
转换和JOB的日志类型不一样,我们就来一一介绍一下。
转换日志的相关配置在这里,如图:
点击设置就可以进入到如下页面:
可以看到转换有四种类型的日志:Transformation 、Setp、Performance、Logging Channels
以下就是这四种日志字段的相关说明:
Transformation:
Setp:
Performance:
Logging Channels:
JOB的日志类型有这几种类型:Job、Job Entry、Logging Channels
Job
Job Entry:
Logging Channels:
将这些日志写入到数据库只需两步就可以完成,一是选择一个数据库连接,二是给日志表一个名字。最后就是点击SQL按钮,这样在数据库里面就创建了相应的日志表,以后每运行一次都会在日志表记录一行数据。
9使用SQL脚本选项执行相关SQL语句
上面这个JOB实现的功能是在调用shell脚本之前先把相关表的数据清空,然后在执行shell脚本填充数据。
我们就来介绍一个SQL选项的使用方法,如图:
从上图我们可以看出这个选项的重点就是SQL语句的编写。这个不单可以自己编写相应的SQL语句也可以把SQL语句写入到文件,然后再调用文件。
在SQL脚本编写框中也是同样可以使用变量。
以上就是一些在实际应用中用到的技术,希望能给大家带来一点点帮助,当然这个文档还有很多不足和欠缺的地方,最后我就把以上的技术结合的JOB截图给大家参考一下。
10实例样本
全量更新:
这两JOB都是实现全量更新。根据数据量的不同来采用不同的方法,数据量不多可以采用第一种,数据量较大可以采用第二种(编写相关的抽数脚本)
增量更新:
这个也是根据数据量的不同来采用不同的方法。
从FTP下载EXCL文件入库:
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
最后一步是一个总的JOB,这里面嵌套了很多个JOB。主要是一个FTP下载JOB,另一个是EXCL文件入库JOB。
FTP的JOB里面又嵌套了一个设置变量的转换和FTP下载JOB。EXCL入库的JOB里面嵌套了两个相关的转换。
以上都是在实际应用中使用到的。最后介绍一下相关的抽数脚本已经sybase数据库的bcp使用方法。
抽数脚本:
. /home/sybase/.bash_profile
ROADDATA=/sqms/file/crm/txt
TABLE_NAME=TB_BA_ACTION_HIST
#---------------------------------
#export table CRM_DG.V_TB_BA_ACTION_HIST from ORACLE DATABASE
rm -f ${ROADDATA}/${TABLE_NAME}.txt
cd ${ROADDATA}
touch ${TABLE_NAME}.txt
chmod -R 777 ${ROADDATA}/${TABLE_NAME}.txt
echo "exporting table CRM_DG.V_${TABLE_NAME}............."
ociuldr.bin user="VW_GD_SQMS/Aa123456@dgodsrd" query="select * from CRM_DG.V_${TABLE_NAME} where hist_create_date>to_date(to_char(sysdate-2,'yyyymmdd'),'yyyymmdd') and hist_create_date<=to_date(to_char(sysdate-1,'yyyymmdd'),'yyyymmdd')" field="@|@" file=${ROADDATA}/${TABLE_NAME}.txt log=${ROADDATA}/${TABLE_NAME}.log
echo "finished export table CRM_DG.V_${TABLE_NAME}............."
#import table CRM_DG.V_TB_BA_ACTION_HIST to SYBASE
echo "importing table CRM_DG.V_${TABLE_NAME}............"
bcp sqms_anal..CRM_${TABLE_NAME} in "${ROADDATA}/${TABLE_NAME}.txt" -c -Y -t"@|@" -r"\n" -Jcp936 -Usqmsoper -P111111 -SSQMSDB02
echo "finished import table CRM_DG.V_${TABLE_NAME}............."
Bcp:
表数据导出如:bcp 数据库名..表名 out '路径名' -c -Y -J字符集 -u用户名 -P密码 -S服务名
表数据导如如:bcp 数据库名..表名 in '路径名' -c -Y -J字符集 -u用户名 -P密码 -S服务名
比如:
bcp sqms_appl..SPS_TB_BA_SUBSCRIPTION_HIST out "/data/pdi/test/SPS_TB_BA_SUBSCRIPTION_HIST.bcp" -n -Y -Jcp936 -Usqmsoper -P111111 -SSQMSDB01
详细说明请参考以下文档:
_1234567891.doc
开源ETL工具kettle系列之增量更新设计技巧
作者:IT168 gemini5201314
ETL中增量更新是一个比较依赖与工具和设计方法的过程,Kettle中主要提供Insert / Update 步骤,Delete 步骤和Database Lookup 步骤来支持增量更新,增量更新的设计方法也是根据应用场景来选取的,虽然本文讨论的是Kettle的实现方式,但也许对其他工具也有一些帮助。本文不可能涵盖所有的情况,欢迎大家讨论。
应用场景
增量更新按照数据种类的不同大概可以分成:
1. 只增加,不更新,
2. 只更新,不增加
3. 即增加也更新
4. 有删除,有增加,有更新
其中1 ,2, 3种大概都是相同的思路,使用的步骤可能略有不同,通用的方法是在原数据库增加一个时间戳,然后在转换之后的对应表保留这个时间戳,然后每次抽取数据的时候,先读取这个目标数据库表的时间戳的最大值,把这个值当作参数传给原数据库的相应表,根据这个时间戳来做限定条件来抽取数据,抽取之后同样要保留这个时间戳,并且原数据库的时间戳一定是指定默认值为sysdate当前时间(以原数据库的时间为标准),抽取之后的目标数据库的时间戳要保留原来的时间戳,而不是抽取时候的时间。
对于第一种情况,可以使用Kettle的Insert / Update 步骤,只是可以勾选Don’t perform any update选项,这个选项可以告诉Kettle你只会执行Insert 步骤。
对于第二种情况可能比较用在数据出现错误然后原数据库有一些更新,相应的目标数据库也要更新,这时可能不是更新所有的数据,而是有一些限定条件的数据,你可以使用Kettle的Update 步骤来只执行更新。关于如何动态的执行限定条件,可以参考前一篇文章。
第三种情况是最为常见的一种情况,使用的同样是 Kettle的Insert / Update 步骤,只是不要勾选Don’t perform any update 选项。
第四种情况有些复杂,后面专门讨论。
对于第1,2,3种情况,可以参考下面的例子。
这个例子假设原数据库表为customers , 含有一个id , firstname , lastname , age 字段,主键为id , 然后还加上一个默认值为sysdate的时间戳字段。转换之后的结果类似:id , firstname , lastname , age , updatedate . 整个设计流程大概如下:
图1
其中第一个步骤的sql 大概如下模式:
Select max(updatedate) from target_customer ;
你会注意到第二个步骤和第一个步骤的连接是黄色的线,这是因为第二个table input 步骤把前面一个步骤的输出当作一个参数来用,所有Kettle用黄色的线来表示,第二个table input 的sql 模式大概如下:
Select field1 , field2 , field3 from customers where updatedate > ?
后面的一个问号就是表示它需要接受一个参数,你在这个table input 下面需要指定replace variable in script 选项和execute for each row 为选中状态,这样,Kettle就会循环执行这个sql , 执行的次数为前面参数步骤传入的数据集的大小。
图2
关于第三个步骤执行insert / update 步骤需要特别解释一下,
图3
Kettle执行这个步骤是需要两个数据流对比,其中一个是目标数据库,你在Target table 里面指定的,它放在The keys to look up the values(s) 左边的Table field 里面的,另外一个数据流就是你在前一个步骤传进来的,它放在The keys to look up the value(s) 的右边,Kettle首先用你传进来的key 在数据库中查询这些记录,如果没有找到,它就插入一条记录,所有的值都跟你原来的值相同,如果根据这个key找到了这条记录,kettle会比较这两条记录,根据你指定update field 来比较,如果数据完全一样,kettle就什么都不做,如果记录不完全一样,kettle就执行一个update 步骤。所以首先你要确保你指定的key字段能够唯一确定一条记录,这个时候会有两种情况:
1.维表
2.事实表
维表大都是通过一个主键字段来判断两条记录是否匹配,可能我们的原数据库的主键记录不一定对应目标数据库中相应的表的主键,这个时候原数据库的主键就变成了业务主键,你需要根据某种条件判断这个业务主键是否相等,想象一下如果是多个数据源的话,业务主键可能会有重复,这个时候你需要比较的是根据你自定义生成的新的实际的主键,这种主键可能是根据某种类似与sequence 的生成方式生成的,
事实表在经过转换之后,进目标数据库之前往往都是通过多个外键约束来确定唯一一条记录的,这个时候比较两条记录是否相等都是通过所有的维表的外键决定的,你在比较了记录相等或不等之后,还要自己判断是否需要添加一个新的主键给这个新记录。
上面两种情况都是针对特定的应用的,如果你的转换过程比较简单,只是一个原数据库对应一个目标数据库,业务主键跟代理主键完全相同的时候完全可以不用考虑这么多。
有删除,有增加,有更新
首先你需要判断你是否在处理一个维表,如果是一个维表的话,那么这可能是一个SCD情况,可以使用Kettle的Dimension Lookup 步骤来解决这个问题,如果你要处理的是事实表,方法就可能有所不同,它们之间的主要区别是主键的判断方式不一样。
事实表一般都数据量很大,需要先确定是否有变动的数据处在某一个明确的限定条件之下,比如时间上处在某个特定区间,或者某些字段有某种限定条件,尽量最大程度的先限定要处理的结果集,然后需要注意的是要先根据id 来判断记录的状态,是不存在要插入新纪录,还是已存在要更新,还是记录不存在要删除,分别对于id 的状态来进行不同的操作。
处理删除的情况使用Delete步骤,它的原理跟Insert / Update 步骤一样,只不过在找到了匹配的id之后执行的是删除操作而不是更新操作,然后处理Insert / Update 操作,你可能需要重新创建一个转换过程,然后在一个Job 里面定义这两个转换之间的执行顺序。
如果你的数据变动量比较大的话,比如超过了一定的百分比,如果执行效率比较低下,可以适当考虑重新建表。
另外需要考虑的是维表的数据删除了,对应的事实表或其他依赖于此维表的表的数据如何处理,外键约束可能不太容易去掉,或者说一旦去掉了就可能再加上去了,这可能需要先处理好事实表的依赖数据,主要是看你如何应用,如果只是简单的删除事实表数据的话还比较简单,但是如果需要保留事实表相应记录,可以在维表中增加一条记录,这条记录只有一个主键,其他字段为空,当我们删除了维表数据后,事实表的数据就更新指向这条空的维表记录。
定时执行增量更新
可能有时候我们就是定时执行更新操作,比如每天或者一个星期一次,这个时候可以不需要在目标表中增加一个时间戳字段来判断ETL进行的最大时间,直接在取得原数据库的时间加上限定条件比如:
Startdate > ? and enddate < ?
或者只有一个startdate
Startdate > ? (昨天的时间或者上个星期的时间)
这个时候需要传一个参数,用get System Info 步骤来取得,而且你还可以控制时间的精度,比如到天而不是到秒的时间。
当然,你也需要考虑一下如果更新失败了怎么处理,比如某一天因为某种原因没有更新,这样可能这一天的记录需要手工处理回来,如果失败的情况经常可能发生,那还是使用在目标数据库中增加一个时间字段取最大时间戳的方式比较通用,虽然它多了一个很少用的字段。
执行效率和复杂度
删除和更新都是一项比较耗费时间的操作,它们都需要不断的在数据库中查询记录,执行删除操作或更新操作,而且都是一条一条的执行,执行效率低下也是可以预见的,尽量可能的缩小原数据集大小。减少传输的数据集大小,降低ETL的复杂程度
时间戳方法的一些优点和缺点
优点: 实现方式简单,很容易就跨数据库实现了,运行起来也容易设计
缺点: 浪费大量的储存空间,时间戳字段除ETL过程之外都不被使用,如果是定时运行的,某一次运行失败了,就有可能造成数据有部分丢失.
其他的增量更新办法:
增量更新的核心问题在与如何找出自上次更新以后的数据,其实大多数数据库都能够有办法捕捉这种数据的变化,比较常见的方式是数据库的增量备份和数据复制,利用数据库的管理方式来处理增量更新就是需要有比较好的数据库管理能力,大多数成熟的数据库都提供了增量备份和数据复制的方法,虽然实现上各不一样,不过由于ETL的增量更新对数据库的要求是只要数据,其他的数据库对象不关心,也不需要完全的备份和完全的stand by 数据库,所以实现方式还是比较简单的.,只要你创建一个与原表结构类似的表结构,然后创建一个三种类型的触发器,分别对应insert , update , delete 操作,然后维护这个新表,在你进行ETL的过程的时候,将增量备份或者数据复制停止,然后开始读这个新表,在读完之后将这个表里面的数据删除掉就可以了,不过这种方式不太容易定时执行,需要一定的数据库特定的知识。如果你对数据的实时性要求比较高可以实现一个数据库的数据复制
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
,如果对实时性的要求比较低,用增量备份会比较简单一点。
几点需要注意的地方:
1.触发器
无论是增量备份还是数据复制,如果原表中有触发器,在备份的数据库上都不要保留触发器,因为我们需要的不是一个备份库,只是需要里面的数据,最好所有不需要的数据库对象和一些比较小的表都不用处理。
2.逻辑一致和物理一致
数据库在数据库备份和同步上有所谓逻辑一致和物理一致的区别,简单来说就是同一个查询在备份数据库上和主数据库上得到的总的数据是一样的,但是里面每一条的数据排列方式可能不一样,只要没有明显的排序查询都可能有这种情况(包括group by , distinct , union等 ),而这可能会影响到生成主键的方式,需要注意在设计主键生成方式的时候最好考虑这一点,比如显式的增加order 排序. 避免在数据出错的时候,如果需要重新读一遍数据的时候主键有问题.
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
增量更新是ETL中一个常见任务,对于不同的应用环境可能采用不同的策略,本文不可能覆盖所有的应用场景,像是多个数据源汇到一个目标数据库,id生成策略,业务主键和代理主键不统一等等,只是希望能给出一些思路处理比较常见的情况,希望能对大家有所帮助。
_1234567893.doc
Kettle集群实例
Kettle cluster example
2011年9月27日
高健
唾沫星冲锋枪 416922877
技术群53272400
概述:
本文的实例是我在实验以后编写的,有详细的步骤截图说明,适用于初用KETTLE做集群的朋友作为参考。本文分两部分,先介绍实例操作后说原理。
Part A
配置jetty容器
配置文件在 $kettlehome$ \data-integration\pwd下,没有的话手动建立一下, 需要修改的是三个xml文件内容,其中master为主服务的配置,另外两个为子服务。
Carte-config-master-8381.xml
Carte-config -8382.xml
Carte-config -8383.xml
启动jetty容器
在kettle的路径下找到carte.bat,在控制台下启动,使用carte ip port命令。
三个容器启动成功。
配置集群子服务
在spoon环境下配置子服务,其中Q1为主服务,要勾选上“是主服务器”,Q2和Q3为从服务器。
配置集群schemas
制作转换
转换制作完成后,在需要使用集群的步骤上选择集群即可。如下图。
集群执行
执行时选择集群执行。如下图。
查看执行结果。
Part B
集群允许转换以及转换中的步骤在多个服务器上并发执行。在使用kettle集群时,首先需要定义的是Cluster schema。所谓的Cluster schema就是一系列的子服务器的集合。在一个集群中,它包含一个主服务器(Master)和多个从属服务器服务器(slave)。如下图所示。
子服务器(Slave servers)允许你在远程服务器上执行转换。建立一个子服务器需要你在远程服务器上建立一个叫做“Carte”的 web 服务器,该服务器可以从Spoon(远程或者集群执行)或者转换任务中接受输入。
在以后的描述中,如果我们提到的是子服务器,则包括集群中的主服务器和从属服务器;否则我们会以主服务器和从属服务器来进行特别指定。
_1234567894.pdf
实用程序指南
Adaptive Server® Enterprise
15.5
[Windows 和 UNIX]
文档 ID:DC32967-01-1550-01
最后修订日期:2009 年 11 月
版权所有 © 2010 Sybase, Inc. 保留所有权利。
本出版物适用于 Sybase 软件及所有后续版本,除非在新版本或技术说明中另有说明。此文档中的信息如有更改,恕不另行
通知。此处说明的软件按许可
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
提供,其使用和复制必须符合该协议的条款。
若要订购附加文档,美国和加拿大的客户请拨打客户服务部门电话 (800) 685-8225 或发传真至 (617) 229-9845。
持有美国许可协议的其它国家 /地区的客户可通过上述传真号码与客户服务部门联系。所有其它国际客户请与 Sybase 子公司
或当地分销商联系。仅在定期安排的软件发布日期提供升级。未经 Sybase, Inc. 的事先书面许可,本书的任何部分不得以任
何形式、任何手段(电子的、机械的、手动、光学的或其它手段)进行复制、传播或翻译。
Sybase 商标可在位于 http://www.sybase.com/detail?id=1011207 的“Sybase 商标页” (Sybase trademarks page)处进行查看。
Sybase 和文中列出的标记均是 Sybase, Inc. 的商标。 ® 表示已在美国注册。
Java 和所有基于 Java 的标记都是 Sun Microsystems, Inc. 在美国和其它国家 /地区的商标或注册商标。
Unicode 和 Unicode 徽标是 Unicode, Inc. 的注册商标。
IBM 和 Tivoli 是 International Business Machines Corporation 在美国和 /或其它国家 /地区的注册商标。
提到的所有其它公司和产品名均可能是与之相关的相应公司的商标。
Use, duplication, or disclosure by the government is subject to the restrictions set forth in subparagraph (c)(1)(ii) of DFARS 52.227-7013
for the DOD and as set forth in FAR 52.227-19(a)-(d) for civilian agencies.
Sybase, Inc., One Sybase Drive, Dublin, CA 94568.
实用程序指南 iii
关于本手册 ............................................................................................................................. xi
第 1 章 使用 dataserver 建立服务器 ............................................................ 1
简介 ................................................................................................. 1
建立新的主设备 ............................................................................... 2
使用 dataserver 时的环境 ......................................................... 3
建立模式 ................................................................................... 3
启动模式 ................................................................................... 6
升级到具有更大页大小的服务器 ............................................... 7
查看当前服务器的限制 ............................................................. 7
第 2 章 从命令行使用交互式 isql .................................................................. 9
准备工作 .......................................................................................... 9
启动和停止 isql