之前写过mysql导入千万数据的几种方法,参考文章mysql千万级数据量插入的几种方案耗时,看完就知道如何选择
现在再讲讲第三方ETL工具kettle,毕竟这工具在企b L w F 9业中也是比较常用的数据处理工具。
优化配置后,效率也挺高
环境准备
在虚拟机中安装好mysql8.0.19,存储引擎选择innoDB,并新增一[ m N |个数据库,并创建t_user表Z L m b h #,为简单起见,就2个字段,id和name;为减少网络可能存在问题。不需要建立索引u | 4 9 ^,毕竟导入大数据,有索引的话,k D 6 h M =还需而外维护,那性能更慢。
create table t_user(id inC O lt, nz o ~ M B g *ame varchar(20));
可到官网下载KETTLE,国内网站只更新到8.0,我下了最新版本《pdi-ce-9.0.0.0-423.zip》,使用方法一样,解压就能用,当然它是java编写的,所以需要jdk支持,测试过,只支持jdk1.8,jdk11以: 9 9 m 2 & Y上不支持M R K D。所以我x - z :改了我本机的jdk环境。
具体操作
- kettle可以放在某个本机目录下,然后解压如图所示
kettle启y H X A $ 4 % B动,windowK 6 ~ t + y M n Ss下执行spoon.bat,mac下执行spoon.sh,spoon是kettle的图形化界面。
我这是mac机器,所以执行以下命令
./spoon.sh
正常? z E G k c q的话就能看到启动页面
- 新建7 7 !一个转换。
在输入选项里面选择文本输入,文本输入可以理解为数据源,把这个数据源导入到mysql当中,文本文件数据类似下图,有1000万条数据,我是用程序自动生成。简单起见,只有id和name字段。
拖拽文本输3 1 g m V入控件,并做一些简单配置,因为我这tX C R N b n S qxt文件用了逗号分隔,所以只要7 K : v再内容选项中P 0 j d设置分隔符,其余保持默认就好了
在字段选项生成字段
- 新增一个表输出,此项就是需要把数据导入的目标。因为我们需要导入到v = M p b mmysql当中,所以需要把me Z d p % V o hysqlV -驱动导入到kettle的安装目录的lib包下,需要重启kettle。
配$ z + A K置数据源,选择mysql,配置比较简单
最后,在文本输~ Z - @ a L入和表输出之间建立一个关联关系,有个专门的术语-跳,表示数据的流向关系,从文本获取数据源,传到数据库表中a W 2。大概的配置就完成了,之后再执行前,做一些优化工作,提高性能。
优化建议
在db连接选! z C 3 z ? _ ~项中配置参数,目的是使用批量插入的方式,并且利用压缩数据方式,提高传递到服务器的效率
useServerPrepStmts=false
rewriteBm d @ R 4 r HatchedStatements=true
useCompressi3 * _ K { Hon=true
因为是大批量数据迁移,d I O 0 t 5 c ;主要影响抽取速度的是表输出,因此目标数据数据库我开了10个线程进行写入。这里注意,我文本输入1000万数据都在一个K 9 Q c V I f l文本中,不需要开线程,否则会重复读取数据,当然可以F f f { R %建立多个输入,这样可以重复利用cpu。
这样就可以执行数据导; k H a ^ l f入了。
最终结果每秒读取11万条数据,最终完成1000万数据导入,2分钟不到。效率同mysqlimport命令,当然理论来说,jdbc效率是没有原生导入命令O - z - ? E高的,所以不要指望kettle按秒来导入。