kettle入門實戰

一、kettle概述

1、什麼是kettle

Kettle是一款開源的ETL工具,純java編寫,可以在Window、Linux、Unix上運行,綠色無需安裝,數據抽取高效穩定。

2、Kettle工程存儲方式

(1)以XML形式存儲

(2)以資源庫方式存儲(數據庫資源庫和文件資源庫)

3、Kettle的兩種設計

4、Kettle的組成

5、kettle特點


二、kettle安裝部署和使用

1、 kettle安裝地址(官網地址

https://community.hitachivantara.com/docs/DOC-1009855

下載地址:https://sourceforge.net/projects/pentaho/files/Data%20Integration/

資料下載:

鏈接:https://pan.baidu.com/s/149fBww3eiD7vLN2p2egCxg

提取碼:gyhr

2、Windows下安裝使用

(1)概述

在實際企業開發中,都是在本地環境下進行kettle的job和Transformation開發的,可以在本地運行,也可以連接遠程機器運行

(2)安裝步驟

安裝jdk

下載kettle壓縮包,因kettle爲綠色軟件,解壓縮到任意本地路徑即可

雙擊Spoon.bat,啓動圖形化界面工具,就可以直接使用了

3、案例1

案例一 把stu1的數據按id同步到stu2,stu2有相同id則更新數據

(1)在mysql中創建兩張表

mysql> create database kettle;
Query OK, 1 row affected (0.00 sec)

mysql> use kettle;
Database changed

mysql>  create table stu1(id int,name varchar(20),age int);
Query OK, 0 rows affected (0.01 sec)

mysql> create table stu2(id int,name varchar(20));
Query OK, 0 rows affected (0.00 sec)

(2)往兩張表中插入一些數據

mysql> insert into stu1 values(1001,'zhangsan',20),(1002,'lisi',18), (1003,'wangwu',23);
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> insert into stu2 values(1001,'wukong');
Query OK, 1 row affected (0.00 sec)

(3)把pdi-ce-8.2.0.0-342.zip文件拷貝到win環境中指定文件目錄,解壓後

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

在數據庫連接欄目點擊新建

以上錯誤說明,少了mysql-connector-java-5.1.27-bin.jar

解決方法:

在data-integration\lib文件下添加mysql-connector-java-5.1.27-bin.jar

再重啓,再次操作

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

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

轉換之前,需要做保存

之後,在mysql查看,stu2的數據,注意(自己轉換都是改成N)

mysql> select * from  stu2;
+------+--------+
| id   | name   |
+------+--------+
| 1001 | wukong |
| 1002 | lisi   |
| 1003 | wangwu |
+------+--------+
3 rows in set (0.00 sec)

若:改動

//查出來的數據有所變動
mysql> select * from  stu2;
+------+----------+
| id   | name     |
+------+----------+
| 1001 | zhangsan |
| 1002 | lisi     |
| 1003 | wangwu   |
+------+----------+
3 rows in set (0.00 sec)

4、案例2:使用作業執行上述轉換,並且額外在表student2中添加一條數據

(1)新建一個作業

(2) 按圖示拉取組件

(3)雙擊Start編輯Start

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

(5)雙擊SQL,編輯SQL語句,先在mysql的kettle數據庫中插入一條數據

mysql> insert into stu1 values(1004,'stu1',22);
Query OK, 1 row affected (0.01 sec)

之後,加上Dummy,如圖所示:

之後,必須保存,不然不會生效

接下來,我們就可以執行了

再次,在mysql數據庫查看,有數據了

mysql> select * from stu2;
+------+----------+
| id   | name     |
+------+----------+
| 1001 | zhangsan |
| 1002 | lisi     |
| 1003 | wangwu   |
| 1004 | stu1     |
| 1005 | kettle   |
+------+----------+
5 rows in set (0.00 sec)

5、案例3:將hive表的數據輸出到hdfs

(1)因爲涉及到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下

(2)啓動hdfs,yarn,hbase集羣的所有進程,啓動hiveserver2服務

[root@hadoop1 ~]# /opt/module/hadoop-2.7.2/sbin/start-all.sh
開啓HBase前啓動Zookeeper
[root@hadoop1 ~]# /opt/module/hbase-1.3.1/bin/start-hbase.sh
[root@hadoop1 ~]# /opt/module/hive/bin/hiveserver2

(3)進入beeline,查看10000端口開啓情況

[root@hadoop1 ~]# /opt/module/hive/bin/beeline
Beeline version 1.2.1 by Apache Hive
beeline> !connect jdbc:hive2://hadoop1.x:10000(回車)
Connecting to jdbc:hive2://hadoop1.x:10000
Enter username for jdbc:hive2://hadoop1.x:10000: root(輸入root)
Enter password for jdbc:hive2://hadoop1.x:10000:(直接回車)
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop1.x:10000>(到了這裏說明成功開啓10000端口)

(4)創建兩張表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';

(5)插入數據

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

(6)按下圖建立流程圖

(7)設置表輸入,連接hive

(8)設置排序屬性

(9)設置連接屬性

(10)設置字段選擇

(11)設置文件輸出

(12)保存並運行查看hdfs


6、案例4:讀取hdfs文件並將sal大於1000的數據保存到hbase中

(1) 在HBase中創建一張表用於存放數據

[root@hadoop1 ~]$ /opt/module/hbase-1.3.1/bin/hbase shell
hbase(main):004:0> create 'people','info'

(2)按下圖建立流程圖

(3)設置文件輸入,連接hdfs

(4)設置過濾記錄

(5)設置HBase output

注意:若報錯沒有權限往hdfs寫文件,在Spoon.bat中第119行添加參數

"-DHADOOP_USER_NAME=atguigu" "-Dfile.encoding=UTF-8"


三、創建資源庫

1、數據庫資源庫

數據庫資源庫是將作業和轉換相關的信息存儲在數據庫中,執行的時候直接去數據庫讀取信息,很容易跨平臺使用

1)點擊右上角connect,選擇Other Resporitory

