1.設置共享DB連接
設置DB連接共享后,可以避免每次創建轉換時,重復創建相同數據源的窘境。
2.Kettle引入自定義java的工具jar包
2.1.編寫Java工具類
2.2.將項目打成jar包
2.3.將jar包拷貝到Kettle的lib目錄下,然后啟動kettle工具
2.4.kettle創建JavaScript腳本,引入並使用自定義jar包類;
//Script here
var utl = new Packages.com.pga.pky.FormatUtils();
var optTime = utl.char2Date(OPT_TIME);
建議使用兼容模式對變量進行取值,賦值操作。(圖示沒有使用兼容模式)
3.Kettle引入自定義js文件
代碼示例如下:
//Script here
//js文件相對於kettle工具根目錄的路徑
var path =getVariable("Internal.Transformation.Filename.Directory", "相對路徑");
LoadScriptFile(path +"/common_Functions.js");
//-----------------------------------------------------------------------------------
var mpType = getVariable("MPTYPE","");
var cycleCount = str2num(getVariable("COLLECT_CYCLE_COUNT","1"));
var prevCycle = str2num(getVariable("CYCLE_PREV_VALUE","0"));
//調用js文件中的方法
var colInfo = initCycleTime(mpType, prevCycle, cycleCount);
var startTime = date2str(colInfo[0], "yyyy-MM-dd HH:mm:ss");
var endTime = date2str(colInfo[1], "yyyy-MM-dd HH:mm:ss");
writeToLog("m","時間:"+startTime+" -> "+endTime);
3.1.獲取js的路徑參數
3.2.從StartScript加載文件
注意kettle調用示例:將一個javascript文件加載到實際的運行上下文中。應該從定義的StartScript調用此函數,否則,每次處理都會加載javascript文件行。
4.Linux服務器安裝kettle
4.1.kettle程序解壓到指定目錄即可
#查看jdk版本
java -version
#進入/pdi-ce-7.1.0.0-12/data-integration/目錄下
ls -l
#查看*.sh文件是否為可執行狀態
#如果為不可執行狀態,則執行
chmod +x *.sh
#測試是否賦權成功
./kitchen.sh
./kitchen.sh輸出信息如下:
#######################################################################
WARNING: no libwebkitgtk-1.0 detected, some features will be unavailable
Consider installing the package with apt-get or yum.
e.g. 'sudo apt-get install libwebkitgtk-1.0-0'
#######################################################################
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
Options:
-rep = Repository name
-user = Repository username
-pass = Repository password
-job = The name of the job to launch
-dir = The directory (dont forget the leading /)
-file = The filename (Job XML) to launch
-level = The logging level (Basic, Detailed, Debug, Rowlevel, Error, Minimal, Nothing)
-logfile = The logging file to write to
-listdir = List the directories in the repository
-listjobs = List the jobs in the specified directory
-listrep = List the available repositories
-norep = Do not log into the repository
-version = show the version, revision and build date
-param = Set a named parameter <NAME>=<VALUE>. For example -param:FILE=customers.csv
-listparam = List information concerning the defined parameters in the specified job.
-export = Exports all linked resources of the specified job. The argument is the name of a ZIP file.
-custom = Set a custom plugin specific option as a String value in the job using <NAME>=<Value>, for example: -custom:COLOR=Red
-maxloglines = The maximum number of log lines that are kept internally by Kettle. Set to 0 to keep all rows (default)
-maxlogtimeout = The maximum age (in minutes) of a log line while being kept internally by Kettle. Set to 0 to keep all rows indefinitely (default)
4.2.kettle從資源庫獲取ETL腳本
#找到安裝kettle用戶的用戶目錄
cd ~
#將windows中用戶目錄下的.kettle(隱藏文件)文件夾拷貝到當前目錄(Linux下的用戶目錄)
ls -a #查看所有文件,包含隱藏文件
#進入.kettle文件夾,修改/查看資源庫配置文件repositories.xml
配置文件內容
<?xml version="1.0" encoding="UTF-8"?>
<repositories>
<connection>
.....
</connection>
<repository> <id>KettleFileRepository</id>
<name>fileRepository</name>
<description>filereposity</description>
<read_only>N</read_only>
<hides_hidden_files>N</hides_hidden_files>
<connection>.....</connection>
</repository>
</repositories>
5.啟動kettle轉換腳本和作業腳本
啟動命令語法:
#執行job
sh /opt/kettle/kitchen.sh -rep=資源庫名稱 -user=(登陸資源庫的)用戶名 -pass=密碼 -dir=腳本所在目錄 -job=腳本名 -level=Basic > /opt/kettle/log/etl.log
#執行轉換
sh /opt/kettle/pan.sh -rep=資源庫名稱 -user=(登陸資源庫的)用戶名 -pass=密碼 -dir=腳本所在目錄 -trans=腳本名 -level=Basic > /opt/kettle/log/etl.log
參考腳本:
#!/bin/sh
REP='fileRepository'
USER="$1"
PASS="$2"
DIR="$3"
FILE="$4"
TYPE="$5"
if test -e /opt/kettle/log"$DIR"
then
echo '日志目錄已存在'
else
mkdir -p /opt/kettle/log"$DIR"
echo '日志目錄已創建'
fi
if [ "$TYPE" = "JOB" ] || [ "$TYPE" = "job" ]; then
nohup sh /opt/kettle/pdi-ce-7.1.0.0-12/data-integration/kitchen.sh -rep="$REP" -user="$USER" -pass="$PASS" -dir="$DIR" -job="$FILE" -level=Basic > "/opt/kettle/log$DIR$FILE.log" 2>&1 &
echo '執行:kitchen.sh'
else
nohup sh /opt/kettle/pdi-ce-7.1.0.0-12/data-integration/pan.sh -rep="$REP" -user="$USER" -pass="$PASS" -dir="$DIR" -trans="$FILE" -level=Basic > "/opt/kettle/log$DIR$FILE.log" 2>&1 &
echo '執行:pan.sh'
fi
echo "賬號:$USER 密碼:$PASS"
echo "目錄:$DIR 文件:$FILE 類型:$TYPE"
echo "日志路徑:/opt/kettle/log$DIR$FILE.log"
exit
6.提升ETL腳本導入MySQL數據庫效率
useServerPrepStmts:如果服務器支持,是否使用服務器端預處理語句 默認值為“true” 調整為“ false”
rewriteBatchedStatements是否批量執行(對於insert,驅動則會把多條sql語句重寫成一條風格很酷的sql語句,然后再發出去。 官方文檔說,這種insert寫法可以提高性能【對delete和update,驅動所做的事就是把多條sql語句累積起來再一次性發出去】)“true”
useCompression壓縮數據傳輸,優化客戶端和MySQL服務器之間的通信性能 “true”
characterEncoding:此處也可以設置字符及編碼,用於解決數據庫字符集不同造成的中文亂碼問題。如:utf8
Kettle日志級別
Kettle的日志級別LogLevel分為以下幾個:
- Nothing 沒有日志 不顯示任何輸出
- Error 錯誤日志 僅僅顯示錯誤信息
- Minimal 最小日志 使用最小的日志
- Basic 基本日志 缺省的日志級別
- Detailed詳細日志 給出日志輸出的細節
- Debug 調試日志 調試目的,調試輸出
- Rowlevel行級日志 打印出每一行記錄的信息
大批量數據轉換時,將日志級別調整為:Error 錯誤日志 僅僅顯示錯誤信息 ,也可以提升數據轉換速度。
7.js中可以通過getVariable(var, var)獲取的變量列舉:
內置變量
變量 | 描述 |
---|---|
Internal.Kettle.Version | 這是kettle的版本號,比如4.0.0 |
Internal.Kettle.Build.Version | 這是kettle源代碼的SVN的修訂號 |
Internal.Kettle.Build.Date | 這是kettle的build日期 |
Internal.Job.Filename.Directory | 如果使用文件方式運行作業(.kjb),這個變量就是作業文件所在的目錄。里用這個變量用戶可以指定其它文件 |
Internal.Job.Filename.Name | 如果使用文件方式運行作業(.kjb),這個變量就是作業文件名 |
Internal.Job.Name | 當前正在執行的作業的名字 |
Internal.Transformation.Repository.Directory | 如果使用資源庫方式執行轉換,這個變量是轉換所在資源庫目錄的路徑 |
Internal.Step.Partition.ID | 如果一個步驟是以分區方式運行的,每個分區都有一個步驟拷貝。這個變量就是步驟拷貝所屬的分區ID |
Internal.Step.Partition.Number | 如果一個步驟是以分區方式運行的,每個分區都有一個步驟拷貝器。這個變量就是步驟拷貝所屬的分區編號,分區編號從0到分區個數減1 |
Internal.Slave.Transformation.Number | 如果轉換在子服務器上以集群方式運行,這個變量就是子服務器的名字 |
Internal.Cluster.Size | 如果轉換在子服務器上以集群方式運行,這個變量就是集群中子服務器的個數 |
Internal.Step.Unique.Number | 這個變量是指定步驟的步驟拷貝的唯一編號。這個變量同樣適用於分區和集群環境。取值從0到步驟拷貝個數減1 |
Internal.Cluster.Master | 若轉換以集群方式運行,如果是運行在主服務器上,這個值是Y,如果是運行在子服務器上,這個值是N |
Internal.Step.Unique.Count | 唯一的步驟拷貝個數。也適用於集群或分區的情況 |
Internal.Step.Name | 正在執行的步驟的名字 |
Internal.Step.CopyNr | 本地轉換的步驟拷貝號(不考慮集群的情況) |
kettle變量
變量 | 描述 |
---|---|
KETTLE_SHARED_OBJECTS | 作業和轉換的共享對象文件的位置。默認的共享對象文件shared.xml,位於Kettle Home 目錄下。設置這個變量可以覆蓋默認值 |
KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL | 如果這個變量設置為Y,空字符串和null是不同的,否則就是相同的(默認) |
KETTLE_MAX_LOG_SIZE_IN_LINES | kettle初始的最大日志行數。設置為0將保留所有日志行(默認) |
KETTLE_MAX_LOG_TIMEOUT_IN_MINUTES | kettle中日志行的最長保留時間(單位:分鍾)。設置為0將保留所有行(默認) |
KETTLE_STEP_PERFORMANCE_SNAPSHOT_LIMIT | 內存中的最大步驟性能快照數。設置為0將保留所有快照(默認) |
KETTLE_PLUGIN_CLASSES | 逗號分隔的類名列表,用來查找插件iandeannotation。參考http://wiki.pentaho.com/display/EAI/How+to+debug+a+Kettle+4+plugin |
KETTLE_LOG_SIZE_LIMIT | 如果在轉換和作業的日志表的配置izhong沒有設置“日志行數限制”參數,這類轉換和作業將統一使用這個參數作為最大日志行 |
- TRANS:對於轉換日志表。
- TRANS_PERFORMANCE:對於性能日志表。
- STEP:對於步驟日志表。
- JOB:對於作業日志表
- JOBENTRY:對於作業項日志表。
- CHANNEL:對於通道日志表。
kettle日志表變量
變量 | 描述 |
---|---|
KETTLE_…_LOG_DB | 設置日志表使用的數據庫連接的名字 |
KETTLE_…_LOG_SCHEMA | 設置日志表使用的數據庫模式名 |
KETTLE_…_LOG_TABLE | 設置日志表使用的日志表名 |
8.kettle中的參數在SQL腳本中的用法
上圖中的說明有問題,並不是CRUD的結果,而是語句執行的狀態值(具體內容還需繼續測試。。。)
9.kettle按條件執行sql腳本的問題
1.現象
在轉換腳本中按條件執行sql腳本存在問題,不管是否滿足條件sql腳本都會先於過濾組件執行一次。如下圖:
2.解決
上述問題可以在job中解決。如下圖: