Kettle構建Hadoop ETL實踐(二):安裝與配置

目錄html

1、安裝前端

1. 安裝環境java

(1)選擇操做系統linux

(2)安裝規劃程序員

2. 安裝前準備sql

(1)安裝Java環境shell

(2)安裝GNOME Desktop圖形界面數據庫

(3)安裝配置VNC遠程控制express

(4)在客戶端安裝vncviewerapache

3. 安裝運行Kettle

(1)下載和解壓

(2)運行Kettle程序

(3)建立Spoon快捷啓動方式

2、配置

1. 配置文件和.kettle目錄

(1).spoonrc

(2)jdbc.properties

(3)kettle.properties

(4)kettle.pwd

(5)repositories.xml

(6)shared.xml

2. 用於啓動Kettle程序的shell腳本

(1)shell腳本的結構

(2)classpath裏增長一個jar包

(3)改變虛擬機堆大小

(4)修改圖形工具包環境

3. 管理JDBC驅動

3、小結


        在前一篇裏介紹了ETL和Kettle的基本概念,內容偏重於理論。從本篇開始,讓咱們進入實踐階段。工欲善其事,必先利其器。既然咱們要用Kettle構建Hadoop ETL應用,那麼先要作的就是安裝Kettle。本篇首先闡述選擇安裝環境所要考慮的因素,以後詳細介紹Kettle的安裝過程,最後說明Kettle配置文件、啓動腳本和JDBC驅動管理。本專題後面的實踐部分都是基於這裏所安裝的Kettle之上完成的。

1、安裝

1. 安裝環境

(1)選擇操做系統

        有些熟悉Kettle的用戶必定會以爲,Kettle的安裝過程至關簡單,基本上就是開箱即用,而這裏所謂的「開箱」也僅僅是執行一個解壓縮命令而已,根本沒有必要單開一篇文章進行說明。稍安勿躁,且聽我慢慢道來。這裏要討論的是在Linux系統而不是Windows上安裝Kettle,緣由有以下兩點:

  • 用戶和權限問題

        Windows上運行的Kettle在鏈接Hadoop集羣時,須要在HDFS上創建Windows登陸用戶的主目錄,並進行權限配置。不然在測試Hadoop集羣鏈接時,User Home Directory Access和Verify User Home Permissions會報錯。hdfs是啓動其進程所使用的用戶,而Kettle始終用本機用戶鏈接Hadoop集羣。一般Linux和Windows系統上缺省建立的用戶名是不一樣的,所以須要在HDFS上建立Windows用戶目錄:

hdfs dfs -mkdir /user/Windows用戶名

        缺省Hadoop並不進行用戶驗證,這個工做交由操做系統代勞。爲解決Verify User Home Permissions問題,須要在config.properties文件(該文件在Kettle安裝目錄下的hadoop插件目錄下,例如D:\data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\cdh61)中添加配置:

authentication.superuser.provider=NO_AUTH

        最後重啓Kettle使配置生效。

  • Kettle中執行MapReduce報錯

        Windows上的Kettle在執行Pentaho MapReduce做業項時會報相似下面的錯誤:

