Kettle 实战面试题及参考答案(完整版)
以下是几个 Kettle(Pentaho Data Integration)项目实战面试题及参考答案的完整 Markdown 格式整理,包含代码示例和优化方案。
目录
1. Kettle 抽取数据时遇到中文乱码,如何解决?
答案:
- 原因:数据库客户端默认编码与 Kettle 设置不一致(如 UTF-8 与 GBK)。
- 解决方案:
- 在输出步骤的数据库连接中设置编码参数(如
characterEncoding=utf8
)。 - 通过 Kettle 的
Options
菜单添加全局参数characterEncoding=GBK/UTF8
。 - 确保源数据库和目标数据库的字符集一致。
参考来源:优快云博客
- 在输出步骤的数据库连接中设置编码参数(如
2. 如何处理增量数据抽取?请举例说明
答案:
- 方法:
- 时间戳法:记录上次抽取的最大时间戳,仅抽取新增或修改的数据。
- CDC(变更数据捕获):利用数据库日志(如 MySQL Binlog)捕获增量数据。
- 全量比对:通过哈希值或主键比对差异数据(适用于小数据量)。
- 示例:
-- 表输入步骤中动态传递时间戳参数 SELECT * FROM orders WHERE update_time > '${LAST_EXTRACT_TIME}';
3. 抽取的数据存在重复,如何解决?
答案:
- 排序记录:使用 排序记录 步骤按主键或关键字段排序。
- 去重处理:添加以下步骤之一:
Unique Rows
:基于字段值去重。HashSet
:通过哈希算法快速去重。
- 目标表约束:在目标表中设置主键或唯一索引,防止重复插入。
注意:去重前必须排序,否则可能遗漏部分重复数据。
示例代码:
-- 表输入步骤中筛选数据
SELECT user_id, name FROM source_table;
-- 排序记录步骤配置:按 user_id 升序排序
-- Unique Rows 步骤配置:勾选 user_id 作为去重依据
4. 如何同步亿级大表数据?
答案:
-
优化方案:
- 分页读取:
-- 分页查询示例(按主键排序) SELECT * FROM big_table ORDER BY id LIMIT ${PAGE_SIZE} OFFSET ${PAGE_NUM * PAGE_SIZE};
- 批量提交:
- 在
表输出
步骤中设置Commit Size
为 10,000~50,000,减少事务提交频率。 - 启用 批量插入模式(如 MySQL 的
rewriteBatchedStatements=true
)。
- 在
- 索引优化:
-- 同步前禁用索引(以 MySQL 为例) ALTER TABLE target_table DISABLE KEYS; -- 同步完成后重建索引 ALTER TABLE target_table ENABLE KEYS;
- 并行处理:
- 多线程:在转换属性中设置
Nr of copies
为 5~10(根据资源调整)。 - 分布式集群:通过 Carte 服务器 部署多个节点并行执行。
- 多线程:在转换属性中设置
- 分页读取:
-
性能对比:
方法 数据量(1亿条) 耗时(小时) 资源占用 单线程逐行插入 1亿 12+ 低(单线程) 分页+批量提交 1亿 3~5 中(I/O密集) 并行分片+集群 1亿 1~2 高(多节点) -
注意事项:
- 分页时需按主键排序,避免数据错乱。
- 监控数据库连接池,防止并发过高导致连接耗尽。
参考来源:
亿级数据同步实战 |
Kettle性能调优指南
5. Kettle 作业前一天成功,第二天失败,可能原因有哪些?
答案:
常见原因:
- 数据变更:
- 源表新增字段、修改约束或数据类型。
- 示例:
ALTER TABLE source_table ADD COLUMN new_column INT;
导致字段映射失败。
- 资源竞争:
- 目标表被其他进程锁定(如未提交的事务持有排它锁)。
- 排查命令:
-- MySQL 查看锁状态 SHOW OPEN TABLES WHERE In_use > 0; -- SQL Server 查看阻塞进程 EXEC sp_who2;
- 环境问题:
- 数据库连接池满(如连接泄漏未释放)。
- 磁盘空间不足或权限变更。
- 调度依赖:
- 上游作业未完成或输出文件未生成。
排查步骤:
- 查看作业日志:
- 定位失败步骤及错误描述(如
ERROR: Column 'new_column' not found
)。
- 定位失败步骤及错误描述(如
- 验证数据源:
- 检查源表结构和数据是否符合预期:
-- 对比元数据 DESC source_table; SELECT COUNT(*) FROM source_table WHERE update_time > '${LAST_RUN_TIME}';
- 检查源表结构和数据是否符合预期:
- 监控资源:
- 使用
top
(Linux)或任务管理器(Windows)检查 CPU/内存占用。 - 查询数据库连接数:
-- MySQL 查看连接数 SHOW STATUS LIKE 'Threads_connected';
- 使用
- 重跑测试:
- 手动执行作业,观察是否可复现问题。
修复方案:
- 紧急处理:
- 终止持有锁的进程:
-- MySQL 终止进程 KILL [process_id];
- 清理磁盘空间或扩容。
- 终止持有锁的进程:
- 长期优化:
- 添加前置检查步骤(如
检查表是否存在
、验证字段映射
)。
- 添加前置检查步骤(如
参考来源:
Kettle 作业失败排查指南 |
数据库锁机制详解