工具:Kettle使用指南

时间:2024-05-20 15:09:07

进入数据技术时代之后,数据本身就是一项重要的资产,如何使用这些资产是困扰企业的一大难题,特别是数据来源复杂、业务流程长、涉及模块广、历史数据更新迭代,都为从这项资产里面挖掘价值提供难度,但是话说回来,方法总比困难多。在使用数据资产之前,管理数据或者说跟数据建立联系是第一步要做的,我们从使用ETL工开始。

一、ETL是什么

ETL(Extract Transform Load三个单词的缩写),用来描述将数据从来源端经过萃取(extract)、转置(transform)、加载(load)至目的端的过程。没有相关经验的读者可能还是不明白,这里可以举一个生活中的例子–蔬菜商卖菜,首先农民伯伯从田地里收了很多蔬菜过来,有拖泥带水的、批黄带紫的,反正是各种蔬菜,各种泥水、黄叶子、烂叶子、蔫茎叶等等,不同蔬菜品种种植的农民伯伯最后统一运送到蔬菜商那里,蔬菜商根据实际蔬菜统一加工处理、去掉脏泥土、去掉黄叶子、去掉烂叶子,去掉蔫茎叶,然后统一打包送到蔬菜批发市场,从不同的蔬菜来源(这是extract过程)、经过加工统一处理(这是transform)、然后打包运送到蔬菜批发市场(这是加载过程),下一步就可以流入到菜市场中进行交易了,这个过程就像ETL一样,从五花八门的数据源,经过统一处理,最终加载到统一化平台处理。
目前市场上主流的ETL工具分两类:开源的和非开源的。
非开源ETL:一些传统的数据库服务提供商,基于数据库产品会提供配套的ETL工具,主要是非开源收费模式;
开源ETL:另外一种就是开源项目,随着市场对这块的需求越来越大,很多团队投入到开源的ETL开发中区,像Apache项目中就有Apache Camel、Apache Kafka等项目,另外目前业内用的比较多的还有Kettle等工具。

二、Kettle使用指南

  1. 简介
    kettle是一个独立的产品,但它包括了在ETL开发和部署阶段用到的多个程序。每个程序都有独立的功能,也或多或少的依赖于其他的程序。Kettle的主体框架如下:
    工具:Kettle使用指南
    描述上图里列出程序的主要功能。
    • Spoon:集成开发环境。提供了一个图形用户界面,用于创建/编辑作业或者转换。Spoon也可以用于执行/调试作业或转换,它也有性能监控功能。
    • Kitchen:作业的命令行运行程序,可以通过Shell脚本来调用。Shell脚本一般通过调度程序,如cron或Windows计划任务,来调度执行。
    • Pan:转换的命令行运行程序,和Kitchen一样通过Shell脚本来调用。执行转换而不是作业。
    • Carte:轻量级的HTTP服务器(基于Jetty),后台运行,监听HTTP请求来运行一个作业。Carte也用于分布式和协调跨机执行作业,也就是Kettle的集群。
  2. 安装
    Kettle的本身就是一个绿色免安装的程序(官网下载地址),但由于是Java程序开发的,所以在使用前,需要配置Java环境(可以参考编程:Windows10系统下安装JDK),解压下载后的安装程序,解压之后的文件目录如下:
    工具:Kettle使用指南
    Windows环境下Kettle的启动脚本是Spoon.bat,双击脚本文件,就进入到Kettle的主界面了,打开主界面的效果如下:
    工具:Kettle使用指南

三、通过Kettle实现SQL Server数据导入Oracel数据库中

  1. 准备
    之前有一篇博客讲JDBC(数据库:JDBC连接数据库汇总),讲到一个核心是如果要通过JDBC访问数据库,那么就需要相应的驱动程序,Kettle也不例外,在这个场景下面,我们涉及到SQL Server和Oracle两种数据库,所以我们需要下载以下两个数据库驱动文件:
    jtds-1.3.1.jar(SQLServer数据库连接依赖)和ojdbc14-10.2.0.4.0.jar(Oracle数据库连接依赖),并把相应文件放置到${KETTLE_HOME}\data-integration\lib目录下。
  2. 配置数据源
    Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。
    现在回过头梳理以下我们的需求,把保存在SQL Server上的数据表导入到Oracle数据表中去,我们把这个需求表示为三个动作:找到源数据、筛选我们需要的数据、导出到目的数据库中。如果用Kettle的语言表示就是:输入表->转换->输出表。
    工具:Kettle使用指南
    新建“转换”之后,我们需要在“DB连接”下新建我们的源数据库和目的数据库,,如下:
    工具:Kettle使用指南
    配置Oracle数据库的时候要注意,Kettle上显示的数据库名称其实是Oracle的实例名(Instance),数据库表空间才是真正的数据库名称。配置完之后可以点击下方的测试按钮测试配置是否正确。
    工具:Kettle使用指南
    测试连接正常之后,返回的信息如下:
    工具:Kettle使用指南
  3. 设计流程
    3.1 表输入
    首先我们在TAB“核心对象”->“输入”项(输入项在下方,这里没显示),双击或者拖到右边的画布中。
    工具:Kettle使用指南
    双击右边画布“表输入”,数据库连接选择源数据库,连接好之后可以点击“获取SQL查询语句…”按钮显示表中的所有字段,如下:
    工具:Kettle使用指南
    3.2 转换
    前面一步设置好表输入之后,我们需要设置转换功能,就是怎么加工源数据,我们这里不做处理,选择所有字段。
    工具:Kettle使用指南
    在“转换”过程中,可以选择需要改名或者需要修改字段属性的、或者移除相应字段功能。
    工具:Kettle使用指南
    3.3 表输出
    设置好表输入和转换规则之后,我们需要把最终的数据输出到哪里,在这个业务场景里,我们是想把数据输出到Oracle数据库中,所以我们需要设置表输出相关信息,可以通过双击“表输出”图标。
    工具:Kettle使用指南
    “表输出”的设置过程中,可以点击后面“浏览”按钮,从中选择,目标表是根据SQL Server的表结构原型,在Oracle新建的一张表,否则数据导不出来。具体的建表SQL可以参考系列文章(工具:SQL Server和Oracle数据类型比对

工具:Kettle使用指南
整个过程设置完之后,点击画布上方的执行按钮,Kettle就开始进行ETL工作了。

工具:Kettle使用指南

Kettle在进行导出数据的时候,还可以观察任务状态,最终导入完成功之后的数据库表如下:
工具:Kettle使用指南
工具:Kettle使用指南
问题:
1.Kettle表输出中有个“提交记录数量”默认是1000,这个数字是设置多少条记录提交一次commit,跟github代码提交时一个道理,一般情况设置的太大会出现异常错误,看日志又找不到具体原因是什么,把数值修改小了之后,确实能避免这个错误,有网友说是odbc驱动的问题。(详见kettle异常

2019/04/28 16:27:38 - 表输出.0 - Unexpected error inserting row
2019/04/28 16:27:42 - 表输出.0 - -32143

工具:Kettle使用指南

参考文献:

  1. 几款开源的ETL工具及ELT初探
  2. 开篇之Kettle的主题框架
  3. Kettle官网下载地址
  4. 利用Kettle进行SQLServer与Oracle之间的数据迁移实践
  5. Kettle中文网