ERROR (version 8.3.0.0-371, build 8.3.0.0-371 from 2019-06-11 11.09.08 by buildguy) : org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
ERROR (version 8.3.0.0-371, build 8.3.0.0-371 from 2019-06-11 11.09.08 by buildguy) : java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
    at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method)
    at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:606)
    at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:1202)
    at org.apache.hadoop.fs.FileUtil.list(FileUtil.java:1407)
    at org.apache.hadoop.fs.RawLocalFileSystem.listStatus(RawLocalFileSystem.java:468)
    at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1853)
    at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1895)
    at org.apache.hadoop.fs.ChecksumFileSystem.listStatus(ChecksumFileSystem.java:678)
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:395)
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:379)
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:2354)
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:2320)
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:2283)
    at org.pentaho.hadoop.shim.common.DistributedCacheUtilImpl.stageForCache(DistributedCacheUtilImpl.java:443)
    at org.pentaho.hadoop.shim.common.DistributedCacheUtilImpl.stageForCache(DistributedCacheUtilImpl.java:713)
    at org.pentaho.big.data.impl.shim.mapreduce.PentahoMapReduceJobBuilderImpl.stageMetaStoreForHadoop(PentahoMapReduceJobBuilderImpl.java:587)
    at org.pentaho.big.data.impl.shim.mapreduce.PentahoMapReduceJobBuilderImpl.submit(PentahoMapReduceJobBuilderImpl.java:534)
    at org.pentaho.big.data.impl.shim.mapreduce.MapReduceJobBuilderImpl.submit(MapReduceJobBuilderImpl.java:277)
    at org.pentaho.big.data.kettle.plugins.mapreduce.entry.pmr.JobEntryHadoopTransJobExecutor.execute(JobEntryHadoopTransJobExecutor.java:780)
    at org.pentaho.di.job.Job.execute(Job.java:686)
    at org.pentaho.di.job.Job.execute(Job.java:827)
    at org.pentaho.di.job.Job.execute(Job.java:498)
    at org.pentaho.di.job.Job.run(Job.java:384)

        若是說上一個問題能經過修改配置的方式來解決仍是可接受的,那麼這個問題則須要修改Hadoop中NativeIO類的源代碼並從新編譯來解決。該方案對於非程序員用戶來講確是強人所難了。

        Linux上運行的Kettle不存在上述兩個問題。咱們只要使用Linux系統中缺省建立的用戶(如root)運行Kettle,就能成功訪問Hadoop集羣,由於Hadoop集羣一樣是安裝部署在Linux系統之上。並且Linux上的Kettle執行Pentaho MapReduce做業項也不會報NativeIO錯誤。這就是咱們選擇Linux做爲Kettle安裝平臺的緣由。

        下面就要解決肯定Linux平臺所引入的一系列相關問題:

  • 爲了使用Kettle GUI,須要安裝Linux圖形環境,如GNOME。
  • 爲了遠程訪問Linux圖形環境,須要安裝遠程控制軟件,如VNC Server和VNC Client。
  • 爲了使用中文輸入和顯示,須要安裝相應的輸入法,如智能拼音。
  • 建立Kettle桌面快捷啓動方式。

(2)安裝規劃

        這裏只是演示Kettle安裝的過程,不做爲生產環境使用,所以創建四臺Linux虛機,每臺硬盤50G,內存8G。IP與主機名以下:
172.16.1.101 hdp1
172.16.1.102 hdp2
172.16.1.103 hdp3
172.16.1.104 hdp4



  • 主機規劃:以上四臺主機構成Kettle集羣。本篇只說明在172.16.1.101一臺主機上的安裝過程,其它三臺主機上的Kettle安裝過程徹底相同。Kettle集羣的配置和使用,詳見本專題的(十一)Kettle集羣與數據分片。
  • 操做系統:CentOS Linux release 7.2.1511 (Core)
  • Java版本:openjdk version 1.8.0_262
  • Kettle版本:GA Release 8.3.0.0-371

2. 安裝前準備

(1)安裝Java環境

        Kettle是一個Java程序,須要Java運行時環境(Java虛擬機/JVM和一組運行時類)。Kettle與Java的版本要匹配,本例中的Kettle 8.3須要Java 1.8的支持。若是隻是運行Kettle,只須要安裝Java Runtime Environment(JRE) 1.8。若是要從源代碼編譯Kettle或本身開發Kettle插件,須要安裝Java Development Kit(JDK) 1.8。

  • 手工安裝Java

        從https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html下載Linux x64 RPM Package對應的RPM包。下載後直接使用rpm命令進行安裝,例如:

