文章目录
- 一、Kettle概述
- 1.1 什么是kettle
- 1.2 Kettle核心知识点
- 1.3 Kettle特点
- 二、Kettle的使用
- 2.1 数据库表之间的同步
- 2.2 数据库表之间的同步【高级】
- 2.3 Hive输出到HDFS
- 2.4 HDFS数据输出到HBase
- 三、Kettle资源库
- 3.1 数据库资源库
- 3.2 文件资源库
- 四、Kettle优化
一、Kettle概述
1.1 什么是kettle
Kettle
是一款开源的ETL工具,纯java
编写,可以在Window
、Linux
、Unix
上运行,绿色无需安装,数据抽取高效稳定。
1.2 Kettle核心知识点
① Kettle
工程存储方式
- 以
XML
形式存储 - 以资源库方式存储(数据库资源库和文件资源库)
② Kettle
的两种设计
Transformation(转换):完成针对数据的基础转换。
Job(作业):完成整个工作流的控制
- 作业是步骤流,转换是数据流。这是作业和转换最大的区别
- 作业的每一个步骤,必须等到前面的步骤都跑完了,后面的步骤才会执行;而转换会一次性把所有控件全部先启动(一个控件对应启动一个线程),然后数据流会从第一个控件开始,一条记录、一条记录地流向最后的控件
③ Kettle
文件的组成
- 勺子(Spoon.bat/spoon.sh) : 是一个图形化的界面,可以让我们用图形化的方式开发转换和作业。
windows
选择Spoon.bat
;Linux
选择Spoon.sh
- 煎锅(Pan.bat/pan.sh): 利用
Pan
可以用命令行的形式调用Trans
- 厨房(Kitchen.bat/kitchen.sh): 利用
Kitchen
可以使用命令行调用Job
- 菜单(Carte.bat/ Carte.sh):
Carte
是一个轻量级的Web
容器,用于建立专用、远程的ETL Server
。
1.3 Kettle特点
二、Kettle的使用
2.1 数据库表之间的同步
案例:把stu1
的数据按id
同步到stu2
,stu2
有相同id
则更新数据。
① MySQL
中创建stu1
、stu2
并添加数据
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));
mysql> insert into stu1 values(1001,'zhangsan',20),(1002,'lisi',18), (1003,'wangwu',23);
mysql> insert into stu2 values(1001,'wukong');
②新建一个转换
③ )保存转换,启动运行,去mysql
表查看结果注意:如果需要连接mysql
数据库,需要要先将mysql
的连接驱动包复制到kettle的根目录下的lib
目录中,否则会报错找不到驱动。
2.2 数据库表之间的同步【高级】
案例:使用作业执行上述转换,并且额外在表stu2
中添加一条数据
① 新建一个作业
② 保存执行
2.3 Hive输出到HDFS
案例:将Hive
表的数据输出到HDFS
①因为涉及到Hive
和HBase
的读写,需要修改相关配置文件
修改plugins\pentaho-big-data-plugin
下的plugin.properties
,设置active.hadoop.configuration=hdp26
,并将如下Hadoop
、Hive
、HBase
配置文件拷贝到plugins\pentaho-big-data-plugin\hadoop-configurations\hdp26
下。
② 前提:启动Hadoop
集群③ 使用之前Hive
表中已经创建好的dept
、emp
④ 新建转换
⑤ 执行转换后,从HDFS
中下载文件
2.4 HDFS数据输出到HBase
案例4:读取HDFS
文件并将sal
大于1000的数据保存到GBase
中
① 新建HBase
表
hbase(main):001:0> create 'people','info'
③ 保存执行
注意:若报错没有权限往HDFS
写文件,在Spoon.bat
中第119行添加参数-DHADOOP_USER_NAME=WINDOW -Dfile.encoding=UTF-8
或参考
三、Kettle资源库
资源库是Kettle
文件的另一种存储方式
3.1 数据库资源库
① 点击右上角connect
,选择Other Resporitory
② 选择Database Repository
③ 建立新连接
④填好之后,点击finish
,会在指定的库中创建很多表,至此数据库资源库创建完成
⑤ 连接资源库,默认账号密码为admin
⑥ 将之前做过的转换导入资源库
3.2 文件资源库
将作业和转换相关的信息存储在指定的目录中,其实和XML
的方式一样创建方式跟创建数据库资源库步骤类似,只是不需要用户密码就可以访问,跨平台使用比较麻烦。
四、Kettle优化
- 调整
JVM
大小进行性能优化,修改Kettle
根目录下的Spoon
脚本。 - 参数参考:
-Xmx2048m
:设置JVM
最大可用内存为2048M
。-Xms1024m
:设置JVM
促使内存为1024M
。此值可以设置与-Xmx
相同,以避免每次垃圾回收完成后JVM
重新分配内存。-Xmn2g
:设置年轻代大小为2G
。整个JVM
内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64M
,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun
官方推荐配置为整个堆的3/8。-Xss128k
:设置每个线程的堆栈大小。JDK5.0
以后每个线程堆栈大小为1M
,以前每个线程堆栈大小为256K
。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。 - 调整提交(
Commit
)记录数大小进行优化,Kettle
默认Commit
数量为:1000,可以根据数据量大小来设置Commitsize
:1000~50000 - 尽量使用数据库连接池;
- 尽量提高批处理的
commit size
; - 尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流);
Kettle
是Java
做的,尽量用大一点的内存参数启动Kettle
;- 可以使用
sql
来做的一些操作尽量用sql
;Group
、merge
、stream lookup
、split field
这些操作都是比较慢的,想办法避免他们,能用sql
就用sql
; - 插入大量数据的时候尽量把索引删掉;
- 尽量避免使用
update
、delete
操作,尤其是update
,如果可以把update
变成先delete
,后insert
; - 能使用
truncate table
的时候,就不要使用deleteall row
这种类似sql
合理的分区,如果删除操作是基于某一个分区的,就不要使用delete row
这种方式(不管是deletesql
还是delete
步骤),直接把分区drop
掉,再重新创建; - 尽量缩小输入的数据集的大小(增量更新也是为了这个目的);
- 尽量使用数据库原生的方式装载文本文件(
Oracle
的sqlloader
,mysql
的bulk loader
步骤)。