ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换,迁移,所以了解并掌握一种ETL工具的使用,必不可少,这里我介绍一个原作者在工作中使用了3年左右的ETL工具Kettle,本着好东西不独享的想法,跟大家分享碰撞交流一下!在使用中这个工具真的很强大,支持图形化的GUI设计界面,然后可以以工作流的形式流转,在做一些简单或复杂的数据抽取、质量检测、数据清洗、数据转换、数据过滤等方面有着比较稳定的表现,其中最主要的我们通过熟练的应用它,减少了非常多的研发工作量,提高了我们的工作效率
Kettle 是一款国外开源的 ETL 工具,纯 Java 编写,绿色无需安装,数据抽取高效稳定(数据迁移工具)。
Kettle 中有两种脚本文件,transformation 和 job,
基本概念
ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据, ETL是BI(商业智能)项目重要的一个环节。
特性
安装部署
2.1 Windows 下安装使用
2.2 单机
运行数据库资源库中的转换
[djm data-integration]$./pan.sh -rep=my_repo -user=admin -pass=admin -trans=stu1tostu2 -dir=/
参数说明:
运行资源库里的作业:
[djm data-integration]$./kitchen.sh -rep=repo1 -user=admin -pass=admin -job=jobDemo1 -logfile=./logs/log.txt -dir=/
参数说明:
2.3 集群安装
准备三台服务器,hadoop102 作为 Kettle 主服务器,服务器端口号为 8080,hadoop103 和 hadoop104 作为两个子服务器,端口号分别为 8081 和 8082
上传解压 kettle 的安装包
进到 /opt/module/data-integration/pwd 目录,修改配置文件
master
hadoop102
8080
Y
cluster
cluster
master
hadoop102
8080
cluster
cluster
Y
Y
slave1
hadoop103
8081
cluster
cluster
N
master
hadoop102
8080
cluster
cluster
Y
Y
slave2
hadoop104
8082
cluster
cluster
N
分发
启动相关进程,在 hadoop102,hadoop103,hadoop104 上执行
[djm@hadoop102 data-integration]$./carte.sh hadoop102 8080
[djm@hadoop103 data-integration]$./carte.sh hadoop103 8081
[djm@hadoop104 data-integration]$./carte.sh hadoop104 8082
3.1 案例一:把 stu1 的数据按 id 同步到 stu2,stu2 有相同 id 则更新数据
1)在 mysql 中创建两张表
mysql> create database kettle;
mysql> use kettle;
mysql> create table stu1(id int,name varchar(20),age int);
mysql> create table stu2(id int,name varchar(20));
2)往两张表中插入数据
mysql> insert into stu1 values(1001,'zhangsan',20),(1002,'lisi',18), (1003,'wangwu',23);
mysql> insert into stu2 values(1001,'wukong');
3)在 kettle 中新建转换
4)分别在输入和输出中拉出表输入和插入/更新
5)双击表输入对象,填写相关配置,测试是否成功
6)双击 更新/插入对象,填写相关配置
7)保存转换,启动运行,去 mysql 表查看结果
3.2 案例二:使用作业执行上述转换,并且额外在表 stu2 中添加一条数据
1)新建一个作业
2)按图示拉取组件
3)双击 Start 编辑属性
4)双击转换,选择案例 1 保存的文件
5)双击 SQL,编辑 SQL 语句
3.3 案例三:将 Hive 表的数据输出到 hdfs
1)因为涉及到 Hive 和 HBase 的读写,需要修改相关配置文件
2)创建两张表 dept 和 emp
CREATE TABLE dept(deptno int, dname string,loc string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
CREATE TABLE emp(empno int, ename string, job string, mgr int,
hiredate string, sal double, comm int,deptno int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
3)导入数据
load data local inpath '/opt/module/datas/dept.txt' into table dept;
load data local inpath '/opt/module/datas/emt.txt' into table emp;
4)按下图建立流程图
5)设置表输入,连接 Hive
6)设置排序记录属性
7)设置连接属性
8)设置字段选择
9)设置文件输出
10)保存并查看 HDFS
3.4 案例四:读取 HDFS 文件并将 sal 大于 1000 的数据保存到 HBase 中
相关文章
其实实现ETL功能的工具很多,我熟悉并使用过的:Informatica PowerCenter、kettle、sql、PLSQL编程、python等等。
分别简单聊聊这些实现ETL的手段:
(1)、Informatica PowerCenter
此软件是商用的,网上成熟的中文资料比较少,而且版本较旧。英文资料居多,给很多初学者带来了困扰。国内最出名的大神就是杨晓东,国内的中文资料几乎全是杨晓东分享的,资料对应的版本还停留在7.6和8.5。(我当年学的时候,自己买了书,在淘宝上淘的视频,还在杨晓东的群里打酱油,经过6个月的努力,才能上手正常工作)
(2)、kettle
此软件是开源的,纯java编写,网上文档和视频资料特别多,有很多人在博客分享自己的案例。(从第一次接触Kettle,到灵活使用,我一共花了2天时间。这主要受益于我的技术沉淀:java编程、sql、Informatica PowerCenter的使用)
(3)、sql
一提到sql,各位感觉只要是个干IT的人就会。你以为就是select\insert\update\delete,你就实现ETL了?醒醒吧铁子,你如果这样想,你永远吃不上4个菜!!
此处提到的sql,要与你工作中的业务相结合,你得吃透业务,然后编写出来的sql。你操作完sql后,你还要验证一下,结果和你想的对不对?时效如何?如果性能不好,你还要sql调优。一说调优,有些人会说百度上找啊,文章特别多。你会发现很文章,好像是近亲,天下学文一大抄啊!而且你不懂业务,你要调优纯扯淡。
举例说明:
小明饭量很大,他一顿饭吃了一只烤鸭,小明说我刚刚吃饱了,吃饱了太幸福了。
你的饭量很小,你平时每顿就吃半个馒头的。你听了小明的说法,你也吃一只烤鸭,你肚皮都撑爆了,一张嘴烤鸭都快从嘴中吐出来了。
上面的小例子说明,不同的业务规则\数据量\访问量,对应的调优手段也不同。其实也是有一些通用的调优方法,就从sql的写法上实现的。可以来参考我的博文:点击 oracle调优笔记(揭开传言的面纱)
(4)、PLSQL编程
PLSQL是oracle的高级编程,如果想使用PLSQL编程实现ETL,基本要求和上面第3点sql的要求很相似。另外你要熟悉PLSQL语法,并能排除PLSQL运行时产生的Exception。(我做的是ORALCE DBA,对PLSQL编程非常熟悉,所以此处提到PLSQL。大部分数据都有自己编程,只要你熟悉都可以实现ETL)。如果你对plsql编程也感兴趣,可以参考我的博文:点击 史上最简单的数据抽取
(5)、Python
Python是一种编程语言,它里面集成了很多数学函数、工具类,都可以帮我们更加方便的实现ETL操作。如果你要操作的数据源是excel和csv,你就可以使用pandas,太方便了。
1、调整 JVM 大小进行性能优化,修改 Kettle 根目录下的 Spoon 脚本
参数参考:
2、 调整提交(Commit)记录数大小进行优化,Kettle 默认 Commit 数量为:1000,可以根据数据量大小来设置Commitsize:1000~50000
3、尽量使用数据库连接池
4、尽量提高批处理的 commit size
5、尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流)
6、Kettle 是 Java 做的,尽量用大一点的内存参数启动 Kettle
7、可以使用 SQL 来做的一些操作尽量用 SQL
8、插入大量数据的时候尽量把索引删掉
9、尽量避免使用 update、delete 操作,尤其是 update,如果可以把 update 变成先 delete, 后 insert
10、能使用 truncate table 的时候,就不要使用 deleteall row 这种类似 sql 合理的分区,如果删除操作是基于某一个分区的,就不要使用 delete row 这种方式(不管是 deletesql 还是 delete 步骤),直接把分区 drop 掉,再重新创建
11、尽量缩小输入的数据集的大小(增量更新也是为了这个目的)
12、尽量使用数据库原生的方式装载文本文件(Oracle 的 sqlloader, mysql 的 bulk loader 步骤)
相关文章