让Kettle来看看数据怎么迁移

344 阅读9分钟

经济型etl工具:Kettle

一、业务场景

  • 表视图模式:这种情况也是我们最常用的,就是在同一网络环境下,我们对各种数据源的表数据进行抽取、过滤、清洗等,例如数据迁移、异构系统数据交互(多种数据来源或输出)、报表输出、备份等都归属于这个模式;传统的实现方式一般都要进行研发,涉及到一些复杂的一些业务逻辑如果我们研发出来还容易出各种bug;通过kettle能使这些作业流程可视化(输入,转换,校验,输出),减低开发和测试的沟通成本。
  • 前置机模式:这是一种典型的数据交换应用场景,数据交换的双方A和B网络不通,但是A和B都可以和前置机C连接,一般的情况是双方约定好前置机的数据结构,这个结构跟A和B的数据结构基本上是不一致的,这样我们就需要把应用上的数据按照数据标准推送到前置机上,这个研发工作量还是比较大的;这时候通过kettle,能把各种结构的数据标准化,业务方拉倒数据即可使用。

  • 文件模式: 数据交互的双方A和B是完全的物理隔离,这样就只能通过以文件的方式来进行数据交互了,例如XML格式,在应用A中我们开发一个接口用来生成标准格式的XML,然后用优盘或者别的介质在某一时间把XML数据拷贝之后,然后接入到应用B上,应用B上在按照标准接口解析相应的文件把数据接收过来;

二、kettle概述

1. 什么是etl

定义:用来描述将数据从源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程,它能够对各种分布的、异构的源数据(如关系数据)进行抽取,按照预先设计的规则将不完整数据、重复数据以及错误数据等“脏"数据内容进行清洗,得到符合要求的“干净”数据,并加载到数据仓库中进行存储,这些“干净”数据就成为了数据分析、数据挖掘的基石。除此之外,对于开发人员来说,我们经常会还会遇到各种数据的处理,转换,迁移,掌握一种ETL工具的使用,必不可少。开发常用的etl工具有:Kettle,Datastage,Informatica,Talend

2. kettle简介

Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,无需安装,数据抽取高效稳定。Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。下载地址:www.kettle.org.cn/download

3. kettle的四大核心组件

4. Kettle的“经济性”

三、kettle的核心概念

1. 可视化编程

kettle可以被归类为可视化编程语言,因为kettle可以使用图形化的方式定义复杂etl程序和工作流。
可视化一直是kettle 的里的核心概念,它可以让你快速构建复杂的etl作业和减低维护的工作量,它通过隐藏很多的技术细节,使IT领域更贴近于商务领域

2. 转换transform

转换负责数据的输入,转换,校验,输出等工作。
kettle中使用转换完成数据ETL的全部工作,转换由多个步骤(step)组成,如文本的输入,过滤,执行sql脚本等等,每个步骤使用跳(Hop)来链接,跳定义了一个数据流通道,即数据有一部步骤跳向下一个步骤,在kettle中的数据最小单位为行(row),数据流中流动的是缓存的行(Rowset)

3. 步骤step

步骤(控件)是转换里面的基本组成部分
一个步骤有如下几个关键的特性:
1、一个步骤要有一个名字,这个名字在同一个转换范围内唯一。
2、每个步骤都会读和写数据行(从上一个跳中读,往下一个跳中写)
3、一个步骤可以有多个输出跳,并可以设置为复制或者分发

4. 跳hop

跳是步骤之间的连线,跳定义了步骤之间的数据通道。
跳实际上是两个步骤之间的被称之为行集的数据缓存,行集的大小可以在转换里面定义,当行集满了,向行集写数据的步骤就会停止,直到行集里面又有了空间。

5. 作业job

负责定义一个完成整个工作流的控制,比如将转换的结果发送邮件给相关的人员,因为转换以并行的方式执行,所以必须存在一个串行的调度工具来执行转换,这个就是作业。