rpm -ivh jdk-8u261-linux-x64.rpm
  • 使用yum

        yum全稱爲 Yellowdog Updater Modified,是一個在Fedora、RedHat以及CentOS中流行的shell前端軟件包管理器。它基於RPM包管理,可以從指定的服務器(在資源庫文件中定義)自動下載安裝RPM包,而且能夠自動處理依賴性關係,一次安裝全部依賴的軟件包,無須繁瑣地一次次下載安裝。yum提供了查找、安裝、刪除某一個、一組甚至所有軟件包的命令,並且命令簡潔好記。

        在CentOS下使用yum安裝Java很是簡單:

# 查找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

        若是在本地資源庫中沒有須要安裝的軟件包,能夠從網上下載公開的yum源。例如將http://mirrors.163.com/.help/CentOS7-Base-163.repo文件下載到本地的/etc/yum.repos.d/目錄下,而後再執行yum命令便可。

(2)安裝GNOME Desktop圖形界面

        這裏選擇GNOME Desktop做爲運行Kettle界面的圖形環境。GNOME Desktop是主流Linux發行版本的默認桌面,主張簡約易用,夠用便可。GNOME的全稱爲GNU網絡對象模型環境(The GNU Network Object Model Environment),基於GTK+圖形庫,使用C語言開發,官方網站是gnome.org。

1. 安裝GNOME Desktop

# 列出可安裝的桌面環境
yum grouplist

        此命令顯示了系統安裝過程當中沒有被安裝的軟件組,下面是本例中該命令的部分輸出:

...
Available Environment Groups:
   ...
   GNOME Desktop
   KDE Plasma Workspaces
   ...
Available Groups:
   ...
   Graphical Administration Tools
   ...

        從中咱們能夠看到,Centos 7中有兩大桌面環境安裝組GNOME Desktop和KDE Plasma Workspaces。執行下面的命令安裝GNOME Desktop。

yum groupinstall "GNOME Desktop" -y

        yum groupinstall命令安裝一組軟件包,這組軟件包包含了不少單個軟件,以及各個軟件之間的依賴關係。-y參數表示安裝過程當中省略確認,避免交互式輸入。當安裝成功後,能夠再次執行yum grouplist命令,從輸出中能夠看到已經安裝的GNOME Desktop。

...
Installed Environment Groups:
   GNOME Desktop
...

2. 配置中文支持
        locale -a命令列出當前系統支持的全部語言包。若是沒有zh_CN,則須要先安裝一箇中文語言包,例如:

yum install kde-l10n-Chinese

        若是系統包含中文語言包,但在安裝CentOS 7時沒有選擇中文,安裝完成後須要再使用中文,能夠按照下面的步驟進行操做。

# 安裝系統語言配置工具
yum install -y system-config-language
# 執行語言配置
system-config-language
# 選擇「chinese (P.R. of China) - 中文(簡體)」。

        肯定後,會自動將系統語言設置成zh_CN.UTF-8。也能夠執行下面的命令修改系統默認語言爲中文:

localectl set-locale LANG=zh_CN.UTF-8

        能夠在終端輸入locale命令查看更改後的系統語言變量,輸出以下:

LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

而後執行下面的命令安裝中文拼音輸入法:

yum install -y ibus ibus-libpinyin

最後重啓系統:

reboot

(3)安裝配置VNC遠程控制

        爲了可以在遠程終端中使用GNOME桌面環境,須要安裝配置VNC軟件。VNC(Virtual Network Console)是虛擬網絡控制檯的縮寫。它是一款優秀的遠程控制工具,是基於UNIX和Linux操做系統的免費開源軟件,遠程控制能力強大,高效實用。在Linux中,VNC 包括四個命令:vncserver、vncviewer、vncpasswd和vncconnect。大多數狀況下用戶只須要其中的兩個命令,即vncserver和vncviewer。

        VNC服務器工具備不少,例如tightvnc、vnc4server、tigervnc、realvnc等。這裏選擇tigervnc做爲VNC服務器。tigervnc包含服務器控制端用於實現vnc服務,其中包含一個名爲X0VNC的特殊服務,該服務運行後能夠把當前桌面會話遠程傳輸給遠端客戶端讓其操控,而不是傳統VNC的虛擬會話桌面模式。執行如下步驟安裝配置tigervnc服務器。

