学习笔记
一、简介
1.1、ETL简介
ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换,迁移,所以了解并掌握一种ETL工具的使用,必不可少。
市面上常用的ETL工具有很多,比如 Sqoop,DataX,Kettle,Talend 等
1.2、Kettle简介
1.2.1、Kettle
Kettle是一款国外开源的ETL工具,纯java编写
Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。
Kettle中文名称叫水壶,该项目把各种数据放到一个壶里,然后以一种指定的格式流出。
Kettle 中有两种脚本文件,transformation和 job,transformation完成针对数据的基础转换,job 则完成整个工作流的控制。
Kettle(现在已经更名为PDI,Pentaho Data Integration-Pentaho数据集成)。
1.2.2、Kettle的两种设计
Transformation(转换):完成针对数据的基础转换。
Job(作业):完成整个工作流的控制。
区别:
(1)作业是步骤流,转换是数据流。这是作业和转换最大的区别。
(2)作业的每一个步骤,必须等到前面的步骤都跑完了,后面的步骤才会执行;而转换会一次性把所有控件全部先启动(一个控件对应启动一个线程),然后数据流会从第一个控件开始,一条记录、一条记录地流向最后的控件;
1.2.3、Kettle的核心组件
- 勺子(Spoon):是一个图形化的界面,可以让我们用图形化的方式开发转换和作业。
- 煎锅(Pan):利用Pan可以用命令行的形式执行由Spoon编辑的转换和作业
- 厨房(Kitchen):利用Kitchen可以使用命令行调用由Spoon编辑好的Job
- 菜单(Carte.bat/ Carte.sh): Carte是一个轻量级的Web容器,用于建立专用、远程的ETL Server。
二、安装部署
双击 Spoon.bat,启动图形化界面工具 慢很正常
三、Kettle核心概念
3.1、转换
转换(transaformation)负责数据的输入、转换、校验和输出等工作。
Kettle 中使用转换完成数据ETL全部工作。
转换由多个步骤(Step)组成,如文本文件输入,过滤输出行,执行SQL脚本等。
各个步骤使用跳(Hop)来链接。跳定义了一个数据流通道,即数据由一个步骤流(跳)向下一个步骤。
在Kettle 中数据的最小单位是数据行(row),数据流中流动其实是缓存的行集(RowSet)。
3.2、步骤(Step)
步骤(控件)是转换里的基本的组成部分
一个步骤有如下几个关键特性:
- 步骤需要有一个名字,这个名字在同一个转换范围内唯一
- 每个步骤都会读、写数据行(唯一例外是“生成记录”步骤,该步骤只写数据)。
- 步骤将数据写到与之相连的一个或多个输出跳(hop),再传送到跳的另一端的步骤。
- 大多数的步骤都可以有多个输出跳。一个步骤的数据发送可以被设置为分发和复制,分发是目标步骤轮流接收记录,复制是所有的记录被同时发送到所有的目标步骤。
3.3、跳(Hop)
跳就是步骤之间带箭头的连线,跳定义了步骤之间的数据通路。
跳实际上是两个步骤之间的被称之为行集的数据行缓存,行集的大小可以在转换的设置里定义。当行集满了,向行集写数据的步骤将停止写入,直到行集里又有了空间。当行集空了,从行集读取数据的步骤停止读取,直到行集里又有可读的数据行。
3.4、元数据
每个步骤在输出数据行时都有对字段的描述,这种描述就是数据行的元数据。
通常包含下面一些信息:
- 名称:数据行里的字段名是唯一的。
- 数据类型:字段的数据类型。
- 格式:数据显示的方式,如 Integer 的#、0.00。
- …
3.5、数据类型
数据以数据行的形式沿着步骤移动。一个数据行是零到多个字段的集合
字段包含下面几种数据类型:
- String:字符类型数据
- Number:双精度浮点数。
- Integer:带符号长整型(64位)。
- BigNumber:任意精度数据。
- Date:带毫秒精度的日期时间值。
- Boolean:取值为 true和 false的布尔值。
- Binary:二进制字段可以包含图像、声音、视频及其他类型的二进制数据。
四、Kettle调优
1、调整JVM大小进行性能优化,修改Kettle根目录下的Spoon脚本。
2、调整提交(Commit)记录数大小进行优化,Kettle默认Commit数量为:1000,可以根据数据量大小来设置Commitsize: 1000~50000
3、尽量使用数据库连接池;
4、尽量提高批处理的commit size;
5、尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流);
6、Kettle是Java做的,尽量用大一点的内存参数启动Kettle;
7、可以使用sgl来做的一些操作尽量sql;
8、插入大量数据的时候尽量把索引删掉;