Kettle的安裝及簡單使用
一、kettle概述
1、什么是kettle
Kettle是一款開源的ETL工具,純java編寫,可以在Window、Linux、Unix上運行,綠色無需安裝,數據抽取高效穩定。
2、Kettle工程存儲方式
(1)以XML形式存儲
(2)以資源庫方式存儲(數據庫資源庫和文件資源庫)
3、Kettle的兩種設計

4、Kettle的組成

5、kettle特點
二、kettle安裝部署和使用
Windows下安裝
(1)概述
在實際企業開發中,都是在本地環境下進行kettle的job和Transformation開發的,可以在本地運行,也可以連接遠程機器運行
(2)安裝步驟
1、安裝jdk
2、下載kettle壓縮包,因kettle為綠色軟件,解壓縮到任意本地路徑即可
3、雙擊Spoon.bat,啟動圖形化界面工具,就可以直接使用了
案例1:MySQL to MySQL
把stu1的數據按id同步到stu2,stu2有相同id則更新數據
1、在mysql中創建testkettle數據庫,並創建兩張表
create database testkettle;
use testkettle;
create table stu1(id int,name varchar(20),age int);
create table stu2(id int,name varchar(20));
2、往兩張表中插入一些數據
insert into stu1 values(1001,'zhangsan',20),(1002,'lisi',18), (1003,'wangwu',23);
insert into stu2 values(1001,'wukong');
3、把pdi-ce-8.2.0.0-342.zip文件拷貝到win環境中指定文件目錄,解壓后雙擊Spoon.bat,啟動圖形化界面工具,就可以使用了

主界面:

在kettle中新建轉換--->輸入--->表輸入-->表輸入雙擊

在data-integration\lib文件下添加mysql驅動

在數據庫連接欄目點擊新建,填入mysql相關配置,並測試連接

建立連接后,選擇剛剛建好的連接,填入SQL,並預覽數據:

以上說明stu1的數據輸入ok的,現在我們需要把輸入stu1的數據同步到stu2輸出的數據

注意:拖出來的線條必須是深灰色才關聯成功,若是淺灰色表示關聯失敗

轉換之前,需要做保存

執行成功之后,可以在mysql查看,stu2的數據
mysql> select * from stu2;
+------+----------+
| id | name |
+------+----------+
| 1001 | zhangsan |
| 1002 | lisi |
| 1003 | wangwu |
+------+----------+
3 rows in set (0.00 sec)
案例2:使用作業執行上述轉換,並且額外在表stu2中添加一條數據
1、新建一個作業

2、按圖示拉取組件

3、雙擊Start編輯Start

4、雙擊轉換,選擇案例1保存的文件

5、在mysql的stu1中插入一條數據,並將stu2中id=1001的name改為wukong
mysql> insert into stu1 values(1004,'stu1',22);
Query OK, 1 row affected (0.01 sec)
mysql> update stu2 set name = 'wukong' where id = 1001;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
6、雙擊SQL腳本編輯

7、加上Dummy,如圖所示:
8、保存並執行
9、在mysql數據庫查看stu2表的數據
mysql> select * from stu2;
+------+----------+
| id | name |
+------+----------+
| 1001 | zhangsan |
| 1002 | lisi |
| 1003 | wangwu |
| 1004 | stu1 |
| 1005 | kettle |
+------+----------+
5 rows in set (0.00 sec)
案例3:將hive表的數據輸出到hdfs
1、因為涉及到hive和hbase(后續案例)的讀寫,需要修改相關配置文件
修改解壓目錄下的data-integration\plugins\pentaho-big-data-plugin下的plugin.properties,設置active.hadoop.configuration=hdp26,26是指用hdp26文件夾里面的配置,從我們的hadoop,hive,hbase中將這些配置拷貝到data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\hdp26下

2、啟動hadoop集群、hiveserver2服務
可以用來監控日志
3、進入hive shell,創建kettle數據庫,並創建dept、emp表
create database kettle;
use kettle;
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';
4、插入數據
insert into dept values(10,'accounting','NEW YORK'),(20,'RESEARCH','DALLAS'),(30,'SALES','CHICAGO'),(40,'OPERATIONS','BOSTON');
insert into emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20),(7499,'ALLEN','SALESMAN',7698,'1980-12-17',1600,300,30),(7521,'WARD','SALESMAN',7698,'1980-12-17',1250,500,30),(7566,'JONES','MANAGER',7839,'1980-12-17',2975,NULL,20);
5、按下圖建立流程圖
- 表輸入

- 表輸入2

- 排序記錄

- 記錄集連接

- 字段選擇


- 文本文件輸出


6、保存並運行查看hdfs
- 運行

- 查看HDFS文件

案例4:讀取hdfs文件並將sal大於1000的數據保存到hbase中
1、在HBase中創建一張people表
hbase(main):004:0> create 'people','info'
2、按下圖建立流程圖
- 文本文件輸入


- 設置過濾記錄

-
設置HBase output
編輯hadoop連接,並配置zookeeper地址


- 執行轉換

-
查看hbase people表的數據
scan 'people'
注意:若報錯沒有權限往hdfs寫文件,在Spoon.bat中第119行添加參數
"-DHADOOP_USER_NAME=root" "-Dfile.encoding=UTF-8"
三、創建資源庫
1、數據庫資源庫
數據庫資源庫是將作業和轉換相關的信息存儲在數據庫中,執行的時候直接去數據庫讀取信息,方便跨平台使用
-
在MySQL中創建kettle數據庫
mysql> create database kettle; Query OK, 1 row affected (0.01 sec)
-
點擊右上角connect,選擇Other Resporitory

- 選擇Database Repository

- 建立新連接



- 填好之后,點擊finish,會在指定的庫中創建很多表,至此數據庫資源庫創建完成

-
連接資源庫
默認賬號密碼為admin

-
將之前做過的轉換導入資源庫
-
選擇從xml文件導入
-
點擊保存,選擇存儲位置及文件名
-
查看MySQL中kettle庫中的R_TRANSFORMATION表,觀察轉換是否保存
-
2、文件資源庫
將作業和轉換相關的信息存儲在指定的目錄中,其實和XML的方式一樣
創建方式跟創建數據庫資源庫步驟類似,只是不需要用戶密碼就可以訪問,跨
平台使用比較麻煩
-
選擇connect
-
點擊add后點擊Other Repositories
-
選擇File Repository
-
填寫信息

四、 Linux下安裝使用
1、單機
-
jdk安裝
-
安裝包上傳到服務器,並解壓
注意:
-
把mysql驅動拷貝到lib目錄下
-
將windows本地用戶家目錄下的隱藏目錄C:\Users\自己用戶名\.kettle 目錄,
整個上傳到linux的用戶的家目錄下,root用戶的家目錄為/root/
-
-
運行數據庫資源庫中的轉換:
cd /usr/local/soft/data-integration ./pan.sh -rep=my_repo -user=admin -pass=admin -trans=tran1
參數說明:
-rep 資源庫名稱
-user 資源庫用戶名
-pass 資源庫密碼
-trans 要啟動的轉換名稱
-dir 目錄(不要忘了前綴 /)(如果是以ktr文件運行時,需要指定ktr文件的路徑)

-
運行資源庫里的作業:
記得把作業里的轉換變成資源庫中的資源
記得把作業也變成資源庫中的資源
cd /usr/local/soft/data-integration mkdir logs ./kitchen.sh -rep=my_repo -user=admin -pass=admin -job=job1 -logfile=./logs/log.txt
參數說明:
-rep - 資源庫名
-user - 資源庫用戶名
-pass – 資源庫密碼
-job – job名
-dir – job路徑(當直接運行kjb文件的時候需要指定)
-logfile – 日志目錄
2、 集群模式
-
准備三台服務器
master作為Kettle主服務器,服務器端口號為8080,
node1和node2作為兩個子服務器,端口號分別為8081和8082。
-
安裝部署jdk
-
hadoop完全分布式環境搭建
-
上傳並解壓kettle的安裝包至
/usr/local/soft/
目錄下 -
進到/usr/local/soft/data-integration/pwd目錄,修改配置文件
-
修改主服務器配置文件carte-config-master-8080.xml
<slaveserver> <name>master</name> <hostname>master</hostname> <port>8080</port> <master>Y</master> <username>cluster</username> <password>cluster</password> </slaveserver>
-
修改從服務器配置文件carte-config-8081.xml
<masters> <slaveserver> <name>master</name> <hostname>master</hostname> <port>8080</port> <username>cluster</username> <password>cluster</password> <master>Y</master> </slaveserver> </masters> <report_to_masters>Y</report_to_masters> <slaveserver> <name>slave1</name> <hostname>node1</hostname> <port>8081</port> <username>cluster</username> <password>cluster</password> <master>N</master> </slaveserver>
-
修改從配置文件carte-config-8082.xml
<masters> <slaveserver> <name>master</name> <hostname>master</hostname> <port>8080</port> <username>cluster</username> <password>cluster</password> <master>Y</master> </slaveserver> </masters> <report_to_masters>Y</report_to_masters> <slaveserver> <name>slave2</name> <hostname>node2</hostname> <port>8082</port> <username>cluster</username> <password>cluster</password> <master>N</master> </slaveserver>
-
-
分發整個kettle的安裝目錄,通過scp命令
-
分發/root/.kettle目錄到node1、node2
-
啟動相關進程,在master,node1,node2上分別執行
[root@master]# ./carte.sh master 8080
[root@node1]# ./carte.sh node1 8081
[root@node2]# ./carte.sh node2 8082
- 訪問web頁面
案例:讀取hive中的emp表,根據id進行排序,並將結果輸出到hdfs上
注意:因為涉及到hive和hbase的讀寫,需要修改相關配置文件。
修改解壓目錄下的data-integration\plugins\pentaho-big-data-plugin下的plugin.properties,設置active.hadoop.configuration=hdp26,並將如下配置文件拷貝到data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\hdp26下

-
創建轉換,編輯步驟,填好相關配置
直接使用trans1
-
創建子服務器,填寫相關配置,跟集群上的配置相同



-
創建集群schema,選中上一步的幾個服務器
-
對於要在集群上執行的步驟,右鍵選擇集群,選中上一步創建的集群schema
-
創建Run Configuration,選擇集群模式
-
直接運行,選擇集群模式運行
五、調優
1、調整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左右。
2、 調整提交(Commit)記錄數大小進行優化,Kettle默認Commit數量為:1000,可以根據數據量大小來設置Commitsize:1000~50000
3、盡量使用數據庫連接池;
4、盡量提高批處理的commit size;
5、盡量使用緩存,緩存盡量大一些(主要是文本文件和數據流);
6、Kettle是Java做的,盡量用大一點的內存參數啟動Kettle;
7、可以使用sql來做的一些操作盡量用sql;
Group , merge , stream lookup,split field這些操作都是比較慢的,想辦法避免他們.,能用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步驟)。