ETL开源项目kettle总结

Kettle

1、ETL概述

ETL数据抽取Extract、转换Transform清洗、加载Load到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。ETL是BI项目重要的一个环节

数据抽取是指从源数据源系统抽取目的数据源系统需要的数据。实际应用中,数据源较多采用的是关系数据库.

数据抽取的方式:

全量抽取类似于数据迁移或数据复制,它将数据源中的表或视图的数据原封不动的从数据库中抽取出来,并转换成自己的ETL工具可以识别的格式。

增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据。在ETL 使用过程中,增量抽取较全量抽取应用更广。如何捕获变化的数据是增量抽取的关键。对捕获方法一般有两点要求:准确性,能够将业务系统中的变化数据按一定的频率准确地捕获到;性能,不能对业务系统造成太大的压力,影响现有业务。目前增量数据抽取中常用的捕获变化数据的方法有:

(a) 触发器方式(又称快照式)

在要抽取的表上建立需要的触发器,一般要建立插入、修改、删除三个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个临时表,抽取线程从临时表中抽取数据,临时表中抽取过的数据被标记或删除。优点:数据抽取的性能高,ETL加载规则简单,速度快,不需要修改业务系统表结构,可以实现数据的递增加载。 缺点:要求业务表建立触发器,对业务系统有一定的影响,容易对源数据库构成威胁。

(b) 时间戳方式

它是一种基于快照比较的变化数据捕获方式,在源表上增加一个时间戳字段,系统中更新修改表数据的时候,同时修改时间戳字段的值。当进行数据抽取 时,通过比较上次抽取时间与时间戳字段的值来决定抽取哪些数据。有的数据库的时间戳支持自动更新,即表的其它字段的数据发生改变时,自动更新时间戳字段的 值。有的数据库不支持时间戳的自动更新,这就要求业务系统在更新业务数据时,手工更新时间戳字段。

  • 优点:同触发器方式一样,时间戳方式的性能也比较好,ETL 系统设计清晰,源数据抽取相对清楚简单,可以实现数据的递增加载。
  • 缺点:时间戳维护需要由业务系统完成,对业务系统也有很大的倾入性(加入额外的时间戳字段),特别是对不支持时间戳的自动更新的数据库,还要求业务系统进行额外的更新时间戳操作;另外,无法捕获对时间戳以前数据的delete和update 操作,在数据准确性上受到了一定的限制。

(c) 全表删除插入方式

每次ETL 操作均删除目标表数据,由ETL 全新加载数据。

优点:ETL 加载规则简单,速度快。缺点:对于维表加外键不适应,当业务系统产生删除数据操作时,综合数据库将不会记录到所删除的历史数据,不可以实现数据的递增加载;同时对于目标表所建立的关联关系,需要重新进行创建。

 

Kettle概述

Kettle是开源的ETL工具,java编写,可以在Window、Linux、Unix上运行。允许管理来自不同数据库的数据,通过提供一个图形化的工具spoon进行操作。Kettle中有两种脚本文件,转换transformation和作业job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。kettle(PDI)工具

Kettle是一个组件化的集成系统,包括如下几个主要部分:

  • Spoon:图形化界面工具(GUI方式),Spoon允许你通过图形界面来设计Job和 Transformation,可以保存为文件或者保存在数据库中。也可以直接在Spoon图形化界面中运行Job和Transformation,
  • Pan:Transformation执行器(命令行方式),Pan用于在终端执行Transformation,没有图形界面。
  • Kitchen:Job执行器(命令行方式),Kitchen用于在终端执行Job,没有图形界面。

Kettle基本概念

1) 转换Transformation

Transformation(转换)是由一系列被称之为step(步骤)的逻辑工作的网络。转换本质上是数据流。转换是一组图形化的数据转换配置的逻辑结构。转换的两个相关的主要组成部分是step(步骤)和hops(节点连接)转换文件的扩展名是.ktr

2) 步骤Step

Steps(步骤)是转换的基础模块,比如一个文本文件输入或者一个表输出就是一个步骤。步骤的数据发送可以设置为轮流发送和复制发送;轮流发送:将数据行依次发给每一个输出跳;复制发送:将全部数据行发送给所有输出跳。

在Kettle中,所有的步骤都以并发的方式执行,当转换启动后,所有的步骤都同时启动,从它们的输入跳中读取数据,并把处理过的数据写到输出跳,直到输入跳里不再有数据,就中止步骤的运行。当所有的步骤都中止了,整个转换就中止了。

3) 跳Hops

Hops(节点连接)是数据的通道,用于连接两个步骤,使得元数据从一个步骤传递到另一个步骤。像似顺序执行发生的,但事实并非如此。节点连接决定了贯穿在步骤之间的数据流,步骤之间的顺序不是转换执行的顺序。当执行一个转换时,每个步骤都以自己的线程启动,并不断的接受和推送数据。步骤是同步开启和运行的,步骤的初始化的顺序是不可知的。在一个转换中,一个步骤可以有多个连接,数据流可以从一个步骤流到多个步骤。hops不仅允许数据从一个步骤流向另一个步骤,也决定了数据流的方向和所经步骤。如果一个步骤的数据输出到了多个步骤,那么数据既可以是复制的,也可以是分发的。