1. 關閉防火牆

systemctl stop firewalld
systemctl disable firewalld

2. 關閉seLinux

# 查看狀態
sestatus
# 臨時關閉
setenforce 0
# 永久關閉
vim /etc/sysconfig/selinux
SELINUX=disabled

3. 安裝tigervnc服務器

yum install -y tigervnc-server

4. 啓動vncserver

# 啓動
vncserver

        命令輸出以下:

You will require a password to access your desktops.

Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used

New 'hdp1:1 (root)' desktop is hdp1:1

Creating default startup script /root/.vnc/xstartup
Creating default config /root/.vnc/config
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/hdp1:1.log

        首次啓動vncserver時提示輸入設置遠程鏈接密碼,能夠不一樣於本地密碼,該密碼之後可使用vncpasswd命令重置。注意當出現 Would you like to enter a view-only password (y/n)? 提示時輸入n。

# 查看vncserver進程列表
vncserver -list

        命令輸出以下,顯示當前啓動了一個VNC服務器進程:

TigerVNC server sessions:

X DISPLAY #    PROCESS ID
:1        2431

5. 設置自動啓動的vncserver服務

# 複製缺省配置文件
cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:1.service
# 修改配置文件/lib/systemd/system/vncserver@:1.service,內容以下(主要是修改root用戶):
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking
User=root

# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i"
PIDFile=/root/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

# 從新加載服務配置文件
systemctl daemon-reload

# 設置開機啓動
systemctl enable vncserver@:1.service

# 重啓系統
reboot

(4)在客戶端安裝vncviewer

        從https://www.realvnc.com/en/connect/download/viewer/下載對應操做系統的安裝文件,這裏爲VNC-Viewer-6.19.1115-Windows.exe。直接運行該文件進行安裝,安裝目錄爲缺省。成功安裝後運行 C:\Program Files\RealVNC\VNC Viewer\vncviewer.exe 文件打開VNC Viewer,點擊右鍵菜單中的「New connection...」,在VNC Server中輸入VNC服務器地址,本例爲172.16.1.101:1,如圖2-1所示,而後點擊OK按鈕保存。冒號後面的1指定一個TigerVNC server sessions號。

圖2-1 在VNC Viewer添加新鏈接

        雙擊剛纔創建的鏈接,輸入並保存初次啓動VNC服務器時設置(或者由vncpasswd所設置)的密碼,如圖2-2所示。

圖2-2 輸入並保存VNC鏈接密碼

        在第一次使用GNOME Desktop時,須要進行一些初始化設置,如配置語言、時區和輸入法等。由於咱們已經設置了系統的缺省語言爲中文,而且安裝了拼音輸入法,因此缺省選擇就是中文。配置好打開的GNOME桌面如圖2-3所示,界面顯示爲中文,並支持中文輸入。

圖2-3 支持中文的GNOME桌面

        也能夠隨時在GNOME桌面環境中設置語言和時區相關選項,例如執行如下步驟添加中文拼音輸入法。

1. 選擇菜單「應用程序」 -> 「系統工具」 -> 「設置」 -> 「Region & Language」,打開如圖2-4所示的窗口。

圖2-4 設置語言和時區

 

2. 在圖2-4中點擊「輸入源」下的「+」按鈕,在彈出窗口中選擇「漢語(中國)」 -> 「漢語(Intelligent Pinyin)」,如圖2-5所示。

圖2-5 添加中文拼音輸入法

        點擊圖2-5中的「添加」按鈕就可添加輸入法。缺省使用「Super+空格」組合鍵切換輸入法,Super鍵就是普通鍵盤上的Win鍵。下面還有一步操做是將ibus拼音輸入法設置爲默認輸入方法。若是缺乏了這一步,每次重啓系統後ibus拼音輸入法就不能正常工做。設置方法爲,在GNOME桌面點擊右鍵菜單中的「打開終端」,在終端窗口中執行如下命令:

