提高Kettle的MySQL写入速度

提升MySQL批量插入性能

本文mysql数据库安装在树莓派上

1 适当加大defaultFetchSize能提高ETL速度,大概10%

2 修改参数useCompression=true树莓派插入性能暴涨10倍

下文是转载内容

使用Kettle的初期,一般只是关注Tranaction如何实现功能,对连接参数可以说基本不关注,其实这里面隐含一些性能问题,如果不熟悉这些性能参数,要想提高性能还真的不容易。

参考1:http://julienhofstede.blogspot.nl/2014/02/increase-mysql-output-to-80k-rowssecond.html
参考2:http://forums.pentaho.com/showthread.php?142217-Table-Output-Performance-MySQL#9

通过在要插入mysql的数据库连接参数中配置以下参数,就可以大量提高mysql数据批量插入的速度:

1、这是因为在数据库连接参数中配置了以下两个MySQL特定选项:

useServerPrepStmts = false
rewriteBatchedStatements = true

将会使大批量单条插入语句:

INSERT INTO t (c1,c2) VALUES ('One',1);
INSERT INTO t (c1,c2) VALUES ('Two',2);
INSERT INTO t (c1,c2) VALUES ('Three',3);

改写成真正的批量插入语句:

INSERT INTO t (c1,c2) VALUES ('One',1),('Two',2),('Three',3);

2、通过设置MySQL如下连接参数:
useCompression=true
树莓派插入性能暴涨10倍

可以实现压缩传输,优化客户端和MySQL服务器之间的通信性能。

    [Python,SQL,ETL]交流群 164142295


### 优化 Kettle 数据传输性能的最佳实践 #### 1. 数据库连接池配置 Kettle 的数据库连接是一个步骤内控制单个数据库连接。为了提高性能,可以启用数据库连接池。在创建数据库连接时,进入 **Pooling** 选项卡,指定最大连接数和初始连接数。这可以显著减少每次建立新连接的开销,从而提高数据传输速度[^4]。 #### 2. 调整 JDBC 参数 通过调整 JDBC 参数,可以优化与数据库的交互效率: - `rewriteBatchedStatements=true`:启用批处理语句重写功能,提升批量插入的性能。 - `useServerPrepStmts=false`:禁用服务器端预编译语句,减少服务器负载。 - `useCursorFetch=true`:启用游标分页读取,避免一次性加载大量数据到内存中。 - `defaultFetchSize=5000`:设置默认的每批次读取行数,根据系统内存大小调整此值[^2]。 #### 3. 调优 JVM 内存参数 合理配置 JVM 内存参数对 Kettle 的性能至关重要: - `-Xms` 和 `-Xmx`:确保 `-Xms` 不大于 `-Xmx`。当系统内存为 4GB 时,建议将 `-Xmx` 设置为不超过 1GB;对于 8GB 或更高内存的系统,需使用 64 位 JDK,并可将 `-Xmx` 设置为 2GB 或更高。但不要超过服务器物理内存的 2/3[^3]。 ```bash java -Xms512m -Xmx2g -jar kettle.jar ``` #### 4. MySQL 数据库调优 针对 MySQL 数据库,可以通过以下参数进一步提升性能: - `bulk_insert_buffer_size=1073741824`:增加批量插入缓冲区大小。 - `innodb_buffer_pool_size=34359738368`:增大 InnoDB 缓冲池,以缓存更多数据。 - `innodb_flush_log_at_trx_commit=0`:降低事务提交频率,提升写入速度。 - `max_allowed_packet=1073741824`:增加允许的最大包大小。 - `concurrent_insert=AUTO`:支持并发插入操作。 - `innodb_autoinc_lock_mode=2`:启用宽松的自增锁模式,减少锁冲突[^3]。 #### 5. 使用 Result Streaming Cursor 如果遇到内存不足问题,可以启用 `Use Result Streaming Cursor`。这种方式会将数据分批次读取,而不是一次性加载到内存中。虽然会稍微降低效率,但能有效避免内存溢出。同时,可以通过设置 `defaultFetchSize` 来控制每批次读取的数据量。对于内存较大的系统,可以将 `defaultFetchSize` 设置得更大一些[^5]。 #### 6. 增加并行度 Kettle 支持多线程并行处理。可以通过以下方式提升并行度: - 在转换中使用多个副本(Copy)来并行执行相同的操作。 - 配置步骤的并发执行选项,例如设置 `Number of copies to start` 参数。 ```python # 示例:设置步骤并发数 step.setCopies(4) ``` #### 7. 减少不必要的数据处理 尽量减少数据传输过程中不必要的操作,例如: - 避免在数据流中进行复杂计算或转换。 - 如果可能,直接从源表中提取所需字段,而不是提取所有字段后再过滤。 #### 8. 网络超时设置 为了避免长时间运行任务因网络超时导致失败,可以调整 MySQL 的 `net_write_timeout` 参数。默认值为 60 秒,建议将其设置为更长的时间,例如 30 分钟[^5]。 ```sql SET GLOBAL net_write_timeout = 1800; ``` --- ###
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值