4)作业Job

作业包括一个或多个作业项,作业项以某种顺序来执行。作业项:与转换中的步骤类似,作业项也以图标的方式图形化展示。作业项之间可以传递结果对象。结果对象里包含了数据行,它们不是以流的方式来传递的。而是等一个作业项执行完了,再传递给下一个作业项。默认情况下,所有的作业项都是以串行的方式执行的。作业跳:作业之间的连线称为作业跳。作业里每个作业项的不同运行结果决定了作业的不同执行路径。

Kettle使用回溯算法来执行所有的作业项。即执行作业中的某条路径的某个节点时,要依次执行这个节点的所有子路径,直到没有再可以执行的子路径,就返回该节点的上一个节点,再反复该过程。注意:在作业中定义的跳是控制流,在转换中定义的跳是数据流。

 

Kettle的基本使用

1)Xml,json类型数据抽取

Kettle xml抽取到csv格式可以 (设置好xmlpath节点路径就可以,从子节点开始)

Kettle json抽取到csv格式可以 (设置好jsonpath节点路径就可以,从子节点开始),嵌套json需要使用java脚本!

2)连接资源库,各种不同数据库抽取

  • Gbase to mysql (关系型之间千万级数据抽取,性能调优加速导入)
  • Kettle表输出主键乱序,无法记录传到第几条,不适用传输中断
  • Mysql to mongoDB (关系型和非关系型之间可以传输)

3)Kettle定时任务,利用windwos,linux操作系统自带的定时任务

Windows使用自带的定时任务, Windows执行kettke任务的.bat脚本(kitchen)

Linux环境定时任务使用crontab,执行kettke的.shell脚本(kitchen)

 

Kettle调度问题是一个缺陷

kettle作为非常优秀的开源ETL工具得到了非常广泛的使用,一般的使用的都是使用客户端操作管理,但问题是当投入生产环境使用时,动辄上百或几百个job需要管理,这时在使用客户端管理已经很难完成了。

我所知道的解决方案有用命令行的调用的,操作麻烦,体验很差(基于命令行上构架出来的一般都用Linux的crontab、或者是Windows下用定时器等);还有就是开发web端管理工具,kettle自带了一个web端管理工具,界面极其简陋不说,还很难用,基本无法投入生产环境使用。

Kettle集成开发web项目成为商业可用

上述方法不能满足后,我开始寻求第三方工具,发现其实调度界的产品还是有很多,有Control-M、TASKCTL等专注调度的老牌厂商;有外包项目集成的Moia、ETS、WFT、IBM集成的调度工具;也有开源的Oozie、Zeus、Azkaban。

挨个查看一下资料后,感觉taskctl应该算里面比较简单的,试用后taskctl,还不错,他们家不仅仅对Kettle支持不错,基本上市面上常见的数据库、各种类似的大数据、ETL工具、各种脚本语言都有这不错的支持力度,即使不支持的,也可以自己扩展。

Kettle性能调优

性能调优在整个工程中是非常重要的,主要分两个方面:一方面是硬件调优,一方面是软件调优。

1) 调整JVM大小进行性能优化

在Kettle定时任务中的Kitchen与Pan脚本中修改,参数参考:

  • -Xmx1024m:设置JVM最大可用内存为1024M。
  • -Xms512m:设置JVM促使内存为512m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
  • -Xmn2g:设置年轻代大小为2G。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
  • -Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

2)调整提交(Commit)记录数大小进行优化

如修改RotKang_Test01中的“表输出”组件中的“提交记录数量”参数进行优化,Kettle默认Commit数量为:1000,可以根据数据量大小来设置Commitsize:1000~50000。

3) 调整记录集合里的记录数

4)尽量使用数据库连接池;提高批处理的commit size;尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流)

5)尽量用sql;插入大量数据的时候尽量把索引删掉;尽量避免使用update , delete操作,update会先delete后insert;

6)缩小输入的数据集的大小,增量更新也是为了这个目的;观察kettle log生成的方式来了解你的ETL操作最慢的地方

7)在ETL过程中的索引需要遵循以下使用原则:

1、当插入的数据为数据表中的记录数量10%以上时,首先需要删除该表的索引来提高数据的插入效率,当数据全部插入后再建立索引。

2、避免在索引列上使用函数或计算,在where子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描。

3、避免在索引列上使用 NOT和 “!=”,索引只能告诉什么存在于表中,而不能告诉什么不存在于表中,当数据库遇到NOT和 “!=”时,就会停止使用索引转而执行全表扫描。

你可能感兴趣的:(Kettle)