# 安裝輸入法選擇器
yum install im-chooser
# 設置默認輸入法
imsettings-switch ibus

        注意必定要在圖形界面下的終端窗口而不是字符界面控制檯執行命令,如圖2-6所示。

圖2-6 設置默認輸入法

        至此,Kettle安裝前的準備工做已經完成,Java環境、圖形界面、中文支持、遠程控制都已配置好。

3. 安裝運行Kettle

        Kettle做爲一個獨立的壓縮包發佈,能夠從sourceforge.net上下載。做爲Pentaho BI項目的一部分,能夠在https://sourceforge.net/projects/pentaho/files目錄下找到Kettle的全部版本。

(1)下載和解壓

        在sourceforge網站上,每一個版本都對應一個獨立的目錄,目錄名就是版本號。例如本專題中使用的是8.3版本,所屬目錄爲Pentaho 8.3。在該目錄下包含 shims、server、plugins、other、client-tools五個子目錄,Kettle在client-tools目錄下。sourceforge版本路徑下保存的歸檔文件是zip格式,還有與.zip文件對應的.sum文件,用於校驗zip文件的完整性,通常只須要下載.zip文件。歸檔文件的命名格式依照pdi-ce-version-extension格式,pdi表明Pentaho Data Integration,ce表明Community Edition。Kettle是跨平臺的,不管什麼操做系統都是同一下載文件。

        能夠直接從瀏覽器中下載,或者使用終端命令行工具(如wget)下載。本例執行下面的命令將Kettle 8.3版本zip文件下載到本地,而後進行解壓縮:

# 下載安裝包
wget https://sourceforge.net/projects/pentaho/files/Pentaho%208.3/client-tools/pdi-ce-8.3.0.0-371.zip
 
# 解壓縮,會建立data-integration目錄
unzip pdi-ce-8.3.0.0-371.zip

# 修改目錄名使之包含版本號
mv data-integration pdi-ce-8.3.0.0-371

        Kettle不關心被解壓縮到哪一個目錄下,因此能夠根據實際狀況來解壓縮。例如在Windows開發環境下,通常是在Program Files目錄下建立kettle或pentaho目錄,而後解壓縮到這個目錄下。在類UNIX系統下,若是用於開發目的,通常在home目錄下建立一個目錄。若是用於生產環境,通常建立/opt/kettle或/opt/pentaho目錄。

        解壓縮歸檔文件會產生一個data-integration目錄。最好從新命名這個目錄,以反映出原來的版本號。一個比較好的方法就是簡單地命名爲壓縮文件的文件名,但不包括擴展名。咱們使用Kettle根目錄一詞來表示這個安裝目錄。

        重命名目錄使之包含版本號,可讓在這個環境下工做的人一眼就看出目錄下的Kettle是哪一個版本。這也便於在一個目錄下同時維護多個Kettle版本,當但願測試新版本或進行Kettle版本升級時就能夠看出這種命名方式的優勢。

(2)運行Kettle程序

        全部Kettle程序均可以經過運行Kettle根目錄下的shell腳原本啓動。在運行shell腳本上Windows和類UNIX系統基本相同。運行Kettle的shell腳本要求當前的工做目錄就是Kettle根目錄。這意味着在寫本身的shell腳本時,調用Kettle程序以前,須要先切換工做路徑到Kettle根目錄下。

        解壓縮以後,Windows用戶經過執行Kettle根目錄下的bat文件啓動Kettle程序。例如,要設計轉換或做業能夠雙擊Spoon.bat來啓動Spoon。要執行做業能夠在命令行下運行Kitchen.bat,或在本身的腳本里調用這個bat文件。

        對於類UNIX系統來講,能夠執行相應的.sh腳原本運行Kettle,但要在運行以前設置.sh文件可執行。例如,在Kettle根目錄下能夠經過執行下面的命令讓全部.sh文件可執行:

chmod 755 *.sh

        執行完該命令後就能夠運行全部腳本了,固然前提是Kettle根目錄是當前工做目錄。本例在GNOME桌面打開一個終端窗口執行下面的命令,便可啓動spoon界面。

