Kettle连接MySQL实战:从驱动配置到JNDI数据源部署

张开发
2026/6/14 1:13:06 15 分钟阅读
Kettle连接MySQL实战:从驱动配置到JNDI数据源部署
1. Kettle连接MySQL前的准备工作第一次用Kettle连MySQL的时候我盯着报错信息发呆了半小时。后来才发现是JDBC驱动没放对位置这种低级错误浪费了不少时间。为了避免大家重蹈覆辙我把完整的配置流程和避坑指南整理出来。必须准备的原材料最新版KettlePentaho Data Integration我用的是9.3版本MySQL数据库服务社区版8.0对应版本的JDBC驱动驱动下载有个坑要注意MySQL 5.x和8.x的驱动完全不兼容。有次我给客户部署环境他们用的是MySQL 5.7我习惯性装了8.0的驱动结果连最基本的连接测试都过不去。后来查文档才发现5.x要用com.mysql.jdbc.Driver而8.x必须用com.mysql.cj.jdbc.Driver。驱动文件建议直接从Maven仓库下载wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar放驱动的路径也有讲究Windows系统C:\Program Files\Pentaho\data-integration\libLinux系统/opt/pentaho/data-integration/lib放完驱动必须重启Spoon这个步骤我至少忘记过三次每次都会怀疑人生。重启后可以在Spoon的日志里看到类似这样的信息2023-07-15 11:23:45,123 INFO [KarafBoot] Loading jar:file:/opt/pentaho/data-integration/lib/mysql-connector-java-8.0.28.jar2. 两种连接方式实战对比2.1 通用数据库连接Generic Database这是最常用的方式适合单机开发环境。新建转换时右键点击数据库连接选择新建关键配置项如下连接参数模板连接名称MySQL_Production 连接类型Generic database 自定义连接URLjdbc:mysql://db-server:3306/data_warehouse?useSSLfalseserverTimezoneAsia/Shanghai 自定义驱动类com.mysql.cj.jdbc.Driver 用户名/密码etl_user/your_strong_password这里有几个经验值useSSLfalse在测试环境可以加生产环境建议配置真实证书时区参数serverTimezone必须和数据库服务器一致否则时间类型字段会错乱连接池参数可以这样优化# 初始连接数 initialPoolSize5 # 最大连接数 maxPoolSize20 # 验证连接的SQL testQuerySELECT 1实测发现不加连接池参数的话高并发时经常会出现连接泄漏。有次跑月度报表任务半夜收到报警说数据库连接数爆了就是因为这个。2.2 JNDI数据源部署生产环境我更推荐用JNDI方式特别是在集群部署时。它的优势在于连接信息集中管理改配置不用重启Kettle密码加密存储安全性更好多个作业可以共享同一个数据源配置步骤编辑simple-jndi/jdbc.properties# 数据源类型 prod_mysql/typejavax.sql.DataSource # 驱动类 prod_mysql/drivercom.mysql.cj.jdbc.Driver # 连接字符串 prod_mysql/urljdbc:mysql://10.0.0.5:3306/analytics?useSSLtrue # 账号密码 prod_mysql/useretl_service prod_mysql/password${DB_PASSWORD}在Kettle界面选择连接方式为JNDI名称填prod_mysql安全提示密码可以用变量替换比如搭配环境变量DB_PASSWORD使用。我在CI/CD流程中会这样处理export DB_PASSWORD$(aws secretsmanager get-secret-value --secret-id prod/mysql --query SecretString --output text) ./spoon.sh3. 高频故障排查指南3.1 连接超时问题典型报错Communications link failure The last packet sent successfully to the server was 0 milliseconds ago.排查步骤网络连通性检查telnet mysql-server 3306 # 或者用nc nc -zv mysql-server 3306防火墙配置Linux示例# 查看防火墙状态 sudo firewall-cmd --state # 开放端口 sudo firewall-cmd --zonepublic --add-port3306/tcp --permanent sudo firewall-cmd --reloadMySQL服务端配置 检查my.cnf中的绑定地址[mysqld] bind-address 0.0.0.03.2 认证失败问题MySQL 8.0默认使用caching_sha2_password认证插件有些老版本驱动不支持。两种解决方案修改用户认证方式ALTER USER etl_user% IDENTIFIED WITH mysql_native_password BY password;或者在连接字符串加参数jdbc:mysql://localhost:3306/db?authenticatinPluginmysql_native_password3.3 时区不一致问题报错信息The server time zone value UTC is unrecognized...解决方法是在连接URL显式指定时区jdbc:mysql://localhost:3306/db?serverTimezoneAsia/Shanghai4. 性能优化实战技巧4.1 连接池调优在~/.kettle/shared.xml中配置全局连接池connection nameMySQL_Prod/name pool max_active20/max_active max_idle10/max_idle min_idle5/min_idle test_on_borrowtrue/test_on_borrow validation_querySELECT 1/validation_query /pool /connection4.2 批量操作优化在表输出步骤中设置提交记录数量 1000 使用批量插入 是实测对比单条插入约500条/秒批量插入可达5000条/秒4.3 内存管理修改spoon.sh启动参数export PENTAHO_DI_JAVA_OPTIONS-Xms2G -Xmx4G -XX:MaxMetaspaceSize512m监控内存使用建议# 查看Kettle进程内存 jstat -gc pid 1000

更多文章