Skip to content

Kettle - Kitchen

🏷️ Kettle

最近在做 Kettle 的项目,所以整理了一下 Kitchen 命令相关的文档。

Kitchen 是用来运行通过 Spoon 创建的 作业(Job)的。

本文主要参考自官方的 Kitchen User Documentation

安装

Windows 平台后解压就可以了。
Unix 平台需要运行如下命令使脚本可执行。

shell
cd Kettle
chmod +x *.sh

运行 Kitchen

Windows 平台使用 Kitchen.bat,Unix 平台和 Mac OSX 使用 kitchen.sh 运行 Kitchen。

运行需要 Java Runtime Environment 1.5 或更高的版本。

命令行参数

参数格式如下:

bash
/option:value

windows 下还可以通过 -option=value/option value 的形式设置命令行参数。

bash
Kitchen.bat -norep -file=%rep_dir%\%job_name% -level=Detailed -version

Kitchen.bat /norep /file:%rep_dir%\%job_name% /level:Detailed /version

Kitchen.bat /norep /file %rep_dir%\%job_name% /level Detailed /version

Kitchen.bat /norep /file "%rep_dir%\%job_name%" /level Detailed /version

如果参数中带有空格,需要使用单引号或双引号将它们包起来。

1. -version 显示版本信息

添加 -version 参数会在窗口输出如下信息:

txt
2020/01/14 15:50:18 - Kitchen - Kettle version 7.1.0.0-12, build 1, build date : 2017-05-16 17.18.02

2. -listparam 列出命名参数信息

使用 -listparam 参数可以列出指定 Job 中设置的命名参数信息(包括 参数名、默认值和描述)。
如果指定了 -listparam 参数,则 Job 不会被执行。
listparam 的结果格式如下:

bash
Parameter: ETLKey1=, default=DefaultKey1 : ETL主键1
Parameter: ETLKey2=, default=DefaultKey2 : ETL主键2

3. -file 指定 Job 文件

指定要执行的 Job 文件(.kjb)。

bash
-file=filename

4. -param 指定命名参数

可以通过 -param 参数指定 命名参数

bash
-param:key=value

如果是在 Windows 环境,应使用如下格式。

bash
-param:"key=value"

5. -logfile 指定日志文件

默认情况下是标准输出,Windows 下就是输出到控制台。

bash
-logfile=Logging Filename

6. -level 指定日志级别

bash
-level=Logging Level
  • Error: 错误日志
  • Nothing: 没有日志
  • Minimal: 最小日志
  • Basic: 基本日志(默认的日志级别)
  • Detailed: 详细日志
  • Debug: 调试(比较详细)
  • Rowlevel: 行级日志(非常详细,会产生大量数据)

7. -rep 指定仓库

bash
-rep=Repository name

指定仓库名时,会先读取本地的仓库配置文件(C:\Users\liujiajia.kettle\repositories.xml)。
如需登录则需要通过 -user-pass 参数指定账户和密码,另外还需要通过 -dir-job 指定需要运行的 Job(Job 名不需要带 .kjb 文件后缀)。

还可以通过环境变量 KETTLE_REPOSITORY 指定这个参数。

8. -user 指定仓库的用户名

bash
-user=Username

还可以通过环境变量 KETTLE_USER 指定这个参数。

9. -pass 指定仓库的密码

bash
-pass=Password

还可以通过环境变量 KETTLE_PASSWORD 指定这个参数。

10. -job 指定运行的 Job

参数中的 Job 名不需要带 .kjb 文件后缀。

bash
-job=Job Name

11. -listdir 列出仓库中的目录

列出 -dir 参数指定的目录下的子目录名。

bash
-listdir=Y

也可以省略后面的 =Y

bash
-listdir

12. -dir 指定仓库目录

bash
-dir=directory

/:根目录
/production/Dimensions:子目录

默认值为根目录(/)。

13. -listjobs 列出仓库目录下的 Job