cd pdi-ce-8.3.0.0-371/
./spoon.sh 

(3)建立Spoon快捷啓動方式

        由於常常要使用Spoon,可能但願在任務欄或桌面上建立一個Spoon的快捷方式。Windows用戶能夠打開資源管理器到Kettle根目錄,而後選中Spoon.bat,在右鍵彈出菜單中選擇「發送到」->「桌面快捷方式」。這樣就在桌面上建立了一個快捷方式(.lnk)文件用於啓動Spoon。

        右鍵單擊新建立的快捷文件,在彈出菜單中選擇「屬性」。打開的屬性對話框裏顯示了「快捷方式」標籤。在這個標籤下,「目標」和「起始位置」輸入框已經被正確填寫,不用編輯這些屬性。「更改圖標」按鈕能夠爲這個快捷方式選中一個容易識別的圖標,通常選擇Kettle根目錄下的spoon.ico文件。

        在GNOME桌面上也能夠建立應用的快捷啓動方式,但方法比Windows稍微複雜一些。GNOME系統中的桌面快捷方式文件稱爲 Desktop Entry 文件,以".desktop"爲後綴。每一個應用程序快捷方式都和一個 Desktop Entry 文件相對應。本例中咱們但願使用root用戶執行Spoon程序,所以建立/root/桌面/Spoon.desktop文件,內容以下:

[Desktop Entry]
Encoding=UTF-8
Name=spoon
Exec=sh /root/pdi-ce-8.3.0.0-371/spoon.sh
Terminal=false
Type=Application

        Desktop Entry 文件一般以字符串"[Desktop Entry]"開始。文件的內容由若干鍵值對條目組成。Desktop Entry 文件定義了一系列標準關鍵字。標準關鍵字分爲必選和可選兩種:必選標準關鍵字必須在 .desktop 文件中被定義;而可選關鍵字則沒必要。如下是對本例中所使用關鍵字的簡單描述。

  • Encoding[可選]:指定了當前 Desktop Entry 文件中特定字符串所使用的編碼方式。
  • Name[必選]:指定了桌面快捷方式顯示的名稱。
  • Exec[可選]:關鍵字「Exec」只有在「Type」類型是「Application」時纔有意義。「Exec」的值定義了啓動指定應用程序所要執行的命令,在此命令是能夠帶參數的。
  • Terminal[可選]:關鍵字「Terminal」的值是布爾值(true或false),而且該關鍵字只有在「Type」類型是「Application」時纔有意義。其值指出了相關應用程序(即關鍵字「Exec」的值)是否在終端窗口中運行。
  • Type[必選]:關鍵字「Type」定義了Desktop Entry文件的類型。常見的值是「Application」和「Link」。「Application」表示當前Desktop Entry文件指向了一個應用程序,而「Link」表示當前Desktop Entry文件指向了一個URL(Uniform Resource Locator)。

        關於Desktop Entry的完整說明參見https://developer.gnome.org/desktop-entry-spec/

        建立/root/桌面/Spoon.desktop文件後,在GNOME桌面按F5刷新桌面,會看到桌面上出現了一個名爲「Spoon.desktop」的圖標,如圖2-7(a)所示。

圖2-7 GNOME桌面快捷方式

 

        雙擊該圖標,首次執行會出現如圖2-8所示的警告信息。

圖2-8 未信任的應用程序啓動器提示

 

        點擊圖2-8中的「Trust and Launch」按鈕,信任並啓動spoon程序,以後再運行桌面快捷方式將不會彈出未信任應用的警告。同時桌面上對應的圖標和名稱也會變爲如圖2-7(b)所示。

        與Windows快捷方式相似,點擊桌面快捷方式圖標右鍵,在彈出菜單中選擇「屬性」,點擊對話框中的圖標,能夠選擇更換自定義圖標。例如選擇了spoon.ico做爲圖標後如圖2-7(c)所示。

        至此Kettle在Linux上安裝的全部技術細節都已完成。