2) 選擇Database Repository

3) 建立新連接

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

5) 連接資源庫

默認賬號密碼爲admin

6) 將之前做過的轉換導入資源庫

(1)選擇從xml文件導入

(2)隨便選擇一個轉換

(3)點擊保存,選擇存儲位置及文件名

(4)打開資源庫查看保存結果

2、文件資源庫

將作業和轉換相關的信息存儲在指定的目錄中,其實和XML的方式一樣

創建方式跟創建數據庫資源庫步驟類似,只是不需要用戶密碼就可以訪問,跨

平臺使用比較麻煩

1)選擇connect

2)點擊add後點擊Other Repositories

3)選擇File Repository

4)填寫信息


四、 Linux下安裝使用

1、單機

1)jdk安裝

2)安裝包上傳到服務器,解壓

注意:1. 把mysql驅動拷貝到lib目錄下
2. 將本地用戶家目錄下的隱藏目錄C:\Users\自己用戶名\.kettle,整個上傳到linux的家目錄/home/MrZhou/下

3)運行數據庫資源庫中的轉換:

[root@hadoop1 data-integration]$./pan.sh -rep=my_repo -user=admin -pass=admin -trans=stu1tostu2 -dir=/

參數說明:

-rep 資源庫名稱
-user 資源庫用戶名
-pass 資源庫密碼
-trans 要啓動的轉換名稱
-dir 目錄(不要忘了前綴 /)

4)運行資源庫裏的作業:

記得把作業裏的轉換變成資源庫中的資源

[root@hadoop1 data-integration]$./kitchen.sh -rep=repo1 -user=admin -pass=admin -job=jobDemo1 -logfile=./logs/log.txt -dir=/
參數說明:
-rep - 資源庫名
-user - 資源庫用戶名
-pass – 資源庫密碼
-job – job名
-dir – job路徑
-logfile – 日誌目錄

 

2、 集羣模式(瞭解)

1) 準備三臺服務器,hadoop1.x作爲Kettle主服務器,服務器端口號爲8080,hadoop2.x和hadoop3.x作爲兩個子服務器,端口號分別爲8081和8082。

2) 安裝部署jdk

3) hadoop完全分佈式環境搭建,並啓動進程(因爲要使用hdfs)

4) 上傳解壓kettle的安裝包

5) 進到/opt/module/data-integration/pwd目錄,修改配置文件

修改主服務器配置文件carte-config-master-8080.xml

<slaveserver>
    <name>master</name>
    <hostname>hadoop1.x</hostname>
    <port>8080</port>
    <master>Y</master>
    <username>cluster</username>
    <password>cluster</password>
  </slaveserver>

修改從服務器配置文件carte-config-8081.xml

 <masters>
    <slaveserver>
      <name>master</name>
      <hostname>hadoop102</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>hadoop2.x</hostname>
    <port>8081</port>
    <username>cluster</username>
    <password>cluster</password>
    <master>N</master>
  </slaveserver>

修改從配置文件carte-config-8082.xml

<masters>
    <slaveserver>
      <name>master</name>
      <hostname>hadoop102</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>hadoop3.x</hostname>
    <port>8082</port>
    <username>cluster</username>
    <password>cluster</password>
    <master>N</master>
  </slaveserver>

6) 分發整個kettle的安裝目錄,xsync data-integration

7) 啓動相關進程,在hadoop1.x,hadoop2.x,hadoop3.x上執行

[[email protected] data-integration]# ./carte.sh hadoop1.x 8080
[[email protected] data-integration]#./carte.sh hadoop2.x 8081
[[email protected] data-integration]#./carte.sh hadoop3.x 8082

8) 訪問web頁面

http://hadoop1.x:8080

 


3、案例:讀取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下

(1) 創建轉換,編輯步驟,填好相關配置

(2) 創建子服務器,填寫相關配置,跟集羣上的配置相同

(3) 創建集羣schema,選中上一步的幾個服務器

(4) 對於要在集羣上執行的步驟,右鍵選擇集羣,選中上一步創建的集羣schema

(5) 創建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步驟)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章