列出参数 -dir 指定的仓库目录下的 Job。

bash
-listjobs=Y

这个参数同样也可以省略后面的 =Y

14. -listrep 列出有效仓库

bash
-listrep=Y

这个参数同样也可以省略后面的 =Y

输出结果格式如下:

bash
2020/01/17 15:11:34 - Kitchen - Start of run.
2020/01/17 15:11:34 - RepositoriesMeta - Reading repositories XML file: C:\Users\liujiajia\.kettle\repositories.xml
List of repositories:
#1 : Test-Development [Database repository]  id=KettleDatabaseRepository
#2 : Report [Database repository]  id=KettleDatabaseRepository
#3 : OCT_B2B_Kettle [File repository]  id=KettleFileRepository

15. -norep 不登录仓库

使用不登录到仓库的方式执行 Job,需要通过 -file 参数来指定需要运行的 Job 文件。

bash
-norep=Y

这个参数同样也可以省略后面的 =Y

如果已经设置了 KETTLE_REPOSITORY, KETTLE_USER, KETTLE_PASSWORD 环境变量,通过 -norep 参数可以防止登录到仓库。

示例

1. 从文件运行 Job

Windows 环境

bash
kitchen.bat /file:D:\Jobs\updateWarehouse.kjb /level:Basic
Kitchen.bat -rep OCT_B2B_Kettle -job "/BT/Jobs/Comm/Job_SetPreUpdateDateVariable"

Linux 环境

bash
kitchen.sh -file=/PRD/updateWarehouse.kjb -level=Minimal

2. 从仓库运行 Job

Windows 环境

bash
kitchen.bat /rep:"Production Repository" /job:"Update dimensions" /dir:/Dimensions /user:matt /pass:somepassword123 /level:Basic

3. 输出日志

Windows 环境

bash
kitchen.bat /file:C:\PRD\runAll.kjb /level:Basic >> C:\LOG\trans.log

Linux 环境

bash
kitchen.sh -file="/PRD/updateWarehouse.kjb" --level=Minimal >> /LOG/trans.log

>> 每次将日志输出到文件末尾
> 每次覆盖文件

返回值

Kitchen 返回了一个错误 Code 用来说明发生了什么异常。

  • 0 : The job ran without a problem.
  • 1 : Errors occurred during processing
  • 2 : An unexpected error occurred during loading / running of the job
  • 7 : The job couldn't be loaded from XML or the Repository
  • 8 : Error loading steps or plugins (error in loading one of the plugins mostly)
  • 9 : Command line usage printing

定时执行

Windows 环境可以使用系统自带的 任务计划程序,Linux 下可以使用 crontab 命令。

1. 使用 File Repository 时的批处理文件

项目目录结构如下,批处理文件在 bat 目录下。

bash
--bat
 |--exec_job.bat
--repository
 |--job_name.kjb

脚本运行父目录平级的 repository 目录下的 Kettle 作业。

bash
set pdi_dir=C:\pdi-ce-7.1.0.0-12\data-integration
set cur_dir=%cd%
cd..
set root_dir=%cd%
cd %cur_dir%
set rep_dir=%root_dir%\repository
set job_name=%1

%pdi_dir%\Kitchen.bat -norep -file=%rep_dir%\%job_name% -level=Detailed

2. KettleFileException

有时运行时会报 KettleFileException 异常,可以将将当前目录定位到 Kitchen.bat 所在的目录(如 C:\pdi-ce-7.1.0.0-12\data-integration)后再尝试运行。
不过仍然有可能出现类似异常,不知道为啥。

bash
org.pentaho.di.core.exception.KettleFileException:
Unable to list jar files in plugin folder 'C:\Users\liujiajia\.kettle\plugins'
Unable to get VFS File object for filename 'C:\Users\liujiajia\.kettle\plugins' : Could not find file with URI "C:\Users\liujiajia\.kettle\plugins" because it is a relative path, and no base URI was provided.