Kettle是一款国外开源的ETL工具,纯java编写,能够在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。java
Kettle 中文名称叫水壶,该项目的主程序员MATT 但愿把各类数据放到一个壶里,而后以一种指定的格式流出。 linux
Kettle这个ETL工具集,它容许你管理来自不一样数据库的数据,经过提供一个图形化的用户环境来描述你想作什么,而不是你想怎么作。 程序员
Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工做流的控制。 sql
Kettle能够在http://kettle.pentaho.org/网站下载到。 shell
1. Transformation 转换步骤,能够理解为将一个或者多个不一样的数据源组装成一条数据流水线。而后最终输出到某一个地方,文件或者数据库等。数据库
2. Job 做业,能够调度设计好的转换,也能够执行一些文件处理(比较,删除等),还能够 ftp 上 传,下载文件,发送邮件,执行 shell 命令等缓存
3. Hop 链接转换步骤或者链接 Job(实际上就是执行顺序) 的连线 Transformation hop:主要表示数据的流向。从输入,过滤等转换操做,到输出。网络
Job hop:可设置执行条件: 1, 无条件执行 2, 当上一个 Job 执行结果为 true 时执行 3, 当上一个 Job 执行结果为 false 时执行数据结构
表视图模式:这种状况咱们常常遇到,就是在同一网络环境下,咱们对各类数据源的表数据进行抽取、过滤、清洗等,例如历史数据同步、异构系统数据交互、数据对称发布或备份等都归属于这个模式;传统的实现方式通常都要进行研发(一小部分例如两个相同表结构的表之间的数据同步,若是sqlserver数据库能够经过发布/订阅实现),涉及到一些复杂的一些业务逻辑若是咱们研发出来还容易出各类bug;工具
前置机模式:这是一种典型的数据交换应用场景,数据交换的双方A和B网络不通,可是A和B均可以和前置机C链接,通常的状况是双方约定好前置机的数据结构,这个结构跟A和B的数据结构基本上是不一致的,这样咱们就须要把应用上的数据按照数据标准推送到前置机上,这个研发工做量仍是比较大的;
文件模式: 数据交互的双方A和B是彻底的物理隔离,这样就只能经过以文件的方式来进行数据交互了,例如XML格式,在应用A中咱们开发一个接口用来生成标准格式的XML,而后用优盘或者别的介质在某一时间把XML数据拷贝以后,而后接入到应用B上,应用B上在按照标准接口解析相应的文件把数据接收过来;
tips:linux上执行job kitchen.sh -file=/PRD/updateWarehouse.kjb -level=Minimal
执行转换 pan.sh -file=/PRD/updateWarehouse.kjb -level=Minimal
Transformation中的节点介绍以下:
Job中的节点介绍以下:
常常遇到问题:
1. 如何链接资源库?
若是没有则建立资源库
2. 如何链接数据库?
在链接数据库以前,首先须要保证当前在一个transform(转换)页面,而后点击左侧选项栏中的“主对象树”,而后右键点击“DB链接”,选择“新建”。
固然也能够设置一些其余的链接属性,如zeroDateTimeBehavior=round&characterEncoding=utf8。
3. 如何解决数据库链接更新不及时问题?
有时候咱们数据库中的表的字段进行了更新(增长或删除字段),可是在使用“表输入”控件的“获取SQL语句”功能是会发现的到的字段仍是原来的字段,这是因为缓存形成的,须要进行缓存清理。
4. 如何解决Unable to read file错误?
有时候咱们在文件夹中将Job或Transform移动到其余目录以后,执行时会出现Unable to read file错误。而后就进入到了当前Transform的配置页面。修改配置中的目录便可。
5. 如何解决tinyint类型数据丢失问题?
在Kettle使用JDBC链接MySQL时,对于表中数据类型为tinyint的字段,读取时有可能会将其转为bool类型,这有可能形成数据丢失。例如,有一个叫status名字的tinyint类型字段,取值有三种:0、一、2。kettle读取以后极可能将0转为false,一、2都转为true。输出时,将false转为0,true转为1,这样就会形成元数据中status为2的数据被错误的赋值为1。解决这个问题时,能够在读取元数据时将status转为int或char。好比SELECT CAST(status as signed) as status FROM <table_name>或SELECT CAST(status as char) as status FROM <table_name>