产品介绍
做什么事情首先都要规划好,不能走一步算一步。心里有规划,做起事情来就事半功倍。
Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。
Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。
Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。
Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。
作为Pentaho的一个重要组成部分,现在在国内项目应用上逐渐增多。
在个人的看来,ETL的工具能够实现各类数据库的数据交互,如oracle数据实时同步到mysql中,msql同步到oracle中等等,其中kettle都能实现这个过程!ETL:数据抽取(从源端数据抽取)、数据的清洗转换(数据库间的映射关系)、数据的加载(insert的过程)!最主要的一点实时进行调度的功能!
ETL是BI项目最重要的一个环节,通常情况下ETL会花掉整个项目的1/3的时间,ETL设计的好坏直接关接到BI项目的成败。ETL也是一个长期的过程,只有不断的发现问题并解决问题,才能使ETL运行效率更高,为项目后期开发提供准确的数据。
ETL的设计分三部分:数据抽取、数据的清洗转换、数据的加载。在设计ETL的时候也是从这三部分出发。数据的抽取是从各个不同的数据源抽取到ODS中(这个过程也可以做一些数据的清洗和转换),在抽取的过程中需要挑选不同的抽取方法,尽可能的提高ETL的运行效率。ETL三个部分中,花费时间最长的是T(清洗、转换)的部分,一般情况下这部分工作量是整个ETL的2/3。数据的加载一般在数据清洗完了之后直接写入DW中去。
ETL的实现有多种方法,常用的有三种,第一种是借助ETL工具如Oracle的OWB、SQL server 2000的DTS、SQL Server2005的SSIS服务、informatic等实现,第二种是SQL方式实现,第三种是ETL工具和SQL相结合。前两种方法各有优缺点,借助工具可以快速的建立起ETL工程,屏蔽复杂的编码任务,提高速度,降低难度,但是欠缺灵活性。SQL的方法优点是灵活,提高ETL运行效率,但是编码复杂,对技术要求比较高。第三种是综合了前面二种的优点,极大的提高ETL的开发速度和效率。
1. 在本安装
2. 安装JDK
略!安装此软件前需要安装JDK,此软件是Java开发,必须运行在Java的环境下!
IP地址 | 操作系统 | 安装软件 |
|
10.86.7.75 | Winxp | JDK、pdi-ce-4.2.0-stable.tar.gz |
|
10.86.87.107 | Redhat5.7 64bit | Oracle数据库 |
|
10.86.7.99 | Win2003 64bit | Oracle数据库 |
|
10.86.87.155 | Redhat5.7 64bit | Mysql5.5 |
|
3. Kettle实现
Kettle模块介绍
ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于
金融IT 来说,经常会遇到大数据量的处理,转换,迁移,所以了解并掌握一种
etl工具的使用,必不可少。
Kettle是一款国外开源的etl工具,纯java编写,绿色无需安装,数据抽取高
效稳定。Kettle中有两种脚本文件,transformation和job,transformation完成针
对数据的基础转换,job则完成整个工作流的控制。
运行kettle
解压文件pdi-ce-4.2.0-stable.tar.gz,进入目录后,点击文件Spoon.bat!无须对软件进行安装
4 实现Mysql数据库抽取oracle数据库的过程
源用户
在10.86.87.107数据库用户dms01
一)创建了表wangmin,其中包含两个字段
SQL> desc wangmin
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
ID NUMBER
NAME VARCHAR2(50) Y
二)查看表数据
注:表中有16条数据
创建目标用户表及数据
在Mysql数据库中用户dms下,创建表min
创建表:
create table etl_table(id int,name varchar(50));
新建转换
文件=>新建=>转换
创建DB连接
一)创建源端数据库DB连接(oracle)
DB连接=>新建
二)创建目标端数据库DB连接(Mysql)
实现表的数据抽取配置
一)核心对象=>输入=>表输入
二)核心对象=>输出=>插入/更新
三)建表输入和插入/更新的关系
点键盘按shift键,拖拽即可连线。
实现源表的数据抽取配置
一)表输入配置
双击表输入=>选择数据库连接
二)获取SQL查询语句
二)预览
实现目标表的数据抽取配置
此操作在Mysql数据库中进行。
一)选择”数据库连接”,及”目标表”
此过程与上面类似,故这里省略!
二)映射字段
注:在映射字段中,就显示了那些需要抽取的字段!
运行,执行ETL过程
一)点击图标如下:
注:完成ETL操作
查看目标源数据
注:数据与源端一致!
在源端插入数据再进行ETL过程
一)源端插入数据
二)执行
三)查看目标端数据
注:数据只插入一条,说明它是基于源端数据插入时才插入的!
4 实现调度(此过程已经重新配置映射关系)
创建JOB
一)新建=>作业=>通用
二)编写Transformation
选择生成的oracle-mysql的脚本
三)设置调度时间间隔
点击start:
四)运行JOB
点击run this JOB
给JOB输入文件格式
对源端插入数据
查看目标端数据情况
过两分钟后,查看目标端数据情况:
注:数据已经传输到mysql数据库中,已经实现整个ETL过程!
Mysql乱码产生原因
由于oracle数据库的字符集为al32uft8,而mysql中的字符集为latin1.如下:
解决方案:
一)修改数据库字符集
mysql> alter database dms DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.01 sec)
mysql> show create database dms;
+----------+--------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------+
| dms | CREATE DATABASE `dms` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
1 row in set (0.00 sec)
二)修改my.cnf配置文件
1 查看原character_set_server字符集
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /opt/mysql/share/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
2 修改my.cnf
在my.cnf中添加character_set_server=utf8如下:
[mysqld]
port = 3306
socket = /tmp/mysqld.sock
skip-external-locking
character_set_server=utf8
3.重启mysql
[mysql@SR3 init.d]$ ./mysql restart
Shutting down MySQL..[ OK ]
rm: cannot remove `/var/lock/subsys/mysql': Permission denied
Starting MySQL..[ OK ]
[mysql@SR3 init.d]$
4 查看修改后的character_set_server
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /opt/mysql/share/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql>
对mysql删除数据再执行调度
一)删除数据
delete from etl_table
二)执行调度
此步骤略!
三)查看数据是否乱码
注:乱码问题解决!谢谢!
7 总结(ETL优点及缺点)
一)优点
1 能实现各类数据库间的数据交互(Oracle、Db2、Mysql、Mssql等)
2 实现数据抽取、转换、加载的过程
3 实现任务调度能功能
4 针对于个别表
5 通过映射,只会迁移想要的字段的数据
6 数据实现同步的好工具
7 在kettle中,transformation和job都会生成.kjb方面的文件!
8 异构数据库数据处理都是以上类似的过程,这里就不做重复操作
二)缺点
1 不适合数据库迁移(很多表的时候),添加工作复杂
2 各数据库的转换需要字符集的一致!