2、配置

        Kettle運行環境內的一些因素會影響其運行方式。這些因素包括配置文件和與Kettle集成在一塊兒的外部軟件。咱們把這些因素統稱爲Kettle的配置。將在本節瞭解到Kettle的配置包括哪些部分,以及應如何管理這些配置。

1. 配置文件和.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裏,這些設置在「選項」對話框的「通常」標籤下設置。「選項」對話框能夠經過主菜單的「工具」 -> 「選項」菜單項打開。
  • 外觀,例如字體和顏色:在Spoon裏,這些都在「選項」對話框的「觀感」標籤下。
  • 程序狀態數據:如最近使用的文件列表。

        一般不用手工編輯.spoonrc文件。若是新安裝了一個Kettle代替一箇舊版本的Kettle,可用舊版本的.spoonrc文件覆蓋新安裝的.spoonrc文件,這樣來保留舊版本Kettle的運行狀態。爲了保留歷史版本以備恢復之需,定時備份.spoonrc文件也是必要的。

(2)jdbc.properties

        Kettle還有一個jdbc.properties文件,保存在Kettle根目錄下的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類的全名。
  • 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裏定義的這些屬性值,用於對話框裏輸入項的變量。圖2-9顯示的是CSV輸入步驟對話框。

圖2-9 引用kettle.properties文件裏定義的變量

        如圖中所示,在文件名字段裏再也不用硬編碼路徑,而使用了變量的方式${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裏單擊左側樹狀列表的「主對象樹」標籤,選擇想共享的對象。右鍵單擊,而後在彈出菜單中選擇「Share」。必須保存文件,不然該共享不會被保存。以這種方式建立的共享能夠在其它轉換或做業裏使用(能夠在左側樹狀列表的「主對象樹」標籤中找到)。可是,共享的步驟或做業項不會被自動放在畫布裏,須要把它們從樹狀列表中拖到畫布裏,以便在轉換或做業裏使用。

        共享對象存儲在shared.xml文件中。默認狀況下,shared.xml文件保存在.kettle目錄下,.kettle目錄位於當前系統用戶的主目錄下。也能夠給shared.xml文件自定義一個存儲位置。這樣用戶就能夠在轉換或做業裏屢次使用這些預約義好的共享對象。在轉換或做業的設置對話框裏能夠設置shared.xml文件的位置。對做業來講,在「做業設置」對話框的「設置」標籤下。對轉換而言,在「轉換設置」對話框的「雜項」標籤下。

        可使用變量指定共享文件的位置。例如,在轉換裏可使用相似下面的路徑:

${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做爲啓動類,使用Kettle根目錄下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的機器有更多的物理內存可用,能夠在這裏增長堆的大小。只需把2048改爲更大的數字,不要修改其它任何地方。

(4)修改圖形工具包環境

        例如,spoon.sh文件中有一個環境變量配置爲export SWT_GTK3=0。使用該默認配置在建立資源庫時會報相似下面的錯誤:

No more handles because no underlying browser available.
   SWT on GTK 2.x detected. It is reccomended to use SWT on GTK 3.x and Webkit2 API.

org.eclipse.swt.SWTError: No more handles because no underlying browser available.
   SWT on GTK 2.x detected. It is reccomended to use SWT on GTK 3.x and Webkit2 API.

將配置改成export SWT_GTK3=1便可解決這個問題。

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包也被意外加載。

3、小結

        本篇講述瞭如何在Linux系統上安裝配置Kettle,包括如下要點:

  • 選擇操做系統須要考慮的問題。
  • 安裝Java(Kettle運行環境)。
  • 安裝GNOME桌面。
  • 配置VNC Server和VNC Client以遠程鏈接GNOME桌面。
  • 安裝配置中文字符集和輸入法。
  • 使用腳本啓動Kettle程序。
  • 在GNOME桌面配置Spoon快捷啓動方式。
  • Kettle的主要配置文件。

        下一篇引入本專題涉及的另外一個關鍵技術,Hadoop及其生態圈,實際演示Kettle對Hadoop的支持。

相關文章
相關標籤/搜索