国内企业做数据集成、数据仓库迁移的朋友,这两年应该都绕不开这个场景:项目要求信创环境,操作系统换成了欧拉(OpenEuler),原来的ETL调度工具Kettle还得继续用。我最近正好在OpenEuler 22.03 LTS SP4上完整部署了一套Kettle(Pentaho Data Integration),从JDK选型、系统配置、驱动适配到踩坑排查,整个过程整理出来,希望能帮正要上车的同行省点时间。
先说结论:OpenEuler上部署Kettle完全可行,无论是本地图形化开发还是服务器端命令行跑作业,都能稳定运行。关键就三个点:JDK版本选对、系统基础依赖装齐、数据库驱动放到位。剩下的都是体力活。这篇文章我会按照实际部署顺序来写,你现在拿到的是一份可以直接照着做的操作记录,而不是泛泛而谈的安装教程。
1. 部署规划与环境准备
1.1 为什么选OpenEuler 22.03 LTS SP4
欧拉系统目前主流的稳定版本就是22.03 LTS和24.03 LTS两条线。我这次选择的是22.03 LTS SP4(x86_64架构)的everything镜像,主要原因是生产环境求稳。
SP4是22.03这个长期支持版本的第4个更新包,属于成熟稳定期,内核版本是5.10,glibc、systemd这些基础组件都经历过大量验证。如果你是企业生产环境跑Kettle作业,我建议优先选LTS版本的SP3或SP4,而不是追新用24.03。24.03虽然新,但有些第三方组件的兼容性还没充分验证,比如某些老版本数据库驱动在更新的glibc下可能出奇怪问题。
这里顺便说一句,欧拉系统的Everything镜像里包含了大量软件包,安装时如果你打算用图形化开发环境,勾选“Server with GUI”或者最小化安装后再装桌面都可以。我实际部署时为了节省资源,服务器上跑的是最小化安装,本地开发机因为需要看Kettle的图形界面,才装了带桌面的版本。如果只是命令行执行转换和作业,最小化安装完全够用。
1.2 部署清单和版本选型逻辑
先把这次部署涉及的核心组件版本列出来,后面所有操作都基于这个组合:
| 组件 | 版本 | 说明 |
|---|---|---|
| 操作系统 | OpenEuler 22.03 LTS SP4 x86_64 | 服务器和开发机均为该版本 |
| Kettle (PDI) | 9.4.0.0-343 或 10.2.0.0-xxx | 9.x与10.x部署方式相同 |
| JDK | 1.8(OpenJDK)或 11 | 9.4建议JDK 8,10.x建议JDK 11 |
| 数据库驱动 | 按需放置 | MySQL、PostgreSQL、达梦等 |
JDK版本的选型是整个部署中最容易踩坑的地方。Kettle 9.x系列官方推荐Java 8,虽然用Java 11也能启动,但有些组件(比如某些旧版数据库驱动和插件)在Java 11下会报模块访问错误。Kettle 10.x则要求Java 11或17,这时候再用Java 8反而起不来。
我强烈建议:在开始安装之前先确定Kettle版本,再去匹配JDK版本,而不是先装一个最新版JDK然后被迫升级Kettle。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 欧拉系统的初始化配置
2.1 系统安装时的几个关键点
热词里有朋友提到“安装欧拉系统报错the password fail the dictionary check-error loading dic”,这个问题我在测试环境也遇到过。这个是OpenEuler的密码强度策略在拦截弱密码,安装时设置的root密码如果过于简单(比如全数字、纯字母、长度不够),就会触发dictionary check报错。解决办法很简单:设置密码时包含大小写字母加数字,长度至少8位,或者安装引导界面按提示调整密码复杂度选项。
另外,如果你是VMware里装欧拉,虚拟机设置时建议分配至少4GB内存和40GB磁盘,处理器给2核以上。Kettle跑起来之后JVM默认堆内存就有1GB左右,加上系统本身占用,2GB内存的虚拟机跑起来会非常痛苦。网络适配器选NAT或桥接都可以,只要后面能联网配yum源就行。
2.2 配置yum源:不配源后面寸步难行
刚装完的欧拉系统,dnf源默认指向的是官方repo。如果你在内网环境或者访问外网受限,一定要先搞定yum源,否则后面装JDK、装依赖包都会卡住。
最简单的做法是保留官方源,直接刷新缓存:
bash复制dnf makecache
如果是在内网环境,需要配置本地源或镜像源。欧拉的源配置在 /etc/yum.repos.d/ 目录下,常见的有 openEuler.repo。修改方式如下:
bash复制vi /etc/yum.repos.d/openEuler.repo
把baseurl改成你内网镜像地址(如果有),或者用清华、华为云等公开镜像源地址。改完后执行:
bash复制dnf clean all
dnf makecache
这里有个小坑:欧拉22.03的repo文件里分了 [OS]、[everything]、[EPOL] 等多个仓库,EPOL里包含了一些扩展包,如果你后面要装某些特殊依赖(比如图形界面相关组件),确认EPOL仓库的baseurl也配置正确且可用。
2.3 网络和主机名配置
服务器部署Kettle,网络配置是基础。欧拉系统网卡配置文件在 /etc/NetworkManager/system-connections/ 目录下(nmcli管理方式),和CentOS 7的 /etc/sysconfig/network-scripts/ 路径不太一样。
配置静态IP,我习惯直接用nmcli:
bash复制nmcli con mod ens160 ipv4.addresses 192.168.1.100/24
nmcli con mod ens160 ipv4.gateway 192.168.1.1
nmcli con mod ens160 ipv4.dns "223.5.5.5 119.29.29.29"
nmcli con mod ens160 ipv4.method manual
nmcli con up ens160
上面是热词里“openeuler 24.03 静态ip”和“欧拉系统网卡配置”相关的内容,在22.03上同样适用。设置完后 ip addr 验证一下,能ping通网关就说明网络没问题。
如果服务器只是内网使用,防火墙建议精细管控而不是直接关闭。Kettle本身不需要开放固定端口(除非你要用Carte做远程执行),但如果你计划用Carte模式,记得放行8080端口:
bash复制firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
3. JDK安装:版本选错全盘皆输
3.1 OpenEuler安装OpenJDK 8
欧拉的软件源里自带OpenJDK,直接dnf安装是最省事的方案。装JDK 8执行:
bash复制dnf install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
装完验证:
bash复制java -version
看到 openjdk version "1.8.0_xxx" 就说明成功了。-devel 包一定要装,Kettle启动脚本会用到jli库和javac相关工具,只装运行时在某些场景下会报 Unable to locate a Java Runtime 之类的错误。
如果你打算用Kettle 10.x,那就装JDK 11:
bash复制dnf install -y java-11-openjdk java-11-openjdk-devel
系统里有多个JDK版本时,用 alternatives --config java 切换默认版本。
3.2 踩坑实录:JVM内存参数导致的启动失败
这是我在部署过程中遇到的第一个真正让人头疼的问题。Kettle启动脚本 spoon.sh 里默认的 PENTAHO_DI_JAVA_OPTIONS 参数是:
bash复制-Xmx2048m -XX:MaxPermSize=256m
问题在于:JDK 8以后 -XX:MaxPermSize 参数已经被移除了,如果你用的是JDK 11或17,启动时会直接报 Unrecognized VM option 'MaxPermSize=256m',Kettle图形界面根本弹不出来。
解决方法有两种。第一种是修改 spoon.sh,把 -XX:MaxPermSize=256m 去掉。第二种是启动前设置环境变量覆盖默认参数:
bash复制export PENTAHO_DI_JAVA_OPTIONS="-Xmx2048m"
./spoon.sh
我实际操作时习惯两个都做:先改 spoon.sh 里的默认值,再在启动脚本外层包一层环境变量设置,这样以后升级Kettle版本也不会忘。
3.3 为什么说JDK路径配置要写成绝对路径
Kettle启动时会通过 JAVA_HOME 环境变量去找Java。你可以在 /etc/profile 里设置:
bash复制export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
要注意的是,欧拉通过dnf安装的OpenJDK,实际路径是带了架构和版本号的,比如 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.342.b07-1.oe2203sp4.x86_64。直接设置 JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk 其实是指向了一个软链接目录,当前版本下这个软链接是存在的,可以用 ls -l /usr/lib/jvm/ 确认一下。如果不存在,就写实际解压路径。
经验之谈:我一般不依赖系统级 JAVA_HOME,而是直接在 kettle-start.sh 启动脚本里显式指定:
bash复制export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
这样即使系统有其他项目改了环境变量,也不会波及Kettle。
4. Kettle本体安装与目录规划
4.1 下载与解压
Kettle的官方下载地址是Pentaho官网,社区版叫 pdi-ce-9.4.0.0-343.zip 或 pdi-ce-10.2.0.0-xxx.zip,大概1GB左右。如果你是国内网络,下载速度可能不理想,建议找镜像或直接到官网下。
下载完成后解压:
bash复制mkdir -p /opt/kettle
unzip pdi-ce-9.4.0.0-343.zip -d /opt/kettle/
解压完成后 /opt/kettle/data-integration 就是Kettle的主目录。这里注意,Kettle主目录里的文件权限要保持可读可执行,尤其 spoon.sh 和 kitchen.sh 这两个脚本。如果解压后没有执行权限:
bash复制chmod +x /opt/kettle/data-integration/*.sh
4.2 目录结构说明和启动方式
Kettle目录里有几个关键文件,简单介绍下:
| 文件/目录 | 作用 |
|---|---|
| spoon.sh | 图形化开发界面(Spoon)启动脚本 |
| kitchen.sh | 命令行执行作业(Job)的脚本 |
| pan.sh | 命令行执行转换(Transformation)的脚本 |
| carte.sh | 启动Carte远程执行服务 |
| lib/ | Kettle核心依赖和数据库驱动jar包目录 |
| plugins/ | 插件目录,比如大数据、olap等插件 |
图形界面启动:
bash复制cd /opt/kettle/data-integration
./spoon.sh
命令行执行转换:
bash复制./pan.sh -file=/path/to/your_trans.ktr -level=Basic
命令行执行作业:
bash复制./kitchen.sh -file=/path/to/your_job.kjb -level=Basic
如果你是在没有桌面环境的服务器上部署,就不能跑 spoon.sh,只能通过 pan.sh 和 kitchen.sh 执行你已经开发好的转换和作业。这也是最常见的生产模式:本地开发机上做ETL开发,打好的ktr/kjb文件上传到服务器,通过命令行或调度平台调用。
4.3 开发机与服务器分离:一个建议的工作模式
部署过程中我强烈推荐采用“开发机+服务器”分离的模式。也就是开发机上安装带桌面环境的欧拉(或Windows也行),跑Spoon图形界面开发作业;生产服务器最小化安装,只跑 pan.sh 和 kitchen.sh。
这样做的好处是显而易见的:生产服务器不需要装X Window和桌面组件,攻击面更小、资源占用更低、运行更稳定。同时你把ktr/kjb文件和必要的驱动jar包通过Git或rsync同步到服务器,用 kitchen.sh 配合cron或调度平台(如DolphinScheduler)执行即可。
我在实际项目里就把Kettle作业做成了标准目录结构:
bash复制/opt/etl/
├── jobs/ # 作业文件 .kjb
├── transforms/ # 转换文件 .ktr
├── logs/ # 执行日志
├── scripts/ # 调用脚本
└── lib/ # 第三方驱动jar
调用脚本统一放在 scripts 目录下,通过 kitchen.sh 调用,日志按日期切割。这样即使Kettle升级,也只是替换 /opt/kettle 下的主程序,业务文件完全不受影响。
5. 数据库驱动适配:最容易被忽视的环节
5.1 驱动jar包放哪里
Kettle连接数据库,本质上是把数据库驱动jar包加载到JVM里。驱动jar统一放在 /opt/kettle/data-integration/lib 目录下。
这里有一个多年的老坑:Kettle自带的MySQL驱动是老旧的5.x版本,如果你要连接MySQL 8+,必须在 lib 目录下放新的 mysql-connector-java-8.0.x.jar,否则会报 Could not load driver 或者 Public Key Retrieval is not allowed 这类错误。
放jar包的操作很简单:
bash复制cp mysql-connector-j-8.0.33.jar /opt/kettle/data-integration/lib/
放完以后必须重启Kettle或重新执行 spoon.sh,jar包才会生效。
5.2 连接达梦数据库的经验
热搜词里有“kettle连接达梦”,这是一个比较典型的需求,因为达梦数据库在信创项目中很常见。Kettle原生不支持达梦,但达梦官方提供了JDBC驱动 DmJdbcDriver18.jar,需要手动放到lib目录。
连接配置时,驱动类填 dm.jdbc.driver.DmDriver,连接URL格式为:
bash复制jdbc:dm://192.168.1.200:5236/DMSERVER
用户名密码就是达梦数据库的用户。特别提醒一下,达梦JDBC驱动对Java版本有要求,DmJdbcDriver18需要JDK 8及以上,如果你用的是JDK 11,要注意驱动版本是否兼容,否则会报 Unsupported major.minor version。
5.3 连接池参数和时区问题
Kettle连接数据库时,建议在连接配置里加上连接池参数。在 Spoon 的数据库连接窗口里,切换到“连接池”选项卡,设置初始连接5、最大连接20,超时时间默认即可。
时区问题也很常见。连接MySQL时如果URL里没指定时区,可能出现日期偏移8小时的问题。解决办法是在连接URL里加上:
bash复制jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
注意URL里的 & 符号在XML配置里需要转义为 &。这个问题很容易被忽略,如果在Kettle里直接写连接串时发现保存后报错,检查一下这个转义。
6. 最小化安装服务器的无界面运行配置
6.1 远程调度时图形界面在哪里开发
如果你服务器是最小化安装,没有图形界面,远程开发会面临一个问题:Spoon界面起不来。这种情况下有几种方案。
第一种方案:开发机装Windows或带桌面的Linux,本地开发,文件上传到服务器。这是最稳妥的,但开发机的Kettle版本必须和服务器保持一致,否则可能出现ktr文件不兼容的情况。
第二种方案:服务器上用X11转发。在你的开发机上运行:
bash复制ssh -X user@server /opt/kettle/data-integration/spoon.sh
这种方式需要开发机有X Server(Windows上可以用MobaXterm或Xming)。实测下来延迟较高,简单转换还凑合,复杂的作业拖拽起来比较痛苦。生产环境不建议这么做,只适合应急编辑。
第三种方案:Carte远程执行服务。Kettle支持 carte.sh 启动一个Web服务,在Spoon里配置远程服务器,把作业提交到Carte执行。Carte模式的好处是作业在服务器上跑,本地只做开发,适合需要远程调试的场景。
6.2 编写生产级调度脚本
生产环境我一般不用Kettle自带的定时功能,而是写一个shell脚本,配crontab调用 kitchen.sh。典型的脚本内容:
bash复制#!/bin/bash
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
KETTLE_HOME=/opt/kettle/data-integration
JOB_FILE=/opt/etl/jobs/daily_sync.kjb
LOG_FILE=/opt/etl/logs/sync_$(date +%Y%m%d_%H%M%S).log
$KETTLE_HOME/kitchen.sh -file=$JOB_FILE -level=Detailed -logfile=$LOG_FILE
crontab配置:
bash复制0 2 * * * /opt/etl/scripts/run_daily_job.sh
注意几个细节:-level 参数建议用 Basic(默认)或 Detailed。Basic 只记录关键信息,日志量小;Detailed 会记录每个步骤的详细执行情况,排查问题时更清楚但对磁盘有压力,建议只开日志保留周期。
日志切割很重要。如果Kettle作业是长周期高频率执行,日志文件会膨胀很快。我习惯在脚本里把日志文件名带时间戳,再配合logrotate做归档清理。
6.3 Kettle性能调优的两个关键参数
服务器上跑Kettle,最影响性能的是JVM堆内存。默认 -Xmx2048m 对于复杂转换来说偏小,尤其是大批量数据同步的场景。我建议根据服务器物理内存调整:
bash复制export PENTAHO_DI_JAVA_OPTIONS="-Xmx4096m -Xms1024m"
如果服务器内存有16GB,可以给Kettle分4GB;如果是32GB内存,分8GB也行。但注意,堆内存不是越大越好,过大的堆会导致GC停顿变长,反而影响稳定性。经验值:给JVM分配物理内存的1/4到1/3,留足系统和其他进程的内存空间。
另一个调优点在转换本身。Kettle里 表输入 和 表输出 步骤可以设置“每个步骤提交记录数”,默认1000条。如果你数据量很大且目标表没有特殊约束,可以提高到5000或10000,减少事务提交次数,吞吐量提升明显。这个不算部署问题,但部署完成做性能验证时很常见。
7. 常见问题与排查技巧实录
7.1 Kettle界面中文乱码
Spoon界面偶尔会出现中文乱码,包括菜单和转换里的中文注释。这通常是系统缺少中文字体或locale设置问题。欧拉最小化安装默认locale是 en_US.UTF-8,如果在带桌面的环境看中文乱码,可以装中文字体:
bash复制dnf install -y wqy-zenhei-fonts wqy-microhei-fonts
然后在 spoon.sh 开头加上:
bash复制export LANG=zh_CN.UTF-8
如果还是乱码,检查一下系统是否已经生成 zh_CN.UTF-8 locale:
bash复制localectl list-locales
没有的话用 localectl set-locale LANG=zh_CN.UTF-8 设置。
7.2 内存溢出和SWT错误
启动时报 Failed to create the Java Virtual Machine 或者 Could not reserve enough space for object heap,说明JVM堆内存参数超出了物理内存余量。解决办法就是调低 PENTAHO_DI_JAVA_OPTIONS 里的 -Xmx 值,或者先释放一些内存。
Spoon启动时窗口弹不出来,但在终端看到 Unsupported Eclipse SWT widget 之类的报错,大概率是没有图形环境。如果你确实在带桌面的系统上,可以检查DISPLAY变量:
bash复制echo $DISPLAY
如果输出为空,说明图形会话没有正常启动。
7.3 忘记了root密码怎么办
热词里有“openeuler 2203 lts 忘记root密码可以重置不”。这个我实测过,欧拉和大多数Linux发行版一样,通过进入单用户模式重置密码。
大致思路是:重启系统,在GRUB界面按e进入编辑,找到linux开头的那一行,在末尾加上 rd.break,然后按Ctrl+X引导进入emergency环境,用 mount -o remount,rw /sysroot 和 chroot /sysroot 切到真实根目录,再用 passwd root 重置密码。注意这套操作只适合物理机或自己掌控的虚拟机,云服务器建议走控制台重置。
不过这里要提醒一句:重置root密码只解决登录问题,不会影响系统和数据。但如果你启用了SELinux(欧拉默认开启),重置密码后可能涉及SELinux上下文问题,稳妥起见在紧急模式下执行 touch /.autorelabel,让系统下次启动时自动校正文件安全上下文。
7.4 Kettle连接数据库报错排查
数据库连接类问题,我推荐按这个顺序排查:
- 驱动jar包是否在lib目录:没有jar包一定连不上,报错信息常见为
Driver class not found。 - 驱动类和URL是否匹配:MySQL 8对应
com.mysql.cj.jdbc.Driver,老版本驱动类是com.mysql.jdbc.Driver。URL格式jdbc:mysql://host:port/db,达梦是jdbc:dm://host:port/db。 - 网络连通性:在服务器上用
ping和telnet ip 3306测试。 - 防火墙和SELinux:确认服务器防火墙放行了目标端口,SELinux状态
getenforce,如果是Enforcing且出现权限相关日志,可以临时setenforce 0测试。
7.5 一个冷门但很坑的问题:临时目录空间不足
Kettle执行过程中会用到系统临时目录 /tmp 来存储临时文件。如果你的 /tmp 挂载在根分区且根分区可用空间很小,ETL跑到一半可能报 No space left on device。
排查方法:
bash复制df -h /tmp
如果发现空间紧张,可以设置环境变量把Kettle的临时目录指到大分区:
bash复制export TMPDIR=/data/tmp
mkdir -p /data/tmp
这个坑在内网服务器上特别常见,根分区只有20GB,Kettle跑全量同步时把临时文件一写,空间瞬间满了。我之前就吃过这个亏,全量同步跑了45分钟,最后一步写目标表时直接中断,排查半天发现是 /tmp 满了。
8. 从我这次部署中提炼的几个经验
最后分享几个实际操作层面的体会,不一定能在官方文档里直接找到。
关于Kettle版本,如果你不是必须使用新特性,建议固定在9.x系列。9.x是目前国内使用最广、社区资料最丰富的版本,遇到问题搜索解决方案容易得多。10.x虽然界面更新、支持了更多新驱动,但插件的兼容性变动比较大,有些第三方插件还没跟上。
关于欧拉系统的维护,部署完后建议做一个快照或镜像备份。Kettle参数调优、驱动适配都是摸索出来的,如果哪次操作把环境搞坏了,恢复成本很高。我在测试环境踩完坑、稳定运行一周后,就给系统做了完整备份,之后上线生产就从容多了。
关于后续扩展,如果部署完Kettle只是跑几个简单的数据库迁移作业,那当前方案完全够用。但如果你后续要接大数据组件(Hadoop、Hive、Spark),建议现在就把Kettle对应的大数据插件(pentaho-hadoop-shims)研究一下,欧拉系统下这类插件的依赖问题比普通数据库连接要复杂得多,提前准备能省一多半的后续排障时间。
这次部署从开始准备环境到稳定运行,总共花了大约两天半。最难的不是安装本身,而是那些零散的兼容性问题——驱动版本、JVM参数、系统locale、临时目录。希望这篇记录能帮你把这些坑提前避开。如果你在部署中遇到了我上面没写到的问题,欢迎在评论区交流,我这边也在持续积累欧拉系统上跑数据集成工具的经验。
