文章目录

  • 一、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编写,可以在WindowLinuxUnix上运行,绿色无需安装,数据抽取高效稳定。

1.2 Kettle核心知识点

Kettle工程存储方式

  • XML形式存储
  • 以资源库方式存储(数据库资源库和文件资源库)

Kettle的两种设计

Transformation(转换):完成针对数据的基础转换。
Job(作业):完成整个工作流的控制

  • 作业是步骤流,转换是数据流。这是作业和转换最大的区别
  • 作业的每一个步骤,必须等到前面的步骤都跑完了,后面的步骤才会执行;而转换会一次性把所有控件全部先启动(一个控件对应启动一个线程),然后数据流会从第一个控件开始,一条记录、一条记录地流向最后的控件

kettle插件cpython kettle工具_mysql


Kettle文件的组成

  • 勺子(Spoon.bat/spoon.sh) : 是一个图形化的界面,可以让我们用图形化的方式开发转换和作业。windows选择Spoon.batLinux选择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插件cpython kettle工具_mysql_02

二、Kettle的使用

2.1 数据库表之间的同步

案例:把stu1的数据按id同步到stu2stu2有相同id则更新数据。

MySQL中创建stu1stu2并添加数据

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');

②新建一个转换

kettle插件cpython kettle工具_kettle_03


kettle插件cpython kettle工具_kettle_04


kettle插件cpython kettle工具_kettle_05


③ )保存转换,启动运行,去mysql表查看结果注意:如果需要连接mysql数据库,需要要先将mysql的连接驱动包复制到kettle的根目录下的lib目录中,否则会报错找不到驱动。

kettle插件cpython kettle工具_资源库_06

2.2 数据库表之间的同步【高级】

案例:使用作业执行上述转换,并且额外在表stu2中添加一条数据

① 新建一个作业

kettle插件cpython kettle工具_资源库_07


kettle插件cpython kettle工具_kettle插件cpython_08


kettle插件cpython kettle工具_kettle_09


kettle插件cpython kettle工具_kettle插件cpython_10


② 保存执行

2.3 Hive输出到HDFS

案例:将Hive表的数据输出到HDFS

①因为涉及到HiveHBase的读写,需要修改相关配置文件

修改plugins\pentaho-big-data-plugin下的plugin.properties,设置active.hadoop.configuration=hdp26,并将如下HadoopHiveHBase配置文件拷贝到plugins\pentaho-big-data-plugin\hadoop-configurations\hdp26下。

kettle插件cpython kettle工具_etl_11


② 前提:启动Hadoop集群③ 使用之前Hive表中已经创建好的deptemp

kettle插件cpython kettle工具_kettle_12


④ 新建转换

kettle插件cpython kettle工具_kettle_13


kettle插件cpython kettle工具_资源库_14

kettle插件cpython kettle工具_mysql_15


kettle插件cpython kettle工具_kettle_16


kettle插件cpython kettle工具_mysql_17


⑤ 执行转换后,从HDFS中下载文件

kettle插件cpython kettle工具_kettle_18

2.4 HDFS数据输出到HBase

案例4:读取HDFS文件并将sal大于1000的数据保存到GBase

① 新建HBase

hbase(main):001:0> create 'people','info'

kettle插件cpython kettle工具_mysql_19


kettle插件cpython kettle工具_etl_20

kettle插件cpython kettle工具_kettle插件cpython_21


kettle插件cpython kettle工具_kettle_22


kettle插件cpython kettle工具_资源库_23


③ 保存执行

注意:若报错没有权限往HDFS写文件,在Spoon.bat中第119行添加参数-DHADOOP_USER_NAME=WINDOW -Dfile.encoding=UTF-8或参考

三、Kettle资源库

资源库是Kettle文件的另一种存储方式

3.1 数据库资源库

① 点击右上角connect,选择Other Resporitory

kettle插件cpython kettle工具_资源库_24


② 选择Database Repository

kettle插件cpython kettle工具_etl_25


③ 建立新连接

kettle插件cpython kettle工具_资源库_26


kettle插件cpython kettle工具_etl_27


④填好之后,点击finish,会在指定的库中创建很多表,至此数据库资源库创建完成

kettle插件cpython kettle工具_kettle插件cpython_28


⑤ 连接资源库,默认账号密码为admin

kettle插件cpython kettle工具_mysql_29


⑥ 将之前做过的转换导入资源库

kettle插件cpython kettle工具_mysql_30

3.2 文件资源库

将作业和转换相关的信息存储在指定的目录中,其实和XML的方式一样创建方式跟创建数据库资源库步骤类似,只是不需要用户密码就可以访问,跨平台使用比较麻烦。

四、Kettle优化

  1. 调整JVM大小进行性能优化,修改Kettle根目录下的Spoon脚本。
  2. kettle插件cpython kettle工具_资源库_31

  3. 参数参考:
    -Xmx2048m:设置JVM最大可用内存为2048M
    -Xms1024m:设置JVM促使内存为1024M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
    -Xmn2g:设置年轻代大小为2G。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64M,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
    -Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
  4. 调整提交(Commit)记录数大小进行优化,Kettle默认Commit数量为:1000,可以根据数据量大小来设置Commitsize:1000~50000
  5. 尽量使用数据库连接池;
  6. 尽量提高批处理的commit size
  7. 尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流);
  8. KettleJava做的,尽量用大一点的内存参数启动Kettle
  9. 可以使用sql来做的一些操作尽量用sqlGroupmergestream lookupsplit field这些操作都是比较慢的,想办法避免他们,能用sql就用sql
  10. 插入大量数据的时候尽量把索引删掉;
  11. 尽量避免使用updatedelete操作,尤其是update,如果可以把update变成先delete,后insert
  12. 能使用truncate table的时候,就不要使用deleteall row这种类似sql合理的分区,如果删除操作是基于某一个分区的,就不要使用delete row这种方式(不管是deletesql还是delete步骤),直接把分区drop掉,再重新创建;
  13. 尽量缩小输入的数据集的大小(增量更新也是为了这个目的);
  14. 尽量使用数据库原生的方式装载文本文件(Oraclesqlloadermysqlbulk loader步骤)。