目錄
本文描述在CentOS 7.2上安裝和運行Kettle 8.3的步驟。
一、安裝Java
Kettle是一個Java程序,需要Java運行時環境(Java虛擬機/JVM和一組運行時類)。Kettle與Java的版本要匹配,本例中的Kettle 8.3需要Java 1.8的支持。
# 查找yum資源庫中的java包
yum search java | grep -i --color JDK
# 安裝Java 1.8
yum install -y java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
# 驗證安裝
java -version
二、安裝Kettle
# 下載安裝包
wget https://sourceforge.net/projects/pentaho/files/Pentaho%208.3/client-tools/pdi-ce-8.3.0.0-371.zip/download
# 解壓縮,會產生一個data-integration目錄
unzip pdi-ce-8.3.0.0-371.zip
三、運行Kettle程序
1. 安裝Linux圖形環境
yum groupinstall "X Window System"
yum groupinstall GNOME Desktop
2. 安裝配置VNC Server
參見:“CentOS7.2 安裝tigerVNC-Server”
3. 在客戶端使用vncviewer連接系統
配置如圖1所示。
4. 執行spoon.sh
在桌面中打開一個終端執行spoon.sh,如圖2所示。
打開的spoon界面如圖3所示。
四、給Spoon創建一個桌面快捷啓動方式
# 編輯屬性文件
vim /root/Desktop/a.desktop
# 內容如下
[Desktop Entry]
Encoding=UTF-8
Name=spoon
Exec=sh /root/data-integration/spoon.sh
Info="Kettle"
Terminal=false
Type=Application
StartupNotify=true
各屬性含義詳細說明參見“Linux桌面快捷方式 Desktop Entry 詳解”。保存文件後,Linux桌面出現spoon圖標,如圖4所示。
雙擊spoon圖標或者點擊圖標右鍵菜單的“Open”,啓動spoon.sh程序,打開Kettle設計界面。
五、配置
Kettle運行環境內的一些因素會影響Kettle的運行方式。這些因素包括配置文件、與Kettle集成在一起的外部軟件。我們把這些因素統稱爲Kettle的配置。
1. 配置文件和.kettle目錄
Kettle運行環境中有幾個文件影響了Kettle的運行情況。這些文件可以看成是Kettle配置文件,當Kettle做了環境移植或升級時,這些文件也要隨之改變,包括:
- .spoonrc
- jdbc.properties
- kettle.properties
- kettle.pwd
- repositories.xml
- shared.xml
.spoonrc文件只用於spoon程序,其餘的則用於Kettle裏的多個程序。這些文件大部分都是存放在.kettle目錄下。.kettle目錄默認情況下位於操作系統用戶的本地目錄下,每個用戶都有自己的本地目錄(如/home/<user>,這裏的user就是操作系統的用戶名)。
.Kettle目錄的位置也可以配置,這需要設置KETTLE_HOME環境變量。例如在生產機器上,可能希望所有用戶都使用同一個配置來運行轉換和作業,就可以設置KETTLE_HOME使之指向一個目錄,所有操作系統用戶就可以使用相同的配置文件了。與之相反,也可以給某個ETL項目設置一個特定的配置目錄,需要在運行這個ETL的腳本里設置KETTLE_HOME環境變量。
(1).spoonrc
從名字就可以看出來,.spoonrc文件用於存儲Spoon程序的運行參數和狀態。其它Kettle的程序都不使用這個文件。.spoonrc文件位於.kettle目錄下。因爲在默認情況下,.kettle目錄位於用戶目錄下,所以不同用戶都使用各自的.spoonrc文件。.spoonrc文件中包括的主要屬性如下:
- 通用的設置和默認值:在Spoon裏,這些設置在“Options”對話框的“General”標籤下設置。“Options”對話框可以通過主菜單的“Tools” -> “Options”菜單項打開。
- 外觀,例如字體和顏色:在Spoon裏,這些都在“Options”對話框的“Look & Feel”標籤下。
- 程序狀態數據:如最近使用的文件列表。
通常不用手工編輯.spoonrc文件。如果新安裝了一個Kettle代替一箇舊版本的Kettle,可用舊版本的.spoonrc文件覆蓋新安裝的.spoonrc文件,這樣保留舊版本Kettle的運行狀態。所以定時備份.spoonrc文件也是必要的。
(2)jdbc.properties
Kettle安裝目錄下還有一個jdbc.properties文件,保存在simple-jndi目錄下。這個文件用來存儲JNDI連接對象的連接參數。Kettle可以用JNDI的方式來引用JDBC連接參數,如IP地址、用戶認證,這些連接參數最終用來在轉換和作業中構造數據庫連接對象。
JNDI是Java Naming and Directory Interface的縮寫,這是一個Java標準,可以通過一個名字訪問數據庫服務。注意JNDI只是Kettle指定數據庫連接參數的一種方式,數據庫連接參數也可以保持在轉換或作業的數據庫連接對象裏或資源庫裏。JNDI數據庫連接配置是整個Kettle配置的一部分。
在jdbc.properties文件裏,JNDI連接參數以多行文本形式保存,每一行就是一個鍵值對,等號左右分別是鍵和值。鍵包括了JNDI名字和一個屬性名,中間用反斜線分隔。屬性名前的JNDI名稱決定了JNDI連接包括幾行參數。以JNDI名稱開頭的幾行就構成了建立連接需要的所有參數。如下是一些屬性名稱:
- type:這個屬性的值永遠是javax.sql.DataSource。
- driver:實現了JDBC裏Driver類的,JDBC驅動類的全名。
- url:用於連接數據庫的JDBC URL連接串。
- user:數據庫用戶名。
- password:數據庫密碼。
下面是一個jdbc.properties裏保存JNDI連接參數的例子:
SampleData/type=javax.sql.DataSource
SampleData/driver=org.h2.Driver
SampleData/url=jdbc:h2:file:samples/db/sampledb;IFEXISTS=TRUE
SampleData/user=PENTAHO_USER
SampleData/password=PASSWORD
在這個例子裏,JNDI名字是SampleData,可用於建立h2數據庫的連接,數據庫用戶名是PENTAHO_USER,密碼是PASSWORD。
可以按照SampleData的格式,把自己的JNDI名字和連接參數寫到jdbc.properties文件裏。因爲在jdbc.properties裏定義的連接可以在轉換和作業裏使用,用戶需要保存好這個文件,至少需要做定時備份。
另外還需要注意部署問題,在部署使用JNDI方式的轉換和作業時,記住需要更改部署環境裏的jdbc.properties文件。如果開發環境和實際部署環境相同,就可以直接使用開發環境裏的jdbc.properties文件。但大多數情況下,開發環境使用的是測試數據庫,在把開發好的轉換和作業部署到實際生產環境中後,需要更改jdbc.properties的內容,使之指向實際生產數據庫。使用JNDI的好處就是部署時不用再更改轉換和作業,只需要更改jdbc.properties裏的連接參數。
(3)kettle.properties
kettle.properties文件是一個通用的保存在Kettle屬性的文件。屬性對Kettle而言就如同環境變量對操作系統的shell命令。它們都是全局的字符串變量,用於把作業和轉換參數化。例如,可以使用一個屬性來保存數據庫連接參數,保存文件路徑,或保存一個用在某個轉換裏的常量。
kettle.properties文件使用文本編輯器來編輯。一個屬性是一個等號分隔的鍵值對,佔據一行。鍵在等號前面,作爲以後使用的屬性名,等號後面就是這個屬性的值。下面是一個kettle.properties文件的例子:
# connection parameters for the job server
DB_HOST=dbhost.domain.org
DB_NAME=sakila
DB_USER=sakila_user
DB_PASSWORD=sakila_password
# path from where to read input files
INPUT_PATH=/home/sakila/import
# path to store the error reports
ERROR_PATH=/home/sakila/import_errors
轉換和作業可以通過${屬性名}或%%屬性名%%的方式來引用kettle.properties裏定義的這些屬性值,用於對話框裏輸入項的變量。圖5顯示的是CSV輸入步驟對話框。
如圖中所示,在文件名字段裏不再用硬編碼路徑,而使用了變量的方式${INPUT_PATH}。對任何帶有“$”符號的輸入框都可以使用這種變量的輸入方式。在運行階段,這個變量的值就是/home/sakila/import,即在kettle.properties文件裏設置的值。
這裏屬性的使用方式和前面講過的jdbc.properties裏定義的JNDI連接參數的使用方式類似。例如可以在開發和生產環境中使用不同的kettle.properties文件,以便快速切換。
儘管使用kettle.properties和jdbc.properties相似,但也有區別。首先,JNDI只用於數據庫連接,而屬性可用於任何情況。其次,kettle.properties裏的屬性名字可以是任意名字,而JNDI裏的屬性名是預先定義好的,只用於JDBC數據庫連接。
關於kettle.properties文件還有一點要說明的:kettle.properties文件裏可以定義用於資源庫的一些預定義變量。如果使用資源庫保存轉換或作業,如下這些預定義變量就可以定義一個默認資源庫:
- KETTLE_REPOSITORY:默認的資源庫名稱。
- KETTLE_USER:資源庫用戶名。
- KETTLE_PASSWORD:用戶名對應的密碼。
使用上面這些變量,Kettle會自動使用KETTLE_REPOSITORY定義的資源庫。
(4)kettle.pwd
使用Carte服務執行作業需要授權。默認情況下,Carte只支持最基本的授權方式,就是將密碼保存在kettle.pwd文件中。kettle.pwd文件位於Kettle根目錄下的pwd目錄下。默認情況下,kettle.pwd的內容如下:
# Please note that the default password (cluster) is obfuscated using the Encr script provided in this release
# Passwords can also be entered in plain text as before
#
cluster: OBF:1v8w1uh21z7k1ym71z7i1ugo1v9q
最後一行是唯一有用的一行,定義了一個用戶cluster,以及混淆後的密碼(這個密碼也是cluster)。文件的註釋說明了這個混淆的密碼是由Encr.bat或encr.sh腳本生成的。
如果使用Carte服務,尤其當Carte服務不在局域網範圍內時,就要編輯kettle.pwd文件,至少要更改默認的密碼。直接使用文本編輯器就可以編輯。
(5)repositories.xml
Kettle可以通過資源庫管理轉換、作業和數據庫連接這樣的資源。如果不使用資源庫,轉換、作業也可以保存在文件裏,每一個轉換和作業都保存各自的數據庫連接。
Kettle資源庫存儲在關係數據庫裏,也可以使用插件存儲到其它存儲系統,例如存儲到一個像SVN這樣的版本控制系統。爲了使操作資源庫更容易,Kettle在repositories.xml文件中保存了所有資源庫。repositories.xml文件可以位於兩個目錄:
- 位於用戶本地(由Java環境變量中的user.home變量指定)的.kettle目錄下。Spoon、Kitchen、Pan會讀取這個文件。
- Carte服務會讀取當前啓動路徑下的repositories.xml文件。如果當前路徑下沒有,會使用上面的用戶本地目錄下的.kettle目錄下的repositories.xml文件。
對開發而言,不用手工編輯這個文件。無論什麼時候連接到了資源庫,這個文件都由Spoon自動維護。但對部署而言,情況就不同了,在部署的轉換或作業裏會使用資源庫的名字,所以在repositories.xml文件裏必須要有一個對應的資源庫的名字。和上面講到的jdbc.properties和kettle.properties文件類似,實際運行環境的資源庫和開發時使用的資源庫往往是不同的。
在實踐中,一般直接將repositories.xml文件從開發環境複製到運行環境,並手工編輯這個文件使之匹配運行環境。
(6)shared.xml
Kettle裏有一個概念叫共享對象,共享對象就是類似於轉換的步驟、數據庫連接定義、集羣服務器定義等這些可以一次定義,然後在轉換和作業裏多次引用的對象。共享對象在概念上和資源庫有一些重疊,資源庫也可以被用來共享數據庫連接和集羣服務器的定義。但還是有一些區別,資源庫往往是一箇中央存儲,多個開發人員都訪問同一個資源庫,用來維護整個項目範圍內所有可共享的對象。
在Spoon裏單擊左側樹狀列表的“View”標籤,找到想共享的對象。右鍵單擊,然後在右鍵菜單中選擇“Share”。保存文件,否則該共享不會被保存。以這種方式創建的共享可以在其它轉換或作業裏使用(可以通過左側樹狀列表的“View”模式找到)。但是,共享的步驟或作業項不會被自動放在畫布裏,需要把它們從樹狀列表中拖到畫布裏,以便在轉換或作業裏使用。
共享對象存儲在shared.xml文件中。默認情況下,shared.xml文件保存在.kettle目錄下,.kettle目錄位於當前系統用戶的本地目錄下。也可以給shared.xml文件自定義一個存儲位置。這樣用戶就可以在轉換或作業裏多次使用這些預定義好的共享對象。
在轉換或作業的“Properties”對話框裏可以設置shared.xml文件的位置。對作業來說,在“Properties”對話框的“Settings”標籤下。對轉換來說,在“Properties”對話框的“Miscellaneous”標籤下。
可以使用變量指定共享文件的位置。例如,在轉換裏可以使用類似下面的路徑:
${Internal.Transformation.Filename.Directory}/shared.xml
這樣不論目錄在哪裏,所有一個目錄下的轉換都可以使用同一個共享文件。對部署而言,需要確保任何在開發環境中直接或間接使用的共享文件也要在部署環境中可以找到。一般情況下,在兩種環境中,共享文件應該是一樣的。所有環境差異的配置應該在kettle.properties文件中設置。
2. 用於啓動Kettle程序的shell腳本
在下面一些情況下,可能要調整一下啓動Kettle程序的shell腳本:
- 給Java classpath增加新的jar包。通常是因爲在轉換和作業裏直接或間接引用了非默認的Java Class文件。
- 改變Java虛擬機的參數,如可用內存大小。
(1)shell腳本的結構
所有Kettle程序用的shell腳本都類似:
- 初始化一個classpath的字符串,字符串裏包括幾個Kettle最核心的jar文件。
- 將libext目錄下的jar包都包含在classpath字符串中。
- 將和程序相關的其它一些jar包都包含在classpath字符串中。例如Spoon啓動時,要包含swt.jar文件,用於生成Spoon圖形界面。
- 構造Java虛擬機選項字符串,前面構造的classpath字符串也包含在這個字符串裏。虛擬機選項設置了最大內存大小。
- 利用上面構造好的虛擬機選項字符串,構造最終可以運行的Java可執行程序的字符串,包括Java可執行程序、虛擬機選項、要啓動的Java類名。
上面描述的腳本結構是Kettle 3.2和以前版本的腳本文件結構,Kettle 4.0和以後版本都統一使用Pentaho的Launcher作爲啓動程序。
(2)classpath裏增加一個jar包
在Kettle的轉換裏可以寫Java腳本,Java腳本會引用第三方的jar包。例如可以在“Java Script”步驟裏實例化一個對象,並調用對象的方法,或者在“User defined Java expression”步驟裏直接寫Java表達式。 當編寫Java腳本或表達式時,需要注意classpath中有Java腳本里使用的各種Java類。最簡單的方法就是在libext目錄下新建一個目錄,然後把需要的jar包都放入該目錄下。因爲在.sh腳本里可以加載libext目錄下的所有jar文件(包括子目錄),見下面的.sh文件裏的代碼:
# ***************************************************
# ** JDBC & other libraries used by Kettle: **
# ***************************************************
for f in `find $BASEDIR/libext -type f -name "*.jar"` \
`find $BASEDIR/libext -type f -name "*.zip"`
do
CLASSPATH=$CLASSPATH:$f
done
上面的sh腳本循環libext目錄下(包括各級子目錄)的所有jar和zip文件,並添加到classpath中。
在Kettle 4.2及以後的版本中,使用Launcher作爲啓動類,使用launcher.properties文件配置需要加載的類。用戶增加了新的jar包,需要修改launcher.properties文件,不用再修改.sh腳本文件。
(3)改變虛擬機堆大小
所有Kettle啓動腳本都指定了最大堆大小。如在spoon.sh中,有類似下面的語句:
# ******************************************************************
# ** Set java runtime options **
# ** Change 2048m to higher values in case you run out of memory **
# ** or set the PENTAHO_DI_JAVA_OPTIONS environment variable **
# ******************************************************************
if [ -z "$PENTAHO_DI_JAVA_OPTIONS" ]; then
PENTAHO_DI_JAVA_OPTIONS="-Xms1024m -Xmx2048m -XX:MaxPermSize=256m"
fi
當運行轉換或作業時,如果遇到Out of Memory的錯誤,或者運行Java的機器有更多的物理內存可用,可以在這裏增加堆的大小。
3. 管理JDBC驅動
隨Kettle帶了很多種數據庫的JDBC驅動。一般一個驅動就是一個jar文件。Kettle把所有JDBC驅動都保存在lib目錄下。
要增加新的JDBC驅動,只要把相應的jar文件放到lib目錄下即可。Kettle的各種啓動腳本會自動加載lib下的所有jar文件到classpath。添加新數據庫的JDBC驅動jar包,不會對正在運行的Kettle程序起作用。需要將Kettle程序停止,添加JDBC jar包後再啓動才生效。
當升級或替換驅動時,要確保刪除了舊的jar文件。如果想暫時保留舊的jar文件,可以把jar文件放在Kettle之外的目錄中,以避免舊的jar包也被意外加載。