6. 并行

跳的这种基于行集缓存的规则允许每个步骤都是由一个独立的线程运行,这样并发程度最高。这一规则也允许数据以最小消耗内存的数据流的方式来处理。在数据仓库里,我们经常要处理大量数据,所以这种高并发低消耗的方式也是ETL工具的核心需求。

对于kettle的转换,不能定义一个执行顺序,因为所有步骤都以并发方式执行:当转换启动后,所有步骤都同时启动,从它们的输入跳中读取数据,并把处理过的数据写到输出跳,直到输入跳里不再有数据,就中止步骤的运行。当所有的步骤都中止了,整个转换就中止了。

如果你想要一个任务沿着指定的顺序执行,则需要使用“作业”!

7. 转换与作业的区别

8. 丰富的控件

常用的如下图

输入控件,顾名思义就是将数据从其它载体中输入到kettle中,即抽取数据过程,我们可以从数据库表中获取,从文本文件,EXCEL,XML等文件获取,还可以只在kettle中模拟数据,或者获取系统中的参数,往往是kettle的开始部分。

输出控件,即相对上边输入,是对经过kettle处理的数据进行向数据库,各种文件的输出。往往是kettle转换的结束部分,也就是加载部分。

转换,这个是转换过程中,我们可以通过这些控件,添加新的字段,例如:主键,删除标识等。还有对字符串字段的各种处理,对字段的各种处理。即我们转换中对数据的加工过程。

应用控件:即我们转换中的一些辅助控件,例如发送邮件,写日志等。

流控件:是控制整个转换流程,数据流向的一些控件,例如Swich/Case就像Java的 if else等,过滤记录来过滤一些我们不想操作的记录等。

脚本,主要是针对JS,SQL,Java三种语言的支持。当kettle提供的空间无法满足业务需求,可以通过编写代码脚本,通过kettle调用实现,比如说发送mq等操作。

查询控件:主要是针对数据库表的查询操作,还有就是HTTP,webservice的获取工作等。

9. 资源库

如果是多人团队开发的话,除了使用SVN,GIT等版本控制软件,还可以使用Kettle的资源库,它会将转换和作业相关的信息保存在数据库中。

在kettle中的转换或者作业等资源的存储的仓库称为资源库:分为文件资源库、数据库资源库。

一个转换或者作业可以属于某个资源库或者一个单独的文件形态存在。

默认账号密码:admin/admin

四、案例

查询出制单号和业务订单的关联关系并生成excle文件,通过邮件发送给到财务

表结构ER模型

可以把需求拆分为两步,1、生成附件 2、发送邮件

同理,在kettle中就一个定义一个生成附件的转换过程(.ktr),再定一个工作流(.ktj),串起来后发送邮件。

整体的作业图如下:

生成excle转换如下:

可以看出,kettle提供了各种控件,让我们可以简单的拖拉组合配置,即可实现我们各种功能。

x五、kettle的最佳实践

  • 当输入对象为CSV文件时,将NIO Buffer Size从默认的50000改到最佳的200000。

  • 当输出对象为表输出时,将提交记录数量从默认的1000改到最佳的4000。

  • 尽可能关闭转换过程中一切与数据库相关的日志,如表日志、索引日志等。
  • 在插入数据之前,先使索引unusable,数据导完之后再rebuild索引,避免大量的更新索引。需要注意的是,像数据库去重这种需要索引来优化查询速度的情况可以排除在外。
  • 尽量使用数据库连接池
  • 尽量提高批处理的'commit size'
  • 尽量使用缓存,缓存尽量大一些
  • Kettle 是Java 做的,尽量用大一点的内存参数启动Kettle.
  • 尽量避免使用update , delete 操作,尤其是update , 如果可以把update 变成先delete ,后insert。
  • 能使用truncate table 的时候,就不要使用delete all row 这种类似sql
  • 尽量缩小输入的数据集的大小(增量更新也是为